自定义TextView-显示一串五颜六色的字符串
自定义TextView-显示一串五颜六色的字符串
android的TextView控件是用来显示字符串的,我们为字符设置颜色的时候只能对整个字符串设置颜色,比如textview.setTextColor(Color.Red),那么整个字符串都是红色的。如果我们想为字符串中的某些字符设置颜色,怎么办呢,原生android没有提供先关的API,我们只能自己自定义TextView了。思路如下:
1、当然要重写onDraw函数了,这就是套路了。
2、显示文字调用的是canvas.drawText(String text,float x, float y, Paint paint),(x,y)表示的真正画字的坐标原点,x和y的取值是相对于TextView的左上角的,y的值就是baseline。
3、我是一个字符一个字符的去画的,画每个字符之前为paint设置好颜色,剩下的重点就是如何设置每个字符的基准坐标,首先是y是不变的,要确定x的值,就要确定以显示过的字符的最小宽度,这里用到了paint. getTextBounds方法,这个方法可以返回要显示字符的所需要的最小矩形,进而我们就得到了矩形的宽度width,把x的值加width就ok了。
下面上代码:
public classMyTextView extendsTextView{
private StringTAG= "MyTextView";
private Paint mPaint;
private Context mContext;
private int[] colors= {Color.RED,Color.BLACK,Color.BLUE,Color.GRAY};
public MyTextView(Contextcontext,AttributeSet attrs) {
super(context,attrs);
mContext =context;
mPaint =new Paint();
}
@Override
protected void onDraw(Canvas canvas) {
//super.onDraw(canvas);
Log.d(TAG,"onDraw");
String text = "test";
char[] chars = text.toCharArray();
mPaint.setAntiAlias(true);
mPaint.setTextSize(DensityUtil.dip2px(mContext,18));
int width = 0;
for(inti = 0;i <4;i++)
{
mPaint.setColor(colors[i]);
canvas.drawText(chars[i]+"",width+10,200,mPaint);
Rect rect = newRect();
mPaint.getTextBounds(chars[i]+"",0,1,rect);
width += rect.width()+10;
}
}
}
运行截图如下:
注意:就是如果选取的基准点(x,y)不在TextView之内,字符是显示不出来的。