Android'de dize genişliği nasıl elde edilir?


Yanıtlar:


203

getTextBounds(String text, int start, int end, Rect bounds)Bir Paint nesnesinin yöntemini kullanabilirsiniz . Bir tarafından sağlanan boya nesnesini kullanabilir TextViewveya istediğiniz metin görünümüyle kendiniz bir tane oluşturabilirsiniz.

Bir Metin Görünümü kullanarak şunları yapabilirsiniz:

Rect bounds = new Rect();
Paint textPaint = textView.getPaint();
textPaint.getTextBounds(text, 0, text.length(), bounds);
int height = bounds.height();
int width = bounds.width();

5
@Frank: Dize yayılmış bir dizeyse ne olur?
Ashwin

Mükemmel cevap. Bu arada, arama yapılırsa sonuç daha doğru olacaktır textView.setTextSize().
li2


19

Bir metin için iki farklı genişlik ölçüsü vardır. Biri genişlikte çizilen piksel sayısı, diğeri ise metin çizildikten sonra imlecin ilerletilmesi gereken 'piksel' sayısıdır.

paint.measureText ve paint.getTextWidths , verilen dizeyi çizdikten sonra imlecin ilerletilmesi gereken piksel sayısını (float olarak) döndürür. Boyanan piksel sayısı için diğer cevapta belirtildiği gibi paint.getTextBounds'u kullanın. Buna yazı tipinin 'İlerlemesi' denildiğine inanıyorum.

Bazı yazı tipleri için bu iki ölçü farklıdır (çok), örneğin Black Chancery yazı tipi diğer harfleri geçen (üst üste binen) harflere sahiptir - büyük 'L'ye bakın. Pikselleri boyamak için diğer yanıtta belirtildiği gibi paint.getTextBounds'u kullanın .


6

Genişliği şu şekilde ölçtüm:

String str ="Hiren Patel";

Paint paint = new Paint();
paint.setTextSize(20);
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(str, 0, str.length(), result);

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

Bu sana yardımcı olur.


3

Büyük olasılıkla, belirli bir yazı tipine sahip belirli bir metin dizesi için boyanmış boyutları bilmek istersiniz (yani belirli Typefacebir BOLD_ITALIC stiline sahip "sans-serif" yazı tipi ailesi ve sp veya px cinsinden belirli bir boyut).

Tamamen şişirmek yerine, daha TextViewdüşük seviyeye geçebilir ve tek satırlık metin Paintiçin doğrudan bir nesneyle çalışabilirsiniz , örneğin:

// Maybe you want to construct a (possibly static) member for repeated computations
Paint paint = new Paint();

// You can load a font family from an asset, and then pick a specific style:
//Typeface plain = Typeface.createFromAsset(assetManager, pathToFont); 
//Typeface bold = Typeface.create(plain, Typeface.DEFAULT_BOLD);
// Or just reference a system font:
paint.setTypeface(Typeface.create("sans-serif",Typeface.BOLD));

// Don't forget to specify your target font size. You can load from a resource:
//float scaledSizeInPixels = context.getResources().getDimensionPixelSize(R.dimen.mediumFontSize);
// Or just compute it fully in code:
int spSize = 18;
float scaledSizeInPixels = TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_SP,
            spSize,
            context.getResources().getDisplayMetrics());
paint.setTextSize(scaledSizeInPixels);

// Now compute!
Rect bounds = new Rect();
String myString = "Some string to measure";
paint.getTextBounds(myString, 0, myString.length(), bounds);
Log.d(TAG, "width: " + bounds.width() + " height: " + bounds.height());



İçin çoklu-hattı veya yayılmış metin ( SpannedString), bir kullanmayı StaticLayouthangi genişliği sağlamak ve yüksekliği elde. Metni ölçmek ve bunu özel bir görünümde bir tuvale çizmekle ilgili çok ayrıntılı bir yanıt için bkz .: https://stackoverflow.com/a/41779935/954643

Ayrıca, @ arberg'in aşağıdaki yanıtını, ilerletme genişliğine karşı boyanmış pikseller hakkında ("verilen dizgiyi çizdikten sonra imlecin ilerletilmesi gereken piksel sayısı (float olarak)"), bununla ilgilenmeniz gerektiğinde dikkate almaya değer.


2

Statik sınıf kullanımıyla çizilmiş bir metnin ( ) tam genişliğini elde etmenin daha iyi bir yolunu (mevcut kabul edilen cevaptan daha çok yönlü) paylaşmak istiyorum :StringStaticLayout

StaticLayout.getDesiredWidth(text, textPaint))

Bu yöntem, çok textView.getTextBounds()satırlı tek bir satırın genişliğini hesaplayabileceğinizden TextViewveya TextViewbaşlamak için kullanamayacağınızdan (örneğin özel bir Viewuygulamada) daha doğrudur .

Bu yol benzer textPaint.measureText(text), ancak nadir durumlarda daha doğru görünmektedir.

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.