Android 和iOS 中关于View 的一点知识

View的概念和方法十分重要,这里将对Android 和iOS中出现的,关于视图的一些知识点进行总结,预计文章会比较长,要许多时间慢慢补充。

 先转载一部分资料,感谢原作者! 原链接为:http://blog.csdn.net/qinjuning ,很牛,很强大,希望大家都去那里看看。

先推荐 一个 http://blog.csdn.net/qinjuning/article/details/8051811

这里有一篇关于 onMeasure的好文章 http://my.oschina.net/banxi/blog/51247

 

====================================转载开始==============================================

1.android绘制view的过程简单描述
           简单描述可以解释为:计算大小(measure),布局坐标计算(layout),绘制到屏幕(draw);
           下面看看每一步的动作到底是什么,
           第一步:当activity启动的时候,触发初始化view过程的是由Window对象的DecorView调用View(具体怎样从xml中读取是用LayoutInflater.from(context).inflate)对象的 public final void measure(int widthMeasureSpec, int heightMeasureSpec)方法开始的,这个方法是final类型的,也就是所有的子类都不能继承该方法,保证android初始化view的原理不变。具体参数类值,后面会介绍。


           第二步:View的measure方法 onMeasure(widthMeasureSpec, heightMeasureSpec),该方法进行实质性的view大小计算。注意:view的大小是有父view和自己的大小决定的,而不是单一决定的。这也就是为什么ViewGroup的子类会重新该方法,比如LinearLayout等。因为他们要计算自己和子view的大小。View基类有自己的实现,只是设置大小。其实根据源码来看,measure的过程本质上就是把Match_parent和wrap_content转换为实际大小


            第三步:当measure结束时,回到DecorView,计算大小计算好了,那么就开始布局了,开始调用view的 public final void layout(int l, int t, int r, int b),该还是也是final类型的,目的和measure方法一样。layout方法内部会调用onlayout(int l, int t, int r, int b )方法,二ViewGroup将此方法abstract的了,所以我们继承ViewGroup的时候,需要重新该方法。该方法的本质是通过measure计算好的大小,计算出view在屏幕上的坐标点

           第四步:measure过了,layout过了,那么就要开始绘制到屏幕上了,所以开始调用view的  public void draw(Canvas canvas)方法,此时方法不是final了,原因是程序员可以自己画,内部会调用ondraw,我们经常需要重写的方法。

=====================================转载结束=============================================

 

Android

测量 measure,onMeasure

布局 layout,onLayout

绘制 draw, onDraw 

 

iOS

布局函数

测量+放置 

- (void)layoutSubviews

You should not call this method directly. If you want to force a layout update, call the setNeedsLayout method instead to do so prior to the next drawing update. If you want to update the layout of your views immediately, call the layoutIfNeeded method.

 

绘制函数  

drawRect:

You should never call this method directly yourself,call the setNeedsDisplay or setNeedsDisplayInRect:method instead.

 

 

posted @ 2013-10-31 10:06  幻化成疯  阅读(487)  评论(0编辑  收藏  举报