Android中View绘制流程以及invalidate()等相关方法分析(2)

为了大家更好的理解,采用“二B程序员”的方式利用伪代码描述该measure流程       

 

// measure()过程  ViewRoot.java       // 发起measure()的"发号者"在ViewRoot.java里的performTraversals()方法, mView.measure()       private void  performTraversals(){       //...               View mView  ;       mView.measure(h,l) ;              //....       }        //回调View视图里的onMeasure过程      private void onMeasure(int height , int width){      //设置该view的实际宽(mMeasuredWidth)高(mMeasuredHeight)       //1、该方法必须在onMeasure调用,否者报异常。       setMeasuredDimension(h , l) ;            //2、如果该View是ViewGroup类型,则对它的每个子View进行measure()过程       int childCount = getChildCount() ;            for(int i=0 ;i<childCount ;i++){          //2.1、获得每个子View对象引用           View child = getChildAt(i) ;                    //整个measure()过程就是个递归过程           //该方法只是一个过滤器,最后会调用measure()过程 ;或者 measureChild(child , h, i)方法都           measureChildWithMargins(child , h, i) ;                     //其实,对于我们自己写的应用来说,最好的办法是去掉框架里的该方法,直接调用view.measure(),如下:           //child.measure(h, l)       }     }          //该方法具体实现在ViewGroup.java里 。      protected  void measureChildWithMargins(View v, int height , int width){      v.measure(h,l)        } 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wyjgdj.html