Android学习日志:自定义控件1
自定义控件分为两种,分别继承自View,ViewGroup。
通常情况下,有以下三种方法来实现自定义的空间。
· 对现有控件进行拓展
· 通过组合来实现新的控件(ViewGroup)
· 重写View来实现全新的控件(View)
1、自定义View
自定义View时,通常要重写onDraw()方法来绘制View的显示内容。如果使用wrap_content属性,还必须重写onMeasure()方法来测量自身。
在View中通常有一下一些比较重要的回调方法。
· onFinishInflate():从XML加载组件后回调。
· onSizeChanged():组件大小改变时回调。
· onMeasure():回调该方法来进行测量。
· onLayout():回调该方法来确定显示的位置。
· onTouchEvent():监听到触摸事件时回调。
通过自定义attrs属性,还可以设置新的属性配置值。例如:
在values目录下建attrs.xml文件
<resources>
<declare-styleable name="cutsomView_name">
<attr name="attr_name" format="attr_value_type"/>
</declare-styleable>
</resources>
在布局文件中引用时,需要指定引用的第三方控件的名字空间,如:
xmlns:custom=”http://schemas.android.com/apk/res-auto”
然后就可以在布局文件中引入该自定义View了。如:
<package_name.cutsomView_name
cutsom:attr_name = "attr_value"/>
然后我们需要新建一个继承自View的class,在构造方法中通过TypedArray这样的数据结构来获取自定义属性集。
TypedArray ta = context.obtainStyledAttributes(attrs,R.styleable.cutsomView_name);
然后通过TypedArray的方法根据属性的id:R.styleable.attrs_id获取属性值。
重写onMeasure()和onDraw()方法。
2、自定义ViewGroup
自定义ViewGroup具体步骤跟自定义View差不多啦,主要就是在类中需要重写的方法不太一样。
在自定义ViewGroup时,通常会去重写onLayout()方法来控制其子View显示位置的逻辑,如果需要支持wrap_content属性,那么它还必须重写onMeasure()方法,这点和View是相同的。
ViewGroup通常情况下不需要绘制,因为它本身就没有需要绘制的东西,如果不是指定了ViewGroup的背景颜色,那么ViewGroup的onDraw()方法都不会被调用。但是,ViewGroup会使用dispatchDraw()方法来绘制其子View。