Android自定义控件主要流程
- Android自定义控件
- 1、绘制过程
- 2、主要内容解释
- measure操作
- layout操作
- draw操作
- 自定义View需要最少覆写onMeasure()和onDraw()两个方法。
Android自定义控件
1、绘制过程
创建一个类,继承View类
- onMeasure()方法,测量计算视图的大小
- onLayout()方法,设置视图在屏幕中显示的位置
- onDraw()方法,绘制视图
2、主要内容解释
measure操作
用于计算视图的大小,即视图的宽度和长度。在view中定义为final类型,要求子类不能修改。measure()函数中又会调用下面的函数:
- onMeasure(),确定视图大小,也就是说measure只是对onMeasure的一个包装,子类可以覆写onMeasure()方法实现自己的计算视图大小的方式,并通过setMeasuredDimension(width, height)保存计算结果。
- 关于MeasureSpec:
UPSPECIFIED:父容器对于子容器没有任何限制,子容器想要多大就多大.
EXACTLY:父容器已经为子容器设置了尺寸,子容器应当服从这些边界,不论子容器想要多大的空间.
AT_MOST:子容器可以是声明大小内的任意大小.
layout操作
用于设置视图在屏幕中显示的位置。在view中定义为final类型,要求子类不能修改。layout()函数中有两个基本操作:
- setFrame(l,t,r,b),l,t,r,b即子视图在父视图中的具体位置,该函数用于将这些参数保存起来;
- onLayout(),在View中这个函数什么都不会做,提供该函数主要是为viewGroup类型布局子视图用的;
draw操作
利用前两部得到的参数,将视图显示在屏幕上,到这里也就完成了整个的视图绘制工作。其内部定义了绘图的基本操作:
- 绘制背景;
- 如果要视图显示渐变框,这里会做一些前期工作;
- 绘制视图本身,即调用onDraw()函数。在view中onDraw()是个空函数,也就是说具体的视图都要覆写该函数来实现自己的显示。
- 绘制子视图,即dispatchDraw()函数。在view中这是个空函数,具体的视图不需要实现该方法,它是专门为容器类准备的,也就是容器类必须实现该方法;
- 应用程序调用了setVerticalFadingEdge或者setHorizontalFadingEdge,如果需要可以开始绘制渐变框;
- 绘制滚动条;
自定义View需要最少覆写onMeasure()和onDraw()两个方法。
自定义View的所涉及的方法:
onFinishInflate(): 回调方法,当应用从XML加载该组件并用它构建界面之后调用的方法
onMeasure():检测View组件及其子组件的大小
onLayout(): 当该组件需要分配其子组件的位置、大小时
onSizeChange():当该组件的大小被改变时
onDraw(): 当组件将要绘制它的内容时
onKeyDown: 当按下某个键盘时
onKeyUp: 当松开某个键盘时
onTrackballEvent: 当发生轨迹球事件时
onTouchEvent: 当发生触屏事件时
onWindowFocusChanged(boolean):当该组件得到、失去焦点时
onAtrrachedToWindow():当把该组件放入到某个窗口时
onDetachedFromWindow():当把该组件从某个窗口上分离时触发的方法
onWindowVisibilityChanged(int):当包含该组件的窗口的可见性发生改变时触发的方法