1page.title=How Android Draws Views 2parent.title=User Interface 3parent.link=index.html 4@jd:body 5 6 7<p>When an {@link android.app.Activity} receives focus, it will be requested to 8draw its layout. 9The Android framework will handle the procedure for drawing, but the 10{@link android.app.Activity} must provide 11the root node of its layout hierarchy.</p> 12 13<p>Drawing begins with the root node of the layout. It is requested to measure and 14draw the layout tree. Drawing is handled by walking the tree and rendering each 15{@link android.view.View} that intersects the invalid region. In turn, each 16{@link android.view.ViewGroup} is responsible for requesting 17each of its children to be drawn 18(with the {@link android.view.View#draw(Canvas) draw()} method) 19and each {@link android.view.View} is responsible for drawing itself. 20 Because the tree is traversed in-order, 21 this means that parents will be drawn before (i.e., behind) their children, with 22 siblings drawn in the order they appear in the tree. 23 </p> 24 25<div class="sidebox-wrapper"> 26<div class="sidebox"> 27 <p>The framework will not draw {@link android.view.View} objects that are not 28in the invalid region, and also 29 will take care of drawing the {@link android.view.View} background for you.</p> 30 <p>You can force a {@link android.view.View} to draw, by calling 31{@link android.view.View#invalidate()}. 32 </p> 33</div> 34</div> 35 36<p> 37 Drawing the layout is a two pass process: a measure pass and a layout pass. 38The measuring pass is implemented in {@link android.view.View#measure(int, int)} 39and is a top-down traversal of the {@link android.view.View} tree. Each {@link android.view.View} 40pushes dimension specifications down the tree 41 during the recursion. At the end of the measure pass, every 42{@link android.view.View} has stored 43 its measurements. The second pass happens in 44 {@link android.view.View#layout(int,int,int,int)} and is also top-down. During 45 this pass each parent is responsible for positioning all of its children 46 using the sizes computed in the measure pass. 47 </p> 48 49 <p> 50 When a {@link android.view.View} object's 51{@link android.view.View#measure(int, int) measure()} method 52returns, its {@link android.view.View#getMeasuredWidth()} and 53 {@link android.view.View#getMeasuredHeight()} values must be set, along 54 with those for all of that {@link android.view.View} object's descendants. 55A {@link android.view.View} object's measured width and 56measured height values must respect the constraints imposed by the 57{@link android.view.View} object's parents. This guarantees 58 that at the end of the measure pass, all parents accept all of their 59 children's measurements. A parent {@link android.view.View} may call 60{@link android.view.View#measure(int, int) measure()} more than once on 61 its children. For example, the parent may measure each child once with 62 unspecified dimensions to find out how big they want to be, then call 63 {@link android.view.View#measure(int, int) measure()} on them again with 64actual numbers if the sum of all the children's 65 unconstrained sizes is too big or too small (that is, if the children 66don't agree among themselves 67 as to how much space they each get, the parent will intervene and set 68the rules on the second pass). 69 </p> 70 71<div class="sidebox-wrapper"> 72<div class="sidebox"><p> 73 To initiate a layout, call {@link android.view.View#requestLayout}. 74This method is typically 75 called by a {@link android.view.View} on itself 76when it believes that is can no longer fit within 77 its current bounds.</p> 78</div> 79</div> 80 81 <p> 82 The measure pass uses two classes to communicate dimensions. The 83 {@link android.view.ViewGroup.LayoutParams} class is used by 84{@link android.view.View} objects to tell their parents how they 85 want to be measured and positioned. The base 86{@link android.view.ViewGroup.LayoutParams} class just 87 describes how big the {@link android.view.View} wants to be for both 88width and height. For each 89 dimension, it can specify one of:</p> 90 <ul> 91 <li> an exact number 92 <li>{@link android.view.ViewGroup.LayoutParams#MATCH_PARENT MATCH_PARENT}, 93which means the {@link android.view.View} wants to be as big as its parent 94 (minus padding)</li> 95 <li>{@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT WRAP_CONTENT}, 96which means that the {@link android.view.View} wants to be just big enough to 97 enclose its content (plus padding).</li> 98 </ul> 99 <p>There are subclasses of {@link android.view.ViewGroup.LayoutParams} for 100different subclasses of {@link android.view.ViewGroup}. 101 For example, {@link android.widget.RelativeLayout} has its own subclass of 102{@link android.view.ViewGroup.LayoutParams}, which includes 103 the ability to center child {@link android.view.View} objects 104horizontally and vertically. 105 </p> 106 107 <p> 108 {@link android.view.View.MeasureSpec MeasureSpec} objects are used to push 109requirements down the tree from parent to 110 child. A {@link android.view.View.MeasureSpec MeasureSpec} can be in one of 111three modes:</p> 112 <ul> 113 <li>{@link android.view.View.MeasureSpec#UNSPECIFIED UNSPECIFIED}: This is 114used by a parent to determine the desired dimension 115 of a child {@link android.view.View}. For example, a 116{@link android.widget.LinearLayout} may call 117{@link android.view.View#measure(int, int) measure()} on its child 118 with the height set to {@link android.view.View.MeasureSpec#UNSPECIFIED UNSPECIFIED} 119and a width of {@link android.view.View.MeasureSpec#EXACTLY EXACTLY} 240 to 120find out how tall the child {@link android.view.View} wants to be given a 121width of 240 pixels.</li> 122 <li>{@link android.view.View.MeasureSpec#EXACTLY EXACTLY}: This is used 123by the parent to impose an exact size on the 124 child. The child must use this size, and guarantee that all of its 125 descendants will fit within this size.</li> 126 <li>{@link android.view.View.MeasureSpec#AT_MOST AT MOST}: This is used by 127the parent to impose a maximum size on the 128 child. The child must guarantee that it and all of its descendants will fit 129 within this size.</li> 130 </ul> 131 132 133 134