Android 如何将居中的多色文本写入画布?
我用一根线在画布上写字Android 如何将居中的多色文本写入画布?,android,android-canvas,Android,Android Canvas,我用一根线在画布上写字 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); } 当我有一个多色的Spann
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()
方法,我一直无法使用该方法。或者有没有其他方法将字符串写入画布,其中一些字母具有不同的颜色?我自己找到了解决方法
您可以计算字符串在画布上绘制后的宽度。然后,您知道在更改颜色后,在何处继续在画布上绘制文本
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);
}
}
}
不确定。但是,每次绘制时创建一个新的绘制对象对您来说不是坏事吗?假设您有一个每毫秒运行一次的更新循环。这可能会导致垃圾收集器出现问题。请注意,如果您在
弧路径
上绘制文本,则需要计算上述代码中的画布宽度
,作为弧路径
直径的一半,如下所示:画布宽度=(((arcPathWidth+arcPathHeight)/2)*Math.PI)/2;
,然后按照上述步骤执行其余操作。