Android自定义View

本文转自http://blog.csdn.net/lmj623565791/article/details/24252901/
自定义View的步骤:
1.自定义View的属性
2.在View的构造方法中获取属性
3.重写onMeasure()方法,这个方法不是必须的,大部分情况下需要重写
4.重写onDraw()方法

1.自定义View属性,在res/values下新建attrs.xml文件,定义自定义属性和声明我们的整个样式,示例代码:






其中,format是只该属性的取值类型:string,color,demension,integer,enum,reference,float,boolean,fraction,flag
然后在布局中声明我们的自定义View(全包名),不要忘了引入命名空间

2.获取自定义样式属性,有两种方式:
第一种:attrs.getAttributeBooleanValue("namespace", "boolean", false);不推荐使用,字符串容易写错
第二种:TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.CustomView);
mColor = typedArray.getColor(R.styleable.CustomView_textColor,Color.RED);
typeArray.recycle();

3.onMeasure()和onDraw()方法是系统调用的方法
在onMeasure()中,如果我们没有设置明确的宽和高,不管写wrap_content还是match_parent,系统帮我们测量的结果都是match_parent,当我们设置了明确的宽和高时,系统帮我们测量的结果就是我们设置的结果,所以当设置了wrap_content时,我们需要自己进行测量,就要重写onMeasure()方法
我们必须要了解MeasureSpec的specMode,一共三种类型:
EXACTLY:设置了明确的值或者match_parent
AT_MOST:表示子布局限制在一个最大值内,一般为wrap_content;
UNSPECIFIED:布局想要多大就多大,很少使用,一般为不确定的值,如ListView

invalidate(); 主线程通知view重绘
postInvalidate();子线程通知view重绘

重要:在最后一定要调用setMeasuredDimension(width,height)方法,否则没效果

4.onDraw()方法,主要是绘图的过程,不想说什么,看完几个自定义View,瞬间感觉智商不够用了。
转自http://www.jianshu.com/p/9fe15e6ebdfb
自定义view中常用的绘图函数,飞哥智商有这么高?

在这里再赘述一下invalidate()方法和postInvalidate()方法
Android中实现view的更新方法有两个,一个是invalidate()和postInvalidate,前者是在UI线程自身中使用,后者在非UI线程中使用。invalidate不能直接在线程中调用,违背了单线程模型:Android的UI操作不是线程安全的,并且这些操作必须在UI线程中调用。
使用invalidate()刷新界面,需要用到Handler对象,通过sendMessage()发送界面更新消息通知
使用postInvalidate()刷新界面,不需要Handler对象,直接调用就行,传入long值参数,表示休眠,延时发送刷新界面消息

你可能感兴趣的:(Android自定义View)