TextView是继承View的,在View的基础上通过onDraw()来绘画,自定义TextView也就是实现改变TextView的大小和文字的显示方式以及填充等
先来实现一个简单的给TextView加边框,在onDraw()中书写,会自动调用onDraw()方法
package com.example.administrator.listviewtop;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.TextView;
/**
* Created by Administrator on 2016/9/11.
*/
public class TestView extends TextView {
private Paint paint1,paint2,paint3;
public TestView(Context context) {
super(context);
init();
}
public TestView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public TestView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init(){
//新建画笔
paint1=new Paint();
//设置颜色,这个里面的getColor是被弃用的,用下面的
paint1.setColor(getResources().getColor(android.R.color.holo_blue_light));
//样式为全部填充
paint1.setStyle(Paint.Style.FILL);
paint2 =new Paint();
paint2.setColor(Color.YELLOW);
paint2.setStyle(Paint.Style.FILL);
paint3=new Paint();
paint3.setColor(Color.WHITE);
paint3.setStyle(Paint.Style.FILL);
}
@Override
protected void onDraw(Canvas canvas) {
//画TextView的外边框
canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), paint1);
//画TextView的内边框
canvas.drawRect(10, 10, getMeasuredWidth() - 10, getMeasuredHeight() - 10, paint2);
//只是想画个边框,使用填充后导致整个屏幕都是
canvas.drawRect(20,20,getMeasuredWidth()-20,getMeasuredHeight()-20,paint3);
//保存当前的画板
canvas.save();
//平移10像素,在父类的onDraw前
canvas.translate(10, 0);
//TextView父类自己的逻辑
super.onDraw(canvas);
//将原来的画板取出
canvas.restore();
}
//效果就是设置TextView的长度
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(200,100);
}
}
说一下这个onDraw()方法,我用了三个画笔,都使用的是FILL,本来想使用STROKE,但是线太细,没有填充的效果,使用FILL,连里层的也变了,于是就在里层加了一个画笔,将其画成白色,这样就显示出了两个边框的效果,而且内层为白色
其中有一个方法canvas.translate(10,0)是平移操作,为了不让文字显示和边框重叠;也可以在布局中将gravity设置为center,就不用使用translate了
还有一个问题,就是这些自定义操作是在super.onDraw()前呢,还是后面的问题
于是我将super.onDraw()前面的代码全部放到后面,效果中没有显示在布局中设置的text文本,其中的逻辑是,父类先执行布局文件的操作,包括文本的显示,然后自定义的操作使用的是FILL,将父类的实现给覆盖了,因此文本信息不会显示
由上面的说来,自定义的操作一般放在super.onDraw()前面
上面的onMeasure()方法重写,直接设置指定的长宽