2010-09-10 47 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