2010-09-10 16 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 2012-01-05 00:07:12

+2

不确定。但是,每次绘制时创建一个新的Paint对象对你来说都不坏吗?说你是否有一个运行每个MS的更新循环。这可能会导致垃圾收集器出现问题。 – TastyLemons 2014-02-27 09:31:17