Android自定义ViewGroup常用知识点归类
需要重写的方法
继承了ViewGroup,IDE首先会报一个错误让我们重写onLayout()方法,而且我们还需要重写onMeasure,这两个方法必不可少,基本都需要我们去实现自己的一些逻辑,需要监听手势滑动需要时间拦截,要重写onTouchEvent,和onInterceptTouchEvent。需要绘制背景的话需要重写dispatchDraw(),下面就来一一讲解下。
onMeasure
主要负责测量自身的大小,但是在测量之前需要先调用measureChild()方法先测量子View的大小,然后在计算自己的值,否则子View可能无法正常显示。
获取测量模式,三种测量模式分别为:
(1)AT_MOST : 当控件的宽高设定为wrap_content的时候,我们需要计算这个模式下的控件宽高。
(2)EXACTLY : 当控件的宽高设定为确定的值或者match_patent的时候,需要计算的控件宽高模式,通常直接设定用户所指定的值。
(3)UNSPECIFIED : 网上大部分意思是控件想要多大就多大,没有限制,比较少用。
onLayout
顾名思义,主要负责子View的布局,他在onMeasure方法后调用,子View调用view.layout()方法可以为自己设置所在的位置,当然,需要先计算它的两个边界值,marginLeft和marginTop,另外的marginRight和marginBottom可以通过前两个值加上自身的宽高来求出,所以最主要还是marginLeft和marginTop的计算。
dispatchDraw
类似于自定义View的onDraw(),它的作用也是绘制ViewGroup的一个背景(由于水平有限,目前的理解是如此)。
通常调用该方法来绘制所需要的一些背景,需求与View的onDraw差不多,同样也适用于调用 invalidate()来申请重新绘制。
onInterceptTouchEvent和onTouchEvent
这两个方法通常处理一些手势滑动的事件,onInterceptTouchEvent主要选择是否拦截该次事件,onTouchEvent 主要是负责处理拦截的事件。
常用的三个事件:
- ACTION_DOWN: 手指按下屏幕就触发该事件。
- ACTION_MOVE : 手指按下后在屏幕上滑动就会不断的触发该事件
- ACTION_UP : 手指按下后抬起,触发该事件
拦截事件
不了解Android事件分发机制的可以先百度或者Google查阅,我也不是很了解233
看onInterceptTouchEvent方法可以知道,该方法返回的是一个boolean值。
(1)return true:代表着拦截本次事件,交给自己处理,其实也就是交给onTouchEvent处理。
(2)return false : 相反,不拦截本次事件,交给子View处理,子View不能处理就继续往下传递,不能在传递就往上在传递,默认为不拦截。
拦截滑动事件:可以调用下面的代码来获取系统认为的最小滑动距离ViewConfiguration.get(context).getScaledTouchSlop();
通常我们认为大于这个值就认为是在滑动。
而且如果自定义的ViewGroup没有子View,该方法的ACTION_DOWN 可以正常被触发,但是ACTION_MOVE方法却不能触发,具体感兴趣的可以浏览源码。
事件处理
onTouchEvent是用来处理我们拦截下来的事件,它与onInterceptTouchEvent一样,返回值都为boolean类型的。
(1)return true :代表该事件已经被消费,也就是已经被处理,不需要在往下传递了。
(2)return false :代表该事件没有被消费。
本人咸鱼一个,有错的地方或者好的观点欢迎评论回复,支持开喷和吐槽