Android View---自定义View

重要的回调方法

首先,我们应该了解一下比较重要的回调方法:

  • onFinishInflate() 从XML加载组件后回调
  • onSizeChanged() 组件大小改变后回调
  • onMeasure(int widthMeasureSpec, int heightMeasureSpec)回调该方法进行测量
  • onLayout(boolean changed, int left, int top, int right, int bottom)回调该方法确定显示位置
  • onTouchEvent(MotionEvent event) 监听到触摸事件时的回调

以上就是集中常用的回调的方法.

接下来做一个实验:

实验一: 自定义一个带边框的TextView

public class CustomTextView extends TextView {
    //初始化画笔
    Paint mPaint1;
    Paint mPaint2;
    public CustomTextView(Context context) {
        super(context);
    }

    public CustomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }


    @Override
    protected void onDraw(Canvas canvas) {
        mPaint1=new Paint();
        mPaint1.setColor(Color.GREEN);
        //STROKE 表示只画一条线
        //Fill表示填满整个View
        mPaint1.setStyle(Paint.Style.STROKE);
        mPaint2=new Paint();
        mPaint2.setColor(getResources().getColor(android.R.color.holo_blue_light));
        mPaint2.setStyle(Paint.Style.FILL_AND_STROKE);
        //绘制外层矩形
        canvas.drawRect(0,0,getMeasuredWidth(),getMeasuredHeight(),mPaint1);
        //绘制内层矩形
        canvas.drawRect(10,10,getMeasuredWidth()-10,getMeasuredHeight()-10,mPaint2);
        canvas.save();//保存画布的状态
        //绘制文字前平移10个像素
        canvas.translate(10,0);
        //在回调父类的方法前实现自己的逻辑,对TextView来说就是在绘制文本内容前
        super.onDraw(canvas);
        //在回调父类的方法前实现自己的逻辑,对TextView来说就是在绘制文本内容后

    }
}

实验二:自定义一个酷炫的TextView

public class CoolTextView extends TextView {
    private int mViewWidth;
    //初始化画笔
    private Paint mPaint;
    //渲染器
    private LinearGradient mLinearGradient;
    //矩阵
    private Matrix matrix;

    private int mTranslate;



    public CoolTextView(Context context) {
        super(context);
    }

    public CoolTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        mPaint=new Paint();
        if (mViewWidth==0){
            mViewWidth=getMeasuredWidth();
            if (mViewWidth>0){
                //获取当前TextView的画笔
                mPaint=getPaint();
                //渲染器
                mLinearGradient=new LinearGradient(0,0,mViewWidth,0,
                        new int[]{Color.BLUE, 0xffffffff, Color.BLUE},
                        null, Shader.TileMode.CLAMP);
                mPaint.setShader(mLinearGradient);
                matrix=new Matrix();
            }
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (matrix!=null){
            //修改可以改变显示的速度
            mTranslate+=mViewWidth/10;
            if (mTranslate>1*mViewWidth){
                mTranslate=-mViewWidth;
            }
            matrix.setTranslate(mTranslate,0);
            mLinearGradient.setLocalMatrix(matrix);
            //每隔100毫秒闪动一下
            postInvalidateDelayed(100);
        }
    }
    /*
    LinearGradient参数:
    float x0: 渐变起始点x坐标
    float y0:渐变起始点y坐标
    float x1:渐变结束点x坐标
    float y1:渐变结束点y坐标
    int[] colors:颜色 的int 数组
    float[] positions: 相对位置的颜色数组,可为null,  若为null,可为null,颜色沿渐变线均匀分布
    Shader.TileMode tile: 渲染器平铺模式*/
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值