Neye ihtiyacınız olduğuna bağlı olarak yüksekliği ölçmenin farklı yolları vardır.
Az miktarda sabit metni tam olarak ortalamak gibi bir şey yapıyorsanız, muhtemelen istersiniz getTextBounds
. Sınırlayıcı dikdörtgeni şu şekilde elde edebilirsiniz
Rect bounds = new Rect();
mTextPaint.getTextBounds(mText, 0, mText.length(), bounds);
int height = bounds.height();
Aşağıdaki resimlerde de görebileceğiniz gibi, farklı dizeler farklı yükseklikler verecektir (kırmızı ile gösterilmiştir).
Bu farklı yükseklikler, metin ne olursa olsun sabit bir yüksekliğe ihtiyaç duyduğunuzda bazı durumlarda bir dezavantaj olabilir. Sonraki bölüme bakın.
Yazı tipi ölçülerinden yazı tipinin yüksekliğini hesaplayabilirsiniz. Yükseklik her zaman aynıdır çünkü belirli bir metin dizesinden değil yazı tipinden elde edilir.
Paint.FontMetrics fm = mTextPaint.getFontMetrics();
float height = fm.descent - fm.ascent;
Taban çizgisi, metnin üzerine oturduğu çizgidir. İniş genellikle bir karakterin çizginin altına en fazla gideceği yerdir ve yükselme genellikle bir karakterin çizginin üstüne çıkacağı en uzundur. Yüksekliği elde etmek için yükselişi çıkarmanız gerekir çünkü bu negatif bir değerdir. (Taban çizgisi ekranı büyütür y=0
ve y
küçültür.)
Aşağıdaki resme bakın. Her iki dizenin yükseklikleri 234.375
.
Yalnızca metin yüksekliği yerine satır yüksekliğini istiyorsanız, aşağıdakileri yapabilirsiniz:
float height = fm.bottom - fm.top + fm.leading; // 265.4297
Bunlar bottom
ve top
hattın. Baştaki (satırlar arası boşluk) genellikle sıfırdır, ancak yine de eklemelisiniz.
Yukarıdaki görüntüler bu projeden alınmıştır . Yazı Tipi Metriklerinin nasıl çalıştığını görmek için onunla oynayabilirsiniz.
Çok satırlı metnin yüksekliğini ölçmek için bir StaticLayout
. Bu cevapta biraz detaylı konuştum , ancak bu yüksekliği elde etmenin temel yolu şudur:
String text = "This is some text. This is some text. This is some text. This is some text. This is some text. This is some text.";
TextPaint myTextPaint = new TextPaint();
myTextPaint.setAntiAlias(true);
myTextPaint.setTextSize(16 * getResources().getDisplayMetrics().density);
myTextPaint.setColor(0xFF000000);
int width = 200;
Layout.Alignment alignment = Layout.Alignment.ALIGN_NORMAL;
float spacingMultiplier = 1;
float spacingAddition = 0;
boolean includePadding = false;
StaticLayout myStaticLayout = new StaticLayout(text, myTextPaint, width, alignment, spacingMultiplier, spacingAddition, includePadding);
float height = myStaticLayout.getHeight();