Tuval üzerine çizilecek metin genişliğini ölçme (Android)


129

Çizmek için kullanılan Paint'e göre drawText () yöntemini kullanarak bir Android tuvalinde çizilecek bir metnin genişliğini (piksel cinsinden) döndüren bir yöntem var mı?

Yanıtlar:


224

20
Teşekkürler işte bu! Neden atladığımı bilmiyorum. Amaç, ekranın ortasına basitçe bir metin çizmekti. Her neyse, metni çizmek için kullanılan Paint üzerinde setTextAlign (Align.CENTER) kullanabileceğimi fark ettim, belirtilen orijini çizilmiş metnin merkezine kaydırır. Teşekkürler.
NioX5199

2
Harika, teşekkürler, Align on the Paint! bunu kim düşünebilirdi ...?
Sanjay Manohar

veya
metin

32
Paint paint = new Paint();
Rect bounds = new Rect();

int text_height = 0;
int text_width = 0;

paint.setTypeface(Typeface.DEFAULT);// your preference here
paint.setTextSize(25);// have this the same as your text size

String text = "Some random text";

paint.getTextBounds(text, 0, text.length(), bounds);

text_height =  bounds.height();
text_width =  bounds.width();

12

Tamamlayıcı cevap

Döndürdüğü genişlik arasında küçük bir fark var Paint.measureTextVePaint.getTextBounds . measureTextdizenin başlangıcını ve sonunu dolduran glifin advanceX değerini içeren bir genişlik döndürür. RectTarafından döndürülen genişlik getTextBoundssınırları olduğu için bu dolgu yok Rectsıkıca metni sarar.

kaynak


2

Aslında metni ölçmenin üç farklı yolu var.

GetTextBounds:

val paint = Paint()
paint.typeface = ResourcesCompat.getFont(context, R.font.kaushanscript)
paint.textSize = 500f
paint.color = Color.argb(255, 3, 221, 252)
val contents = "g"
val rect = Rect()
paint.getTextBounds(contents, 0, 1, rect)
val width = rect.width()

MeasureTextWidth:

val paint = Paint()
paint.typeface = ResourcesCompat.getFont(context, R.font.kaushanscript)
paint.textSize = 500f
paint.color = Color.argb(255, 3, 221, 252)
val contents = "g"
val width = paint.measureText(contents, 0, 1)

Ve getTextWidths:

val paint = Paint()
paint.typeface = ResourcesCompat.getFont(context, R.font.kaushanscript)
paint.textSize = 500f
paint.color = Color.argb(255, 3, 221, 252)
val contents = "g"
val rect = Rect()
val arry = FloatArray(contents.length)
paint.getTextBounds(contents, 0, contents.length, rect)
paint.getTextWidths(contents, 0, contents.length, arry)
val width = ary.sum()

Metni bir sonraki satıra ne zaman kaydıracağınızı belirlemeye çalışıyorsanız getTextWidths öğesinin yararlı olabileceğini unutmayın.

MeasureTextWidth ve getTextWidth eşittir ve başkalarının hakkında gönderi paylaştığı gelişmiş genişliğe sahiptir. Bazıları bu alanı aşırı buluyor. Ancak, bu çok özneldir ve yazı tipine bağlıdır.

Örneğin, ölçü metin sınırlarından gelen genişlik aslında çok küçük görünebilir:

metin sınırları küçük görünüyor

Ancak ek bir metin eklerken bir harfin sınırları normal görünür: metin sınırları ölçmek dizeler için normal görünüyor

Alınan Görüntüler Özel Tuval Çizimi için Android Geliştirici Kılavuzu


1

Ben farklı bir şekilde yaptım:

String finalVal ="Hiren Patel";

Paint paint = new Paint();
paint.setTextSize(40);
Typeface typeface = Typeface.createFromAsset(getAssets(), "Helvetica.ttf");
paint.setTypeface(typeface);
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.FILL);

Rect result = new Rect();
paint.getTextBounds(finalVal, 0, finalVal.length(), result);

Log.i("Text dimensions", "Width: "+result.width()+"-Height: "+result.height());

Umarım bu sana yardımcı olur.


0

MeasureText () ve getTextPath () + computeBounds () yöntemlerini kullandım ve https://github.com/ArminJo/android-blue-display/blob altında bulunabilen sabit boyutlu yazı tipi için tüm metin özniteliklerine sahip bir Excel oluşturdum /master/TextWidth.xlsx . Orada, yükselme vb. Gibi diğer metin özellikleri için basit formüller de bulacaksınız.

Uygulama aynı zamanda fonksiyon drawFontTest () Excel kullanılan ham değerlerinin üretilmesi için Repo de mevcuttur.


0

metin genişliğini elde etmek için "textPaint.getTextSize ()" kullanabilirsiniz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.