2011-10-10 42 views
7

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 canvas scaling 0.5

= 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: canvas scaling 0.51

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 GetDisplay
public 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ı

cevap

4

Tamam, sorunu nasıl aşacağını öğrendim.

Sorun, Paint'in Canvas ölçekleme hakkında bilmediği sorunudur. Bu nedenle measureText ve getTextBounds ölçeklendirilmemiş sonucu sunar. Ancak yazı tipi boyutu doğrusal olarak ölçeklenmediğinden (çizilen rect), bu etkiyi el ile yapmanız gerekir.

Yani çözüm olacaktır:

// paint the text as usual 
Paint paint = new Paint(); 
paint.setTypeface(font); 
paint.setTextSize(fontSize); 
canvas.drawText(text, x, y, paint); 


// measure the text using scaled font size and correct the scaled value afterwards 
Paint paint = new Paint(); 
paint.setTypeface(font); 
paint.setTextSize(fontSize * scaling); 
float w = paint.measureText(text)/scaling; 
0

Ben ekran ölçümlerini kullanmak zorunda kaldı:

private Display getDisplay() { 
    return ((WindowManager) getContext().getSystemService(
      Context.WINDOW_SERVICE)).getDefaultDisplay(); 
} 
+0

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 ... –

+0

Evet, her zaman ölçeklendirme olmadan metin boyutlarının gerekli olduğu hesaplandı tuval. –

+0

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. –