1、为什么要自定义控件:现有的控件无法满足我们的需求或是达不到我们想要的效果
2、自定义控件也就是继承View或者View的派生类,然后再重写类中的内部方法。通常来说自定义控件分为三种:
1.自定义View:继承View
2.基于现有组件:继承View的派生类
3.组合的方式:自定义控件中包含了其他的组件
3、自定义控件流程:
- 测量-Measure过程是计算视图大小,View measure过程相关方法主要有三个:
- public final void measure(int widthMeasureSpec, int heightMeasureSpec)
- protected final void setMeasuredDimension(int measuredWidth, int measuredHeight)
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
- measure调用onMeasure,onMeasure测量宽度、高度然后调用setMeasureDimension保存测量结果,measure,setMeasureDimension是final类型,view的子类不需要重写,onMeasure在view的子类中重写。
- 布局-Layout过程用于设置视图在屏幕中显示的位置,View layout过程相关方法主要要三个:
- public void layout(int l, int t, int r, int b)
- protected boolean setFrame(int left, int top, int right, int bottom)
- protected void onLayout(boolean changed, int left, int top, int right, int bottom)
- layout通过调用setFrame(l,t,r,b),l,t,r,b即子视图在父视图中的具体位置,onLayout一般只会在自定义ViewGroup中才会使用
- 绘制-draw过程主要用于利用前两步得到的参数,将视图显示在屏幕上,到这里也就完成了整个的视图绘制工作。
- public void draw(Canvas canvas)
- protected void onDraw(Canvas canvas)
- 通过调用draw函数进行视图绘制,在View类中onDraw函数是个空函数,最终的绘制需求需要在自定义的onDraw函数中进行实现,比如ImageView完成图片的绘制,如果自定义ViewGroup这个函数则不需要重载。
网友评论