码迷,mamicode.com
首页 > 其他好文 > 详细

对现有的控件进行拓展,以TextView为例

时间:2016-05-10 02:32:49      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:

1.自定义控件有一个方法是在原生控件的基础上进行的拓展,增加新的功能,修改显示的UI等,一般我们可以子啊onDraw()方法中队原生的控件进行的拓展。

2.下面以为textvew的背景增加更多的颜色为例:

如何实现:

当我们自定义的view继承TextView的后,若不重写onDraw()方法,则不会修改TextView的任何效果。
 @Override
    protected void onDraw(Canvas canvas) {
     super.onDraw(canvas);
      }

程序调用的是super.onDraw(canvas);方法来实现原生控件的功能,但我我们可以在调用super.onDraw(canvas)之前和之后实现自己的逻辑,即在系统绘制文字的前后完成操作。

3.在自定义view的构造方法中完成必要的初始化工作。


    // 创建画笔
    private Paint paint1;
    private Paint paint2;
    private Paint paint3;
    private Paint paint4;

    public MyTextView(Context context) {
        this(context, null);
    }

    public MyTextView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public MyTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        // 初始化工作(创建画笔)

        paint1 = new Paint();
        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.GREEN);
        paint3.setStyle(Paint.Style.FILL);

        paint4 = new Paint();
        paint4.setColor(Color.GRAY);
        paint4.setStyle(Paint.Style.FILL);

    }

4.在onDraw()方法中,在super.onDraw(canvas)前绘制几个不同大小的矩形,形成重叠的效果。再让系统调用super.onDraw(canvas)方法完成绘制文字的工作。

 @Override
    protected void onDraw(Canvas canvas) {
        // 绘制文本前的的逻辑
        /**
         * 绘制外层矩形
         * getMeasuredWidth():对View上的内容进行测量后得到的View内容占据的宽度
         * getMeasuredHeight():对View上的内容进行测量后得到的View内容占据的高度
         */
        canvas.drawRect(0,0,getMeasuredWidth(),getMeasuredHeight(),paint1);
        // 第二层矩形
        canvas.drawRect(10, 10, getMeasuredWidth() - 10, getMeasuredHeight() - 10, paint2);
        // 第三层矩形
        canvas.drawRect(20, 20, getMeasuredWidth() - 20, getMeasuredHeight() - 20, paint3);
        // 第四层矩形
        canvas.drawRect(30, 30, getMeasuredWidth() - 30, getMeasuredHeight() - 30, paint4);
        // save:用来保存Canvas的状态。save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作
        canvas.save();
        // 绘制文字前平移(100px,30px)。
        canvas.translate(100, 30);
        // 父类绘制文本
        super.onDraw(canvas);
        // 绘制文本之后的逻辑
        // restore:用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响,
        // 也就是防止translate对后来的绘制有影响。
        canvas.restore();

    }

效果图如下:
技术分享

对现有的控件进行拓展,以TextView为例

标签:

原文地址:http://blog.csdn.net/qq_24304811/article/details/51357441

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!