自定义View
首先要了解为什么我们要自定义View?
在实际开发中经常需要定制SDK中没有提供的控件,因此要创建自定义View并对已存在的view做扩展,即创建View或ViewGroup的子类,并重写其中的一些方法。
自定义View的步骤:
步骤1:创建View子类
步骤2:创建设置属性的XML文件
步骤3:编写布局,调用步骤2创建的自定义类。
然后自定义属性:
- 在这里需要知道为什么要自定义属性文件?
在布局文件或Java代码中给自定义View设置如:文本、颜色、背景等属性,并且父类中没有这些属性。
- 接下来就是步骤3中的具体调用了:
将自定义的属性值取出来,在MyTextView方法中通过AttributeSet从布局文件中将属性值取出来然后赋值给你定义的那些全局变量在通过onDraw方法绘制出来,这个AttributeSet是节点属性的集合,该集合是res/values/attr.xml中定义的属性的集合。
- 如何取出属性值:
通过TypedArray类(这个类用于存放自定义的一组属性,是数组类型)。
TypedArray类常用方法:
public String getString(int index)
作用:根据资源索引值获取类型为String的属性的数据
参数:index:R.styleable类中的索引值,该索引值表示attr.xml中定义的一个属性
public int getInt(int index)
作用:根据资源索引值获取类型为int的属性的数据
参数:index:R.styleable类中的索引值,该索引值表示attr.xml中定义的一个属性
public int getColor(int index)
作用:根据资源索引值获取类型为int颜色属性的数据
参数:index:R.styleable类中的索引值,该索引值表示attr.xml中定义的一个属性
public float getDimenslon(int id,float defValue)
作用:获取指定资源id对应的属性的尺寸,单位:px
参数:id:属性的索引值。defValue:缺省值
public int getDimensionPixelOffset(int id,int defValue)
作用:获取指定资源id对应的属性的尺寸,与getDimension方法不同处是将该方法的小数部分截掉,单位:px
参数:id:属性的索引值。defValue:缺省值。
public int getDimensionPixelSize(int id,int defValue)
作用:获取指定资源id对应的属性的尺寸,与getDimension方法不同处是将该方法的小数部分四舍五入,单位:px
参数:id:属性的索引值。 defValue:缺省值。
获取自定义属性:
TypedArray array =
context.obtainStyledAttributes(attrs,R.styleable.VerticalTextView); - 设置画笔Paint:
释放属性资源:typedArray.recycle();
画笔大小:Paint.setTextSize();
画笔颜色:Paint.setTextColor();
然后在onDraw()方法中:
canvas.drawText(“定义的文本”,getPaddingleft(),”高度”,”画笔”);
canvas.drawText(mText,getPaddingleft(),10,mPaint);
绘制出来。
至此View已经能在屏幕上显示出来,接下来是关于自定义View的测量,如果你自定义View宽高是固定值就不需要测量因为android它有自己的一套测量。
测量步骤:
**步骤1:measure 回调onMeasure方法
**步骤2:layout 回调onLayout方法
void onLayout(boolean changed,int left,int top,int right,int bottom)
作用:父容器给子view设置尺寸和位置时被调用。子view必须重写onLayout方法,并且调用各自的onLayout方法。
参数:
changed:view是否有新的尺寸或位置
left:相对于父容器的left位置
top:相对于父容器的top位置
right:相对于父容器的right位置
bottom:相对于父容器的bottom位置
**步骤3:draw 回调onDraw方法
测量子View需要用到相关API-MeasureSpec类,它是用于测量view的尺寸
常用方法:
public static Int getMode(Int measureSpec)
作用:获取测量规格 参数:measureSpec:系统传入的测量宽度或高度的描述信息
public static Int getSize(Int measureSpec)
作用:获取对view的宽或高的测量值 参数:measureSpec
说明:getMode()返回的测量规格如果是MeasureSpec.EXACTLY,则getSize()返回的就是view实际的宽或高