2014-02-27 34 views
5

Ich versuche, einen Text in Bitmap horizontal und vertikal auszurichten, ich lese mehrere Post, aber ich kann keine Lösung finden. Die Bitmap ist ein einfaches Bild eines Kreises. Ich poste meinen aktuellen Code. Mehr oder weniger funktioniert es, aber der Text ist nicht perfekt zentriert, es scheint ein bisschen links und ein bisschen oben, ich meine, es scheint, ich muss einen Offset hinzufügen, um es nach rechts und nach unten zu bewegen.Center Text vertikal und horizontal mit Leinwand

public static float convertDpToPixel(float dp, Context context) { 
    Resources resources = context.getResources(); 
    DisplayMetrics metrics = resources.getDisplayMetrics(); 
    float px = dp * (metrics.densityDpi/160f); 
    return px; 
}  

v = (ImageView) findViewById(R.id.imageView1); 
Bitmap b = BitmapFactory.decodeResource(getResources(), 
       R.drawable.marker).copy(Bitmap.Config.ARGB_8888, true); 
Canvas canvas = new Canvas(b); 
Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
textPaint.setARGB(255, 0, 0, 0); 
textPaint.setTextAlign(Align.CENTER); 
textPaint.setTypeface(Typeface.DEFAULT_BOLD); 
textPaint.setTextSize(convertDpToPixel(9, this)); 

String text = "30"; 
int xPos = (canvas.getWidth()/2); 
int yPos = (int) ((canvas.getHeight()/2) - ((textPaint.descent() + 
       textPaint.ascent())/2)) ; 

canvas.drawText(text, xPos, yPos, textPaint); 
v.setImageBitmap(b); 

Antwort

21

Das Problem ist, dass Sie derzeit nicht die Breite und Höhe des Textes berücksichtigen. Wenn dein Text "Hallo" oder "DIESE STRING" ist, behandelst du es einfach gleich, das ist falsch.

Sie müssen die Breite und Höhe des Textes berechnen und dann die Textposition um die Hälfte dieser Abstände verschieben.

Zum Beispiel senkrecht zum Zentrum:

Rect r = new Rect(); 
paint.getTextBounds(text, 0, text.length(), r); 
yPos += (Math.abs(r.height()))/2; // or maybe -= instead of +=, depends on your coordinates 

Ich hoffe, das Sie in die richtige Richtung führt.

BEARBEITEN: Der Ursprung wird basierend auf der Ausrichtung in der Farbe interpretiert. Sie verwenden

textPaint.setTextAlign(Align.CENTER); 

So brauchen Sie vermutlich nicht horizontal keine Berechnungen zur Mitte zu tun (was bedeutet, dass für den horizontalen Ursprung Sie den Code verwenden, sollten Sie bereits).

int xPos = (canvas.getWidth()/2); 
+0

Ein bisschen besser jetzt der Code: int xPos = (canvas.getWidth()/2) - ((r.width())/2); int yPos = (canvas.getHeight()/2) + ((r.height())/2); aber das x ist nicht mehr ausgerichtet, jetzt habe ich den Text auf der linken Seite verschoben. – greywolf82

+0

Siehe bearbeitete Antwort – Merlevede

+0

Ah ok, jetzt funktioniert es, danke !!!!!!! – greywolf82

-1

Für horizontale Position: xPos = (canvas.getWidth()/2) - (widthofthetext)/2;

Für vertikal: yPos = (canvas.getHeight()/2) - (heightofthetext)/2;

Ich poste es vom Telefon und sorry für ungetestete Antwort. Lass es mich wissen, wenn es funktioniert.

+0

Bitte beachten Sie meinen Kommentar zur vorherigen Antwort. – greywolf82

13

Wie @Merlevede sagt, wenn Sie die textPaint zu CENTER ausrichten, müssen Sie genau das tun:

canvas.drawText(
    text, 
    canvas.getWidth()/2, 
    ((canvas.getHeight()/2) - ((textPaint.descent() + textPaint.ascent())/2)), 
    textPaint 
); 
+0

Für eine einfache und funktionierende Lösung – martyglaubitz

Verwandte Themen