3.分发/消费MotionEvent
实现复杂的手势控制时,往往需要借助MotionEvent。譬如各种下拉、上拉刷新,左右滑动切换页面或者关闭页面等等。分发/消费MotionEvent的主要接口有两个:View.onTouchEvent()和ViewGroup.onInterceptTouchEvent()。
(1)分发/拦截MotionEvent。MotionEvent的传递是从根节点View开始,从parent child,一层层传给child view,直到叶子view。在此过程中,任何一层View如果重写了ViewGroup.onInterceptTouchEvent()返回true,则会告知系统,在此层拦截MotionEvent,此层以下的child view将无法收到MotionEvent;返回false则会继续向下传递。可见,对于分发/拦截MotionEvent而言,越接近根节点View,优先级越高。
(2)消费MotionEvent。这个过程与(1)相反,从叶子View向上,一层层传给根节点View。在此过程中,任何一层View如果重写了View.onTouchEvent()返回true,这次的MotionEvent将会被消费,此层以上的parent view将无机会消费此MotionEvent;如果返回false,则继续向上传递。可见,对于消费MotionEvent而言,越接近叶节点View,优先级越高。
所以,需要根据UI业务需求,来判断对于Touch事件的处理是parent view为主导,在某些特定的逻辑下面交于child view处理;还是以child view处理为主,某些特定的逻辑下面交于parent child处理。如果是前者,则以利用ViewGroup.onInterceptTouchEvent()为主,后者以利用View.onTouchEvent()为主。
4.借助开源
安卓app经过这么多年的发展,已经有大量的各种各样的开源库出现,app开发也从最初的“事必躬亲”,最多借鉴一下android源码中的系统app,发展到了大量使用开源项目搭建的阶段,从这个角度上看app的开发越来越像服务器了。面对比较难搞的UI需求,找找开源是个不错的想法。