自定义View,既然是自定义的,那么属性设置肯定也是自己来,那么首先得创建一个attrs 文件,用于设置自己的属性。
其中:name = "xxxxx" 是设置这个属性文件的名称,然后里面的:radius,drawale,则是属性名称,如系统控件里面的,textSize,textColor 一样,而后面的 format = "xxx"则是设置这个属性的类型,比如你textSize= '16dp" ,这种只能输入数字,drawable = "xxx"这种是只能放图片的,就是通过format来限制,不要弄混了。如果要允许放多种属性,则用” || “隔开。
format 可设置的属性为:
reference:参考某一资源id (例如图片) , color:颜色值 , boolean:布尔值, dimension:尺寸值(如dip,dp,sp) , float:浮点值 , integer:整型值 , string:字符串 , fraction:百分数 , flag:位或运算
OK,既然现在已经定义好的View 的属性名称,那么就准备开始弄个View吧!
既然自定义的,那肯定要自己建类了,新建一个"Xxxx"类 (Cirle) 继承 View,然后重写他的构造方法
直接进行自身的调用,然后我们在第三个构造方法里面进行初始的一些设置,操作。
这里再来梳理一下,它的三个参数:context,AttributeSet,defstyleAttr,分别是什么意思。
context : 上下文,就是当前的视图容器,如:this,getActivity,getContext,
AttributeSet : 这个解释起来挺麻烦的,去看源码介绍,我就直接Copy一份截图来看
defstyleAttr : 这个的话...暂时也没用到,也不怎么理解,到该觉得是对XML文件,View的属性stye的一种使用吧...
然后继续下文的,开始构建自己的View,首先先看这个:
TypedArray :我认为这个类是学习自定义属性很重要的!!首先看官方文档说的:
Container for an array of values that were retrieved with * {@link Resources.Theme#obtainStyledAttributes(AttributeSet, int[], int, int)} * or {@link Resources#obtainAttributes}. Be * sure to call {@link #recycle} when done with them.
它就是属性的集合,我们获取属性一般就是这个类的.getxxx()方法。
通过实例化:context.obtainStyledAttributes 方法,这有4个重载方法,
这个方法就是从资源里挑出一些属性来,按照顺序放到TypedArray里,参数可以控制从哪里挑选属性,挑选哪些。
如图中:现在就是设置的从 “R.styleable.Cirle" 文件来挑选属性,也就是我们自己写的文件。
然后再挑选设置Color,Size,等很多其它属性,可以一一设置。
参数set:挑选属性的出处是AttributeSet。
参数attrs:这是一个属性的数组,只是哪些属性被挑选出来,在之前看R文件的时候R.styleable.button1就是这样的数组,我们可以自己new这样的数组,再赋值。
参数defStyleAttr:挑选属性的出处是defStyleAttr。
参数defStyleRes:挑选属性的出处是defStyleRes。
目前这样,这个自定义的View 就基本设置好了,另外对于大小的控制,ware_content或者math_parent我是还没有做控制的,因为初识嘛,先弄个自己的View出来。
现在让我们重写 onDraw() 方法,作用名字就展示出来了嘛,就是画!重写它来画View
很简单,我这就是先画了半个小圆,完成的样子就是这样!
Paint : 画笔,就是你要用什么来画这个东西。文中初始了一只画笔,画笔的颜色是:mColor
canvas : 画布,带有X,Y坐标系。可以在画布上画各种图形、线条、文字、图片,而所画出来的内容与效果,就是这个自定义View将要显示成的样子。
然后我现在代码就是i,到画布上面画一个圆,起始坐标为X:0,Y:0,半径mRadius,颜色mColor。至于为什么没顶死到边上,那是我布局文件用了pading 拉开了。
写到这一步,那就还差布局文件看看了,怎么用这个View。因为刚才文中设置什么半径啊,颜色的都没有数值对吧,都只是一个参数,因为是在布局里面写的设置的嘛!
直接上图啦,布局使用就行了。然后设置颜色,大小的。因为是引用自己的文件,所以开头就不是adnroid:xxxx了,而是app:xxxx,另外还得记得引用xmls:xxxx文件,不然用不了!
这样,一个简单的自定义圆就做完了,下一篇在来研究一下canvas,和如何控制它的大小是,match还是wrap。 现在写的那个warp肯定是没用的啦!