view的一点小知识

最近看的东西包括两方面,一个是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()方法

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容