Metin ölçümü ve ölçeklenmiş tuvallerle uğraşıyorum.Ölçeklendirilmiş tuval üzerinde ölçüm metni
Kanvas ölçeklenmediğinde, getTextBounds ve measureText doğru sonuçlar verir. Bununla birlikte, kanvas ölçeklendiğinde, her iki yöntem de basılı metnin gerçek boyutuna uyan sonuçlar vermez. ölçekleme = Aşağıdaki çıktıyı almak 0.5 için
final float scaling = 0.51f;
final int fontSize = 50;
canvas.scale(scaling, scaling);
font = Typeface.create("Arial", Typeface.NORMAL);
Paint paint = new Paint();
paint.setColor(0xff4444ff);
paint.setTypeface(font);
paint.setTextSize(fontSize);
paint.setAntiAlias(true);
int x = 10;
int y = 100;
final String text = "Lorem ipsum dolor sit amet, consectetur adipisici elit...";
canvas.drawText(text, x, y, paint);
// draw border using getTextBounds
paint.setColor(0xffff0000);
paint.setStyle(Paint.Style.STROKE);
paint.setTypeface(font);
paint.setTextSize(fontSize);
Rect bounds = new Rect();
paint.getTextBounds(text, 0, text.length(), bounds);
bounds.offset(x, y);
paint.setColor(0x80ffff00);
canvas.drawRect(bounds, paint);
// draw border using measureText
float w = paint.measureText(text);
bounds.left = x;
bounds.right = (int) Math.ceil(bounds.left + w);
bounds.top -= 10;
bounds.bottom += 10;
paint.setColor(0x8000ffff);
paint.setPathEffect(new DashPathEffect(new float[] { 10, 10 }, 0));
canvas.drawRect(bounds, paint);
: ölçekleme için
= 0,51 aşağıdaki sonuç aşağıdaki onDraw yöntemle Görünüm bir alt sınıfını oluşturduk test için
gösterildi:
Sarı katı kenarlık, getTextBounds'tan gelen recti işaretler, kesikli cyan rect, teslim edilen genişlik kullanılarak oluşturulur om measureText.
Gördüğünüz gibi, ölçekleme = 0,5 olan metin ölçülen boyutlardan daha küçüktür ve ölçekleme = 0,51 ile çizilmiş metin ölçülen boyuttan çok daha büyüktür.
Herhangi bir yardım için teşekkür ederiz!
private Display GetDisplay()
{
return this.GetSystemService(Android.Content.Context.WindowService).JavaCast<Android.Views.IWindowManager>().DefaultDisplay;
}
Java'nın en aynı yöntemdir:
f.DrawingFont bir Androdid.Text.TextPaint GetDisplaypublic override System.Drawing.SizeF MeasureString(MyFont f, string text)
{
Rect r = new Rect();
f.DrawingFont.GetTextBounds(text, 0, text.Length, r);
//Manual scaling using DisplayMetrics due to Android
//issues for compatibility with older versions
Android.Util.DisplayMetrics metrics = new Android.Util.DisplayMetrics();
GetDisplay.GetMetrics(metrics);
return new System.Drawing.SizeF(r.Width(), r.Height() * metrics.Density);
}
olduğunda geçerli: burada gösterildiği gibi Mono for Android Kullanılması
Sen düzeltme, hep bunun uygulanır ve Tuval bir ölçekleme değerini telafi etmiyor? Aslında, sınırlayıcı rect'in hesaplanmasının yanlış olduğunu düşünmüyorum, ancak yazı tipi oluşturma kodu, tuval ölçeklendirmesine göre uygun yazı tipi boyutunu seçmiyor ... –
Evet, her zaman ölçeklendirme olmadan metin boyutlarının gerekli olduğu hesaplandı tuval. –
Bunu daha çok kullandığını belirtmek için kullanılan metin, çoğunlukla metinde metin yerleştirmek için kullanılır, kesin boyutları ve konumu bilmek gereklidir. –