2012-05-15 18 views
25

Bazı arka plan ve metin içeren bir çizim oluşturmak için bir Canvas kullanıyorum. Çizilebilir bir EditText içinde çizilebilir bir bileşik olarak kullanılır.Android canvas drawText metinin y-konumu

Metin, tuvalde bulunan drawText() ile çizilir, ancak bazı durumlarda çizilen metnin y konumuyla ilgili bir sorunum var. Bu durumlarda bazı karakterlerin bölümleri kesilir (bkz. Resim bağlantıları). konumlandırma sorunu olmadan

Özellikleri: konumlandırma sorunu ile

http://i50.tinypic.com/zkpu1l.jpg

karakterler, metin 'g', 'j', 'q', vb .:

http://i45.tinypic.com/vrqxja.jpg

içerir

Aşağıdakileri çoğaltmak için bir kod parçacığı bulabilirsiniz.

Herhangi bir uzman, y konumu için doğru ofsetin nasıl belirleneceğini biliyor mu?

public void writeTestBitmap(String text, String fileName) { 
    // font size 
    float fontSize = new EditText(this.getContext()).getTextSize(); 
    fontSize+=fontSize*0.2f; 
    // paint to write text with 
    Paint paint = new Paint(); 
    paint.setStyle(Style.FILL); 
    paint.setColor(Color.DKGRAY); 
    paint.setAntiAlias(true); 
    paint.setTypeface(Typeface.SERIF); 
    paint.setTextSize((int)fontSize); 
    // min. rect of text 
    Rect textBounds = new Rect(); 
    paint.getTextBounds(text, 0, text.length(), textBounds); 
    // create bitmap for text 
    Bitmap bm = Bitmap.createBitmap(textBounds.width(), textBounds.height(), Bitmap.Config.ARGB_8888); 
    // canvas 
    Canvas canvas = new Canvas(bm); 
    canvas.drawARGB(255, 0, 255, 0);// for visualization 
    // y = ? 
    canvas.drawText(text, 0, textBounds.height(), paint); 

    try { 
     FileOutputStream out = new FileOutputStream(fileName); 
     bm.compress(Bitmap.CompressFormat.JPEG, 100, out); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

cevap

25

Ben o inen karakterler için bu textBounds.bottom = 0. varsaymak muhtemelen bir hata olduğunu düşünüyorum, bu karakterlerin alt parçalarıdır muhtemelen aşağıda 0 (textBounds.bottom demektir> 0). senin textBounds +5 -5 ise

canvas.drawText(text, 0, textBounds.top, paint); //instead of textBounds.height()

ve, y = yükseklik (10) metni çizmek o zaman sadece metnin üst yarısını görürsünüz: Muhtemelen gibi bir şey istiyorum .

canvas.drawText(text, -textBounds.left, -textBounds.top, paint); 

ve onlardan iki koordinatlara yer değiştirme istenen miktarda toplayarak metnin etrafında hareket edebilirsiniz:

+13

Bana doğru yönde işaret ettiğiniz için teşekkür ederiz. canvas.drawText (text, 0, textBounds.height() - textBounds.bottom, paint); çözüm oldu – darksaga

10

Ben sol üst köşesine yakın metin çizmek istiyorum bunu gerektiğine inanıyoruz

canvas.drawText(text, -textBounds.left + yourX, -textBounds.top + yourY, paint); 

bu (en azından benim için) çalışıyor nedeni DrawText() olay x = 0 ve y = 0 metni çizmek nerede getTextBounds() söyler olmasıdır. Dolayısıyla, bu davranışı, Android'de metnin ele alınış şekliyle getirilen yer değiştirmeyi (textBounds.left ve textBounds.top) çıkartarak ortadan kaldırmanız gerekir.

this answer'da bu konu hakkında biraz daha ayrıntılı çalışıyorum.