2010-09-10 15 views
6

Estoy escribiendo en un lienzo de un hilo.¿Cómo escribir texto centrado en varios colores en un lienzo?

public void draw(Canvas canvas) { 
    Paint p = new Paint(); 
    p.setAntiAlias(true); 
    p.setTextSize(30); 
    p.setColor(Color.WHITE); 
    p.setTextAlign(Paint.Align.CENTER); 

    canvas.drawText("Centered", xCentre, yCentre, p); 
} 

Mi salida problema cuando tengo un multi color SpannableStringBuilder que quiero escribir en el lienzo, y no tengo ni idea de cómo hacer esto. SpannableStringBuilder tiene un método drawText() que no he podido usar. ¿O hay algún otro método para escribir una cadena en un lienzo donde algunas letras tienen un color diferente?

Respuesta

18

Encontré la solución yo mismo.

Puede calcular el ancho que tendrá la cadena después de dibujarse en el lienzo. Entonces sabrá dónde también continuará pintando texto en el lienzo después de haber cambiado de color.

package com.example; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.*; 
import android.os.Bundle; 
import android.view.View; 

public class MyActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(new SampleView(this)); 
    } 

    private static class SampleView extends View { 
    public SampleView(Context context) { 
     super(context); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     canvas.drawColor(Color.WHITE); 

     String blackText = "black"; 
     String redText = " red"; 

     Paint mPaint = new Paint(); 
     mPaint.setAntiAlias(true); 
     mPaint.setTextSize(30); 
     mPaint.setTypeface(Typeface.create(Typeface.SERIF, 
      Typeface.ITALIC)); 

     float canvasWidth = canvas.getWidth(); 
     float blackTextWidth = mPaint.measureText(blackText); 
     float sentenceWidth = mPaint.measureText(blackText + redText); 
     float startPositionX = (canvasWidth - sentenceWidth)/2; 

     mPaint.setTextAlign(Paint.Align.LEFT); 
     canvas.translate(0, 80); 

     mPaint.setColor(Color.BLACK); 
     canvas.drawText(blackText, startPositionX, 0, mPaint); 
     mPaint.setColor(Color.RED); 
     canvas.drawText(redText, startPositionX + blackTextWidth, 0,mPaint); 

    } 
    } 
} 
+0

Thanks a bunch! – Dested

+2

No estoy seguro. ¿Pero no es malo para ti crear un nuevo objeto Paint cada vez que dibujas? decir si tenía un bucle de actualización que ejecuta cada MS. Esto podría causar problemas para el recolector de basura. – TastyLemons

Cuestiones relacionadas