自定义View(一)

来源:互联网 发布:达芬奇家具 知乎 编辑:程序博客网 时间:2024/06/06 00:56

在view中通常有一下一些比较重要的回调方法:
onFinishInflate(): 加载完xml文件回调
onSizeChanged():组件大小发生改变时回调
onMeasure():回调该方法来进行测量
onLayout():回调该方法来确定显示位置
onTouchEvent():监听到触摸事件时回调
在自定义view时不必重写所有回调,只需要重写特定的方法即可。
通常情况下有以下三种方法来实现自定义的空间。
1.对现有的进行拓展
2.通过组合来实现新的控件
3.重写view来实现全新的控件
首先了解对现有控件的拓展。
实现下面的效果
这里写图片描述
继承Texview

public class MyTextView extends TextView {    private Paint mPaint1;    private Paint mPaint2;    public MyTextView(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);        // TODO Auto-generated constructor stub        init();    }    private void init() {        mPaint1 = new Paint();        mPaint1.setColor(getResources().getColor(                android.R.color.holo_blue_light));        mPaint1.setStyle(Paint.Style.FILL);        mPaint2 = new Paint();        mPaint2.setColor(Color.YELLOW);        mPaint2.setStyle(Paint.Style.FILL);    }    public MyTextView(Context context, AttributeSet attrs) {        super(context, attrs);        // TODO Auto-generated constructor stub        init();    }    public MyTextView(Context context) {        super(context);        // TODO Auto-generated constructor stub        init();    }    @Override    protected void onDraw(Canvas canvas) {        // 绘制外层矩形        canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), mPaint1);        // 绘制内层矩形        canvas.drawRect(10, 10, getMeasuredWidth() - 10,                getMeasuredHeight() - 10, mPaint2);        canvas.save();        canvas.translate(10, 0);        super.onDraw(canvas);        canvas.restore();    }}

实现下面效果,渐变色
这里写图片描述
可以利用Paint的Shader渲染器,通过设置不断变化的LinearGradient,使用带有该属性的paint来绘制。
首先在OnSizeChanged()方法中进行一些对象的初始化操作。

/** * 渐变效果的textview *  * @author Administrator *  */public class MyTextView2 extends TextView {    private int mViewWidth = 0;    private float mTranslate;    private TextPaint mPaint;    private LinearGradient mGradient;    private Matrix mGradientMatrix;    public MyTextView2(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);    }    public MyTextView2(Context context, AttributeSet attrs) {        super(context, attrs);    }    public MyTextView2(Context context) {        super(context);    }    @Override    protected void onSizeChanged(int w, int h, int oldw, int oldh) {        super.onSizeChanged(w, h, oldw, oldh);        if (mViewWidth == 0) {            mViewWidth = getMeasuredWidth();            if (mViewWidth > 0) {                mPaint = getPaint();                // 第一个,第二个参数表示渐变起点 可以设置起点终点在对角等任意位置                // 第三个,第四个参数表示渐变终点                // 第五个参数表示渐变颜色                // 第六个参数可以为空,表示坐标,值为0-1 new float[] {0.25f, 0.5f, 0.75f, 1 }                // 如果这是空的,颜色均匀分布,沿梯度线。                // 第七个表示平铺方式                // CLAMP重复最后一个颜色至最后                // MIRROR重复着色的图像水平或垂直方向已镜像方式填充会有翻转效果                // REPEAT重复着色的图像水平或垂直方向                mGradient = new LinearGradient(0, 0, mViewWidth, 0, new int[] {                        Color.BLUE, 0xffffffff, Color.BLUE }, null,                        Shader.TileMode.CLAMP);                mPaint.setShader(mGradient);                mGradientMatrix = new Matrix();            }        }    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        if (mGradientMatrix != null) {            mTranslate += mViewWidth / 5;            if (mTranslate > 2 * mViewWidth) {                mTranslate = -mViewWidth;            }            // 通过矩阵的方式来不断平移渐变效果            mGradientMatrix.setTranslate(mTranslate, 0);            mGradient.setLocalMatrix(mGradientMatrix);            postInvalidateDelayed(100);        }    }}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 没有检测到sd卡怎么办 e站图片配额用尽怎么办 内存卡密码忘了怎么办 电脑上酷狗音乐播放失败怎么办 播放失败不支持该文件怎么办 手机山寨云资源失效怎么办 支付密码输错了怎么办 微信密码锁定了怎么办 电脑网易云音乐闪退怎么办 逆战耳机电流声怎么办 肠道感染一直吃药治不好怎么办 如果24小时以后还没到账该怎么办 在游戏平台充值没到账该怎么办 充值豪华黄钻没到账该怎么办 起点签到签满了怎么办 ipad锁屏声音小怎么办 扣扣邮箱文件超大了怎么办 网易邮箱图片已过期怎么办 邮箱里面的文件过期了怎么办 邮箱发的文件过期了怎么办 邮箱发送的文件过期怎么办 小米4s开不开机怎么办 小米平板关机后开不开机怎么办 公司老板跑路了社保怎么办 公司老板跑路社保怎么办 公司被公安局查封社保怎么办 小米四开不了机怎么办 小米的手机后壳裂了怎么办 公司没钱拖欠员工社保怎么办 小米note充不进去电怎么办 公司欠社保没交怎么办 公司不给转社保怎么办 小米note充电特别慢怎么办 小米小米note2充电慢怎么办 小米note充电红灯不闪烁怎么办 小米note充电红灯闪烁怎么办 小米note2突然充电慢怎么办 充电小米note2手机闪烁怎么办 小米6x上网慢怎么办 小米5数据上网慢怎么办 小米5c照相模糊怎么办