diff options
| author | The Android Open Source Project <initial-contribution@android.com> | 2009-02-10 15:44:00 -0800 | 
|---|---|---|
| committer | The Android Open Source Project <initial-contribution@android.com> | 2009-02-10 15:44:00 -0800 | 
| commit | d24b8183b93e781080b2c16c487e60d51c12da31 (patch) | |
| tree | fbb89154858984eb8e41556da7e9433040d55cd4 /docs/html/guide/topics/ui/how-android-draws.jd | |
| parent | f1e484acb594a726fb57ad0ae4cfe902c7f35858 (diff) | |
| download | frameworks_base-d24b8183b93e781080b2c16c487e60d51c12da31.zip frameworks_base-d24b8183b93e781080b2c16c487e60d51c12da31.tar.gz frameworks_base-d24b8183b93e781080b2c16c487e60d51c12da31.tar.bz2  | |
auto import from //branches/cupcake/...@130745
Diffstat (limited to 'docs/html/guide/topics/ui/how-android-draws.jd')
| -rw-r--r-- | docs/html/guide/topics/ui/how-android-draws.jd | 94 | 
1 files changed, 94 insertions, 0 deletions
diff --git a/docs/html/guide/topics/ui/how-android-draws.jd b/docs/html/guide/topics/ui/how-android-draws.jd new file mode 100644 index 0000000..a511005 --- /dev/null +++ b/docs/html/guide/topics/ui/how-android-draws.jd @@ -0,0 +1,94 @@ +page.title=How Android Draws Views +parent.title=User Interface +parent.link=index.html +@jd:body + + +<p>When an Activity receives focus, it will be requested to draw its layout. +The Android framework will handle the procedure for drawing, but the Activity must provide +the root node of its layout hierarchy.</p> + +<p>Drawing begins with the root node of the layout. It is requested to measure and  +draw the layout tree. Drawing is handled by walking the tree and rendering each View that +   intersects the invalid region. In turn, each View group is responsible for requesting +each of its children to be drawn (with the <code>{@link android.view.View#draw(Canvas) draw()}</code> method)  +and each View is responsible for drawing itself. + Because the tree is traversed in-order, +   this means that parents will be drawn before (i.e., behind) their children, with +   siblings drawn in the order they appear in the tree. +   </p> + +<div class="sidebox"> +  <p>The framework will not draw Views that are not in the invalid region, and also  +   will take care of drawing the Views background for you.</p> +   <p>You can force a View to draw, by calling <code>{@link android.view.View#invalidate()}</code>. +   </p> +</div> + +<p> +   Drawing the layout is a two pass process: a measure pass and a layout pass. The measuring +   pass is implemented in <code>{@link android.view.View#measure(int, int)}</code> and is a top-down traversal +   of the View tree. Each View pushes dimension specifications down the tree +   during the recursion. At the end of the measure pass, every View has stored +   its measurements. The second pass happens in +   <code>{@link android.view.View#layout(int,int,int,int)}</code> and is also top-down. During +   this pass each parent is responsible for positioning all of its children +   using the sizes computed in the measure pass. +   </p> +    +   <p> +   When a View's <code>measure()</code> method returns, its <code>{@link android.view.View#getMeasuredWidth()}</code> and +   <code>{@link android.view.View#getMeasuredHeight()}</code> values must be set, along with those for all of +   that View's descendants. A View's measured width and measured height values +   must respect the constraints imposed by the View's parents. This guarantees +   that at the end of the measure pass, all parents accept all of their +   children's measurements. A parent View may call <code>measure()</code> more than once on +   its children. For example, the parent may measure each child once with +   unspecified dimensions to find out how big they want to be, then call +   <code>measure()</code> on them again with actual numbers if the sum of all the children's +   unconstrained sizes is too big or too small (i.e., if the children don't agree among themselves +  as to how much space they each get, the parent will intervene and set the rules on the second pass). +   </p> +    +   <div class="sidebox"><p> +   To intiate a layout, call <code>{@link android.view.View#requestLayout}</code>. This method is typically +   called by a View on itself when it believes that is can no longer fit within +   its current bounds.</p> +   </div> + +   <p> +   The measure pass uses two classes to communicate dimensions. The +   {@link android.view.View.MeasureSpec} class is used by Views to tell their parents how they +   want to be measured and positioned. The base LayoutParams class just +   describes how big the View wants to be for both width and height. For each +   dimension, it can specify one of:</p> +   <ul> +    <li> an exact number +    <li><var>FILL_PARENT</var>, which means the View wants to be as big as its parent +    (minus padding)</li> +    <li><var>WRAP_CONTENT</var>, which means that the View wants to be just big enough to +    enclose its content (plus padding).</li> +   </ul> +  <p>There are subclasses of LayoutParams for different subclasses of ViewGroup. +   For example, AbsoluteLayout has its own subclass of LayoutParams which adds +   an X and Y value. +   </p> +    +   <p> +   MeasureSpecs are used to push requirements down the tree from parent to +   child. A MeasureSpec can be in one of three modes:</p> +   <ul> +    <li><var>UNSPECIFIED</var>: This is used by a parent to determine the desired dimension +    of a child View. For example, a LinearLayout may call <code>measure()</code> on its child +    with the height set to <var>UNSPECIFIED</var> and a width of <var>EXACTLY</var> 240 to find out how +    tall the child View wants to be given a width of 240 pixels.</li> +    <li><var>EXACTLY</var>: This is used by the parent to impose an exact size on the +    child. The child must use this size, and guarantee that all of its +    descendants will fit within this size.</li> +    <li><var>AT_MOST</var>: This is used by the parent to impose a maximum size on the +    child. The child must gurantee that it and all of its descendants will fit +    within this size.</li> +   </ul> +    + +  | 
