最近看的东西包括两方面,一个是view的绘制,另一个是view的分发
所写的所有内容都是基于Android艺术开发,请在看完艺术开发后如果有不懂的地方再来看此博
1.view从创建开始绘制需要五部
绘制背景,主体,子view,滑动栏,前景,其中前景和滑动栏不可重写,背景,主题,子view都可以被重写自定义,绘制顺序也是这样,最后这五步绘制方法都会汇总在draw()方法里绘制,所以如果想绘制一个背景,可以在super.draw()方法上面写好,想绘制一个覆盖所有东西的,可以在super.draw()方法下面写好。
并非每一个view都包含上面的五步,如linearlayout类没有主体,只有子view
自定义一个view需要继承相应的view,然后重写需要的方法。
2.view 的分发机制
首先要知道点击事件分为DOWN , MOVE , UP三类,事件的处理从down开始,当父view的dispatch()检测到时,会调用oninterpcete()方法判断是否拦截,如果要拦截,用ontouchevent()方法来处理,如果不拦截,将该事件交给子view的dispatch()方法处理,如此循环,直到事件被处理了,如果没有view接手这个view,就依次往回调,传到最高级activity为止。就像上司派下一个任务,领导先分配任务给员工,如果员工做不了这个任务,又一级一级的传回给上级,直到最终boss。
当一个view需要处理事件时,如果它设置了ontouchlistener,那么他的ontouch()方法会被回调(关于回调会抽时间另写一个博给大家解释,简单解释就是这个方法在这个类中被定义,但却在他接口所在的类中发挥作用),优先级ontouchlistener()>ontouchevent()>onclicklistener(),其中ontouchlistener和onclicklistener都用了回调方法
事件的分发机制多用于滑动冲突,有两种著名的滑动冲突,一种是viewpager中镶套recyclerview,另一种是recyclerview中镶套recyclerview,解决滑动冲突的方法有两种,第一种是父view先接收,父view不处理就交给子view处理,如第一种冲突中,当检测到横向滑动距离远大于纵向滑动,父view就会接收down这一动作,接着开始处理,反之则子view处理,内部处理费法也是类似的道理,只不过子view开始,子view不会处理的交给父去处理。至于两个recyclerview镶套与这种情况类似,想了解的可以下去看书继续学习。
最后总结一下,一个viewgroup主要分为三个板块,measure,layout,draw,onmeasure()和onlayout()是两个相连的方法,一个测view 的大小,一个给view设置布局位置,draw负责对这些内容进行绘制。事件的分发基本的三个方法dispatch(),onintercept()和ontouchevent()方法