Android自定义View
前一阶段学习android自定义view,买了好几本Android源码分析的书,看书里边关于view的绘制过程的分析。结果看的云里雾里,感觉并没有学到什么东西,后来在github上看教程,看别人的代码,感觉有点收获,所以写了这一篇博客。同时我认为学习这方面的知识,直接去看源码分析效果不好,而应该先学习如何操作,等到有了一点经验或者说入了门之后,再去分析源码,会有更好的效果。
自定义view绘制流程.jpg
自定义view分类
主要是按照自己编写的类所继承的父类来分类,一种是自定义的ViewGroup,大多继承自ViewGroup或者是各种Layout;第二种是继承自View类或者是其他的各种view的子类
自定义view的各个重要的方法
-
构造函数
构造函数是View的入口,用于初始化view的内容,获取自定义的属性。
public ClockView(Context context){ this(context,null); } public ClockView(Context context, AttributeSet attrs){ super(context,attrs); } public ClockView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); }
调用一个参数的构造函数
ClockView clockview = new ClockView()
调用两个参数的构造函数
<com.example.dell.MyView.DigitClockView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/digit_clock"/>
-
onMeasure函数
onMeasure方法的作用是测量View的大小,函数有两个参数
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
,两个int型的参数,与宽高有关,我们能从中获取宽高的数据。onMeasure函数中的参数widthMeasureSpec与heightMeasureSpec是由宽、高和各自方向上对应的测量模式合成的一个值。
测量模式一共有三种
模式 二进制值 描述 UNSPECIFIED 00 默认值,父控件没有给子view任何限制,子View可以设置为任意大小 EXACTLY 01 表示父控件已经确切的指定了子View的大小。 AT_MOST 10 表示子View具体大小没有尺寸限制,但是存在上限,上限一般为父View大小。 实际应用中使用
getSize
和getMode
方法获取数值与模式int Width = MeasureSpec.getSize(widthMeasureSpec); int modeWidth = MeasureSpec.getMode(widthMeasureSpec);
-
onSizeChanged方法
此函数在View大小发生变化时调用,比如父控件影响view大小时
@Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); }
函数参数中的w,h,即为view最终的宽高。
-
onLayout方法
此方法用于确定子view的位置,在自定义GroupView中用到。
在自定义的ViewGroup中,此方法一般循环取出子view,计算出子view的位置,然后使用
child.layout(l, t, r, b);
设置子view的位置。 -
onDraw方法
onDraw方法实际负责图形的绘制,使用Canvas和Paint绘制。
-
提供接口
最终自定义view需要给外部提供一个接口用于控制view状态或监听view变化等。
网友评论