天天看点

Android View架构总结

android的四大组件,activity是四大组件中唯一一个用来和用户进行交互的组件。可以说activity就是android的视图层。 如果再细化,activity相当于视图层中的控制层,是用来控制和管理view的,真正用来显示和处理事件的实际上是view。 每个activity内部都有一个window对象, window对象包含了一个decorview(实际上就是framelayout),我们通过setcontentview给activity设置显示的view实际上都是加到了decorview中。

view有哪些?

android中控件大致被分为两类viewgroup,view。viewgroup作为容器管理view。android视图,是类似于dom树的架构。父视图负责测量定位绘制等操作。我们经常在用的findviewbyid方法代价昂贵的原因,就是因为他负责至上而下遍历整棵控件树,来寻找view实例,在重复操作中尽量少用。现在在用的很多控件都是直接或者间接继承自view的,如下图。

Android View架构总结

viewgroup是什么?

 一个viewgroup是一个可以包含子view的容器,是布局文件和view容器的基类。在这个类里定义了viewgroup.layoutparams类,这个类是布局参数的子类。 其实viewgroup也就是view的容器。通过viewgroup.layoutparams来指定子view的参数。viewgroup作为一个容器,为了制定这个容器应有的标准所以为其指定了接口。

viewgroup继承自view,并实现了两个接口viewparent和viewmanager。 viewmanager提供了三个抽象方法addview,removeview,updateviewlayout。用来添加、删除、更新布局。 viewparent主要提供了一系列操作子view的方法例如焦点的切换,显示区域的控制等等。

实际上所有的事情view都能做,包括显示复杂的界面,我们只需要设计一个复杂的view即可。例如短信通知的icon,一个可以显示图片又可以显示文字的view,我们后期学习了view的draw方法后,可以轻松的设计一个view来达到这个效果,但是这样不仅复杂,而且重用性较差,还会因为一点小改动而重复的创造轮子,这显然不符合程序员偷懒的原则,所以我们可以完全把imageview和textview组合到一起就可以了,这个时候我们就需要一个容器,viewgroup,来装这两个view。 viewgroup和view最大的不同是可以组合多个view,那么多个view在一起,该如何摆放,这就是viewgroup需要解决的问题。

view的层级结构是什么?

我们看到的界面,都是以一个viewgroup作为根view,通过往viewgroup中添加子view(可以是view,也可以是viewgroup),来组合出各具特色的界面。 这种从根到叶的组合方式,我们可以看做成一个view树。(类似于xml),而view的显示和事件处理,都是依赖于这个view树。 绘制和事件处理的起始点,都是从根view开始一级一级的往下传递。我们从任意一层发起绘制,都将反馈到根view,然后再从上往下传递。 之前我们说过根view就是window中的decorview,也就是一个framelayout。

view的onmeasure()/onlayout()/ondraw()方法做了什么?

当一个activity启动时,会被要求绘制出它的布局。android框架会处理这个请求,当然前提是activity提供了合理的布局。绘制从根视图开始,从上至下遍历整棵视图树,每一个viewgroup负责让自己的子view被绘制,每一个view负责绘制自己,通过draw()方法.绘制过程分三步走。这个也是我们老生常谈的

onmeasure(),

onlayout();

ondrawn();

整个绘制流程是在viewroot中的performtraversals()方法展开的。

requestlayout:当view确定自身已经不再适合现有的区域时,该view本身调用这个方法要求parent view重新调用他的onmeasure onlayout来对重新设置自己位置。特别的当view的layoutparameter发生改变,并且它的值还没能应用到view上,这时候适合调用这个方法。

invalidate:view本身调用迫使view重画。是在ui线程自身使用。

postinvalidate:是在非ui线程使用。

android提供了invalidate方法实现界面刷新,但是invalidate不能直接在线程中调用,因为他是违背了单线程模型:android ui操作并不是线程安全的,并且这些操作必须在ui线程中调用。

android程序中可以使用的界面刷新方法有两种,分别是利用handler和利用postinvalidate()来实现在线程中刷新界面。

程序在oncreate()方法中调用setcontentview()方法后,activitymanagerservice会回调onresume()方法,此时系统才会将整个decorview添加到phonewindow中,并让其显示出来,从而完成界面的绘制。

上一篇: Java注解
下一篇: 初识Node.js

继续阅读