2010-09-10 4 views
6

Я пишу на холст из нити.Как написать центрированный многоцветный текст на холст?

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

Мой старт проблема, когда у меня есть разноцветные SpannableStringBuilder, которые я хочу написать на холсте, и я понятия не имею, как это сделать. SpannableStringBuilder имеет метод drawText(), который я не смог использовать. Или есть какой-то другой способ написать строку на холсте, где некоторые буквы имеют другой цвет?

ответ

18

Я сам нашел решение.

Вы можете вычислить ширину, которую будет иметь строка после рисования на холсте. Затем вы знаете, где также продолжать рисовать текст на холсте после изменения цвета.

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

Спасибо, связка! – Dested

+2

Не уверен. Но неужели вам не нужно создавать новый объект Paint каждый раз, когда вы рисуете? скажем, если у вас был цикл обновления, который запускает каждую MS. Это может вызвать проблемы для сборщика мусора. – TastyLemons

Смежные вопросы