Android之自定义TextView

来源:互联网 发布:网络大专文凭找工作 编辑:程序博客网 时间:2024/04/28 20:54

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()方法重写,直接设置指定的长宽





1 0
原创粉丝点击