2010-09-10 13 views
6

Piszę do płótna z wątku.Jak pisać wyśrodkowany tekst wielobarwny na płótnie?

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); 
} 

Mój start problem, gdy mam wielu kolorowych SpannableStringBuilder którym chcę pisać na płótnie, a nie mam pojęcia jak to zrobić. SpannableStringBuilder ma metodę drawText(), której nie mogłem użyć. Czy jest jakiś inny sposób na napisanie łańcucha na kanwie, gdzie niektóre litery mają inny kolor?

Odpowiedz

18

Sam znalazłem rozwiązanie tego.

Możesz obliczyć szerokość, jaką będzie mieć ciąg po narysowaniu na płótnie. Wtedy wiesz, gdzie też nadal malować tekst na płótnie po zmianie koloru.

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

Wielkie dzięki! – Dested

+2

Nie jestem pewien. Ale czy to nie jest złe, aby za każdym razem rysować nowy obiekt Paint? powiedz jeśli masz pętlę aktualizacji, która uruchamia każde MS. Może to powodować problemy dla Garbage Collectora. – TastyLemons

Powiązane problemy