自定义View学习记录

这几天,公司的项目完成了,时间比较闲,就想着看看自定义View,不过,我自定义View已经看过好多遍了,但是总觉得自定义View我自己一直把它拿不下来,总其原因还是自己动手敲的太少。今天自己动手敲了一个类似与获取验证码的自定义View,这里将流程记下来,一方面巩固自己自定义View的知识,另一方面还是巩固,因为网上写的好的自定义View太多了。

第一步,首先在res/values下新建一个attrs.xml 文件,如果有则省略此步。

第二步,创建自定义类继承View(或其子类),重写前3个构造方法,我采用的是第一个调用本地第二个this.XXX(context,null),第二个调用本地第三个this.XXX(context,attrs,deauflt);

第三步:在attrs.xml文件里面新建一个<declare-styleable  name="xxx">(此处不强求使用自定义类名。但是用类名方便识别),<attr name="mmm" format="dimention"/>将要定义的属性名称写在此处。

第四步:在构造方法里面获取自定义属性的值Typearray typeArray = context.getTheme().obtainStyleableattrs(attrs,R.styleable.XXX,defStyleAttr,0)。得到typeArray后即可根据自己定义的属性的名字来获取对应的值了
mText=typedArray.getString(R.styleable.TextCustomView_text);这里面千万要记住将typeArray.recycle()回收掉;
可以在这里面写它的点击监听事件,this.setonClickListener(){},在这里面做相应的操作,然后调用 postInvalidate();(此处方法调用相当于调用了一次onDraw()方法)

第五步:重写onMeasure()方法(自定义里面不是必须的,但是最好测量一下)通过MeasureSpec.getMode();MeasureSpec.getSize()即可获取到响应值,通过得到的mode判断属于哪一种测量模式(MeasureSpec.EXACTLY;MeasureSpec.AT_MOST;MeasureSpec.UNSPECIFIED)我们一般只需判断是否是MeasureSpec.EXACTLY,如果是这种模式我们直接将测量得到的size付给响应的size,否则我们就需要自己计算,将得到的值付给size,最后调用setMeasureDimension(width,height);完成测量;

第六步:重写onDraw()方法
这个方法主要是用来画View自身。
此处的例子是用来写一个验证图片的demo;
mPaint.setColor(Color.Yellow);
canvas.drawRect(0,0,getMeasureWidth(),getMeasureheight(),mPaint);
mPaint.setColor(mColor);
Rect mBound = new Rect();
mPaint.getTextBounds(mtext,0,mtext.length(),mBound);
canvas.drawtext(mtext,getWidth()/2-mBound.width()/2,getHeight()/2+mBound.height()/2,mPaint);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值