一起Talk Android吧(第一百二十回:Android中View的内部流程三)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/talk_8/article/details/88936082

各位看官们,大家好,上一回中咱们说的是Android中View内部流程的例子,这一回咱们继续说该例子。闲话休提,言归正转。让我们一起Talk Android吧!

看官们,我们在上一章回中介绍了Viwe内部流程中的测量,这一回是我们介绍它的第二个内部流程:规划(layout)

规划是在测量的基础上进行的,它会依据各个组件的大小给各个组件在布局中的规划具体位置。规划功能主要是通过performLayout()函数实现的,下面是它的源代码:

private void performLayout(WindowManager.LayoutParams lp, int desiredWindowWidth,
         int desiredWindowHeight) {
     mLayoutRequested = false;
     mScrollMayChange = true;
     mInLayout = true;

     final View host = mView;
     if (host == null) {
         return;
     }
     if (DEBUG_ORIENTATION || DEBUG_LAYOUT) {
         Log.v(mTag, "Laying out " + host + " to (" +
                 host.getMeasuredWidth() + ", " + host.getMeasuredHeight() + ")");
     }

     Trace.traceBegin(Trace.TRACE_TAG_VIEW, "layout");
     try {
         host.layout(0, 0, host.getMeasuredWidth(), host.getMeasuredHeight());

         mInLayout = false;
         int numViewsRequestingLayout = mLayoutRequesters.size();
         if (numViewsRequestingLayout > 0) {
             // requestLayout() was called during layout.
             // If no layout-request flags are set on the requesting views, there is no problem.
             // If some requests are still pending, then we need to clear those flags and do
             // a full request/measure/layout pass to handle this situation.
             ArrayList<View> validLayoutRequesters = getValidLayoutRequesters(mLayoutRequesters,
                     false);
             if (validLayoutRequesters != null) {
                 // Set this flag to indicate that any further requests are happening during
                 // the second pass, which may result in posting those requests to the next
                 // frame instead
                 mHandlingLayoutInLayoutRequest = true;

                 // Process fresh layout requests, then measure and layout
                 int numValidRequests = validLayoutRequesters.size();
                 for (int i = 0; i < numValidRequests; ++i) {
                     final View view = validLayoutRequesters.get(i);
                     Log.w("View", "requestLayout() improperly called by " + view +
                             " during layout: running second layout pass");
                     view.requestLayout();
                 }
                 measureHierarchy(host, lp, mView.getContext().getResources(),
                         desiredWindowWidth, desiredWindowHeight);
                 mInLayout = true;
                 host.layout(0, 0, host.getMeasuredWidth(), host.getMeasuredHeight());

                 mHandlingLayoutInLayoutRequest = false;

                 // Check the valid requests again, this time without checking/clearing the
                 // layout flags, since requests happening during the second pass get noop'd
                 validLayoutRequesters = getValidLayoutRequesters(mLayoutRequesters, true);
                 if (validLayoutRequesters != null) {
                     final ArrayList<View> finalRequesters = validLayoutRequesters;
                     // Post second-pass requests to the next frame
                     getRunQueue().post(new Runnable() {
                         @Override
                         public void run() {
                             int numValidRequests = finalRequesters.size();
                             for (int i = 0; i < numValidRequests; ++i) {
                                 final View view = finalRequesters.get(i);
                                 Log.w("View", "requestLayout() improperly called by " + view +
                                         " during second layout pass: posting in next frame");
                                 view.requestLayout();
                             }
                         }
                     });
                 }
             }

         }
     } finally {
         Trace.traceEnd(Trace.TRACE_TAG_VIEW);
     }
     mInLayout = false;
 }

大家可以看到其核心功能是通过View类的requestLayout()函数实现的,该函数和上一回中提到的measure()函数在同一个文件中,大家可以去看它的实现。

各位看官,关于Androd中View的内部流程的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

猜你喜欢

转载自blog.csdn.net/talk_8/article/details/88936082