requestLayout
以ViewGroup#addView中触发requestLayout方法的ViewGroup视图为例。
View# requestLayout方法。
ViewRootImpl#isInLayout方法负责检查ViewRootImpl的mInLayout状态,若此刻正在 host.layout视图布局方法调用requestLayout ,mInLayout状态是 true 。
ViewRootImpl#requestLayoutDuringLayout方法 负责将该视图加入ViewRootImpl的mLayoutRequesters列表。
ViewRootImpl# requestLayoutDuringLayout方法。
若mHandlingLayoutInLayoutRequest是true,说明 mLayoutRequesters视图正在处理 ,则返回false,requestLayout直接退出,请求不会再通知到ViewRootImpl。
ViewRootImpl# performLayout方法。
mHandlingLayoutInLayoutRequest一般为false。
只有在performLayout方法, 存在validLayoutRequesters列表,处理View列表时,才会设置为true ,并将一定数量numValidRequests的View调用requestLayout方法。
从addView方法触发的requestLayout,mInLayout是false。
View# isLayoutRequested方法。
若无 PFLAG_FORCE_LAYOUT标志 ,向上层递归调用每一个父视图View#requestLayout方法,每一层视图增加两个标志。
到达顶层ViewRootImpl,若mLayoutRequested是true,不需要再触发requestLayout, 在performTraversals中和真正进入布局performLayout中才会将其重新设为false。
ViewRootImpl# isLayoutRequested方法。
ViewRootImpl# requestLayout方法
AttachInfo#mViewRequestingLayout已经赋值过 下层ViewGroup ,上层父视图不会再重新赋值,requestLayout结束时,若是该层的视图,将其置空,其他层的视图不必理会,仅保存 requestLayout发起者的视图对象。
两个方法都是ViewParent接口方法,View中存在两方法的实现,ViewGroup实现ViewParent接口,并未重写两个方法,直接使用父类View的requestLayout和isLayoutRequest。
ViewRootImpl实现ViewParent接口,单独实现两个方法。
任重而道远
郜峡信可: 1、requestLayout: 当view确定自身已经不再适合现有的区域时,该view本身调用这个方法要求parent view重新调用他的onMeasure onLayout来对重新设置自己位置.特别的当view的layoutparameter发生改变,并且它的值还没能应用到view上,这时候适合调用这个方法.必须是在UI线程中进行工作2、invalidate: View本身调用迫使view重画.必须是在UI线程中进行工作.比如在修改某个view的显示时,调用invalidate()才能看到重新绘制的界面.3、postInvalidate: View本身调用迫使view重画.在非UI线程中进行.
揭阳市19744915219: Android问题:自定义控件的时候,onLayout()方法用来做什么的? - ?
郜峡信可: layout是Android View布局过程的第二个阶段,第一阶段是measure,即测量,首先测定view的大小.layout的作用是给所有的child安排大小和摆放位置.有两个主要的相关方法:public void layout(int l, int t, int r, int b);子类不应该重载这个方法,...
揭阳市19744915219: invalidate()执行后,为什么onDraw()却不执行 - ?
郜峡信可: 1、OnDraw函数在程序启动和任何界面刷新情况下都会调用,你点一下菜单或者鼠标通过客户区,就会造成无数个弹出窗口.2、如果程序运行中一个弹出也没有,那么两种情况:一个是OnDraw不是系统提供的重载函数,你写错了,另外一个...
揭阳市19744915219: android 自定义view怎么做能提高效率 - ?
郜峡信可: 越少越好 为了加速视图,从那些调用频繁的活动中减少不必要的代码.在OnDraw()方法中开始绘制,它会给你最大的效益.特别低,你也应该减少在onDraw()方法中的内存分配,因为任何内存分配都可能导致内存回收,这将会 引起不连...
揭阳市19744915219: View.layout(int l, int t, int r, int b);在onCreate里?
郜峡信可: layout方法在view内部是会被调用的,你layout一下了,但是当它重新布局的时候,又会被重新layout.你在onCreate里面layout没有效果是因为android的View的布局不在onCreate里面进行(大概在onResume之前或之后),后续的布局动作把你的layout给覆盖了.
揭阳市19744915219: 如果在Android 子线程中更新ui - ?
郜峡信可: 针对于b情况,你尝试下在类中新建一个thread,然后在button的setOnClickListener中调用,应改没有问题.如果在button的setOnClickListener,应该算是内部类了.
揭阳市19744915219: android 怎么样渲染视图 - ?
郜峡信可: 当一个活动接收到焦点时,它将被要求绘制它的布局.Android框架将处理这个绘画的过程,但是活动必须提供它的布局层次的根节点.绘画从布局的根节点开始.它被要求来测量和绘制布局树.绘画通过遍历布局树并渲染每个和失效区域相交...
揭阳市19744915219: Android 自定义控件开发中 onLayout如何设置里面控件的大小(Android 大神请进……)?
郜峡信可: ViewGroup在onLayout函数中通过调用其children的layout函数来设置子视图相对与父视图中的位置,具体位置由函数layout的参数决定,当我们继承ViewGroup时必须重载onLayout函数(ViewGroup中onLayout是abstract修饰),然而onMeasure...
揭阳市19744915219: ListView上加了个Header,如何滚动到最顶端 - ?
郜峡信可: listview的一些方法:1.public void setSelection (int position) position位置的item置顶(即position位置的item到listview的最顶端),但是,没有从原来位置到顶端的滑动效果.2.public void setSelectionFromTop (int position, int y) 与setSelection ...
揭阳市19744915219: android listview如何按时加滚动到顶部? - ?
郜峡信可: listView.setSelection(0)可以直接跳到顶部 listView.smoothScrollToPosition(0)可以平滑滚动到顶部 如果你需要平滑滚动的动画效果同时又要满足时间要求,则需要自己写一个继承ListView的类,重写smoothScrollToPosition(int position)方法,自己计算滚动的速度