美文网首页Android小小牛Android小牛
Android View重绘和更新: invalidate和re

Android View重绘和更新: invalidate和re

作者: zhangxuanchen | 来源:发表于2017-02-10 08:59 被阅读1469次

    转载: http://blog.csdn.net/summerinnphuket/article/details/50489990

    总述:
    View有两个很重要的方法:invalidate和requestLayout,常用于View重绘和更新。

    Invalidate:
    To farce a view to draw,call invalidate().——摘自View类源码
    从上面这句话看出,invalidate方法会执行draw过程,重绘View树。
    当View的appearance发生改变,比如状态改变(enable,focus),背景改变,隐显改变等,这些都属于appearance范畴,都会引起invalidate操作。
    所以当我们改变了View的appearance,需要更新界面显示,就可以直接调用invalidate方法。
    View(非容器类)调用invalidate方法只会重绘自身,ViewGroup调用则会重绘整个View树。

    RequestLayout:
    To initiate a layout, call requestLayout(). This method is typically called by a view on itself when it believes that it can no longer fit within its current bounds.——摘自View源码
    从上面这句话看出,当View的边界,也可以理解为View的宽高,发生了变化,不再适合现在的区域,可以调用requestLayout方法重新对View布局。
    View执行requestLayout方法,会向上递归到顶级父View中,再执行这个顶级父View的requestLayout,所以其他View的onMeasure,onLayout也可能会被调用。

    总结:
    View绘制分三个步骤,顺序是:onMeasure,onLayout,onDraw。经代码亲测,log输出显示:调用invalidate方法只会执行onDraw方法;调用requestLayout方法只会执行onMeasure方法和onLayout方法,并不会执行onDraw方法。
    所以当我们进行View更新时,若仅View的显示内容发生改变且新显示内容不影响View的大小、位置,则只需调用invalidate方法;若View宽高、位置发生改变且显示内容不变,只需调用requestLayout方法;若两者均发生改变,则需调用两者,按照View的绘制流程,推荐先调用requestLayout方法再调用invalidate方法。

    相关知识点:
    1.invalidate和postInvalidate:invalidate方法只能用于UI线程中,在非UI线程中,(UI线程是非线程安全的所以只能在UI线程中更新UI)可直接使用postInvalidate方法,这样就省去使用handler的烦恼。

    invalidate :View 方法中的 invalidateInternal 函数来更新View。
    postInvalidate:通过将更新消息发送到ViewRootImpl中的 ViewRootHandler中去更新UI

    public void dispatchInvalidateDelayed(View view, long delayMilliseconds) {
            Message msg = mHandler.obtainMessage(MSG_INVALIDATE, view);
            mHandler.sendMessageDelayed(msg, delayMilliseconds);
        }
    
     final ViewRootHandler mHandler = new ViewRootHandler();
    
     @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                case MSG_INVALIDATE:
                    ((View) msg.obj).invalidate();
                    break;
                .....
            }
    

    相关文章

      网友评论

        本文标题:Android View重绘和更新: invalidate和re

        本文链接:https://www.haomeiwen.com/subject/mkcgittx.html