自定义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;
       
}
    }
}

 

运行截图如下:

 自定义TextView-显示一串五颜六色的字符串

注意:就是如果选取的基准点(x,y)不在TextView之内,字符是显示不出来的。