FrameLayout.java revision 9e3b002d3f9141d54948a65e0330fdcd09e75a30
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.widget; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19de35ceeeb9f8855c72dfd70593e917aa75b43770Fabrice Di Meglioimport java.util.ArrayList; 20de35ceeeb9f8855c72dfd70593e917aa75b43770Fabrice Di Meglio 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Canvas; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Region; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 28de35ceeeb9f8855c72dfd70593e917aa75b43770Fabrice Di Meglioimport android.view.Gravity; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 30958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackbornimport android.view.ViewDebug; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.RemoteViews.RemoteView; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * FrameLayout is designed to block out an area on the screen to display 37606e8cca6ac0e9a65a1a92003511b7c66d9ea439Romain Guy * a single item. You can add multiple children to a FrameLayout and control their 38606e8cca6ac0e9a65a1a92003511b7c66d9ea439Romain Guy * position within the FrameLayout using {@link android.widget.FrameLayout.LayoutParams#gravity}. 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Children are drawn in a stack, with the most recently added child on top. 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The size of the frame layout is the size of its largest child (plus padding), visible 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or not (if the FrameLayout's parent permits). Views that are GONE are used for sizing 421ba7b7efae72b1e14a2443a4d984cbac5d010f99Steve Block * only if {@link #setMeasureAllChildren(boolean) setMeasureAllChildren()} 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is set to true. 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#FrameLayout_foreground 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#FrameLayout_foregroundGravity 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#FrameLayout_measureAllChildren 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@RemoteView 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class FrameLayout extends ViewGroup { 519c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy private static final int DEFAULT_CHILD_GRAVITY = Gravity.TOP | Gravity.LEFT; 529c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy 53bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "measurement") 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mMeasureAllChildren = false; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 56bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "drawing") 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mForeground; 58bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev 59bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "padding") 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mForegroundPaddingLeft = 0; 61bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev 62bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "padding") 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mForegroundPaddingTop = 0; 64bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev 65bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "padding") 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mForegroundPaddingRight = 0; 67bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev 68bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "padding") 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mForegroundPaddingBottom = 0; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Rect mSelfBounds = new Rect(); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Rect mOverlayBounds = new Rect(); 73bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev 74bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "drawing") 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mForegroundGravity = Gravity.FILL; 76883e7eb389d55866f329150f258a70104abb10d7Karl Rosaen 77883e7eb389d55866f329150f258a70104abb10d7Karl Rosaen /** {@hide} */ 78bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "drawing") 79883e7eb389d55866f329150f258a70104abb10d7Karl Rosaen protected boolean mForegroundInPadding = true; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 81958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn boolean mForegroundBoundsChanged = false; 82958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn 839c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy private final ArrayList<View> mMatchParentChildren = new ArrayList<View>(1); 849c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public FrameLayout(Context context) { 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public FrameLayout(Context context, AttributeSet attrs) { 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, attrs, 0); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public FrameLayout(Context context, AttributeSet attrs, int defStyle) { 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs, defStyle); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.FrameLayout, 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project defStyle, 0); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 99105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundGravity = a.getInt( 100105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project com.android.internal.R.styleable.FrameLayout_foregroundGravity, mForegroundGravity); 101105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Drawable d = a.getDrawable(com.android.internal.R.styleable.FrameLayout_foreground); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setForeground(d); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a.getBoolean(com.android.internal.R.styleable.FrameLayout_measureAllChildren, false)) { 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMeasureAllChildren(true); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 111105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundInPadding = a.getBoolean( 112105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project com.android.internal.R.styleable.FrameLayout_foregroundInsidePadding, true); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1189e3b002d3f9141d54948a65e0330fdcd09e75a30Fabrice Di Meglio * Describes how the foreground is positioned. Defaults to START and TOP. 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param foregroundGravity See {@link android.view.Gravity} 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#FrameLayout_foregroundGravity 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @android.view.RemotableViewMethod 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setForegroundGravity(int foregroundGravity) { 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mForegroundGravity != foregroundGravity) { 1276a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio if ((foregroundGravity & Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK) == 0) { 1289e3b002d3f9141d54948a65e0330fdcd09e75a30Fabrice Di Meglio foregroundGravity |= Gravity.START; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((foregroundGravity & Gravity.VERTICAL_GRAVITY_MASK) == 0) { 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project foregroundGravity |= Gravity.TOP; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mForegroundGravity = foregroundGravity; 136105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 137105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 138105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mForegroundGravity == Gravity.FILL && mForeground != null) { 139105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project Rect padding = new Rect(); 140105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mForeground.getPadding(padding)) { 141105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundPaddingLeft = padding.left; 142105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundPaddingTop = padding.top; 143105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundPaddingRight = padding.right; 144105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundPaddingBottom = padding.bottom; 145105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 146105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } else { 147105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundPaddingLeft = 0; 148105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundPaddingTop = 0; 149105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundPaddingRight = 0; 150105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundPaddingBottom = 0; 151105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 152105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestLayout(); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean verifyDrawable(Drawable who) { 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.verifyDrawable(who) || (who == mForeground); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 165e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn @Override 166e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn public void jumpDrawablesToCurrentState() { 167e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn super.jumpDrawablesToCurrentState(); 168e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn if (mForeground != null) mForeground.jumpToCurrentState(); 169e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn } 170e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void drawableStateChanged() { 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.drawableStateChanged(); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mForeground != null && mForeground.isStateful()) { 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mForeground.setState(getDrawableState()); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a set of layout parameters with a width of 184980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * {@link android.view.ViewGroup.LayoutParams#MATCH_PARENT}, 185980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * and a height of {@link android.view.ViewGroup.LayoutParams#MATCH_PARENT}. 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected LayoutParams generateDefaultLayoutParams() { 189980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Supply a Drawable that is to be rendered on top of all of the child 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * views in the frame layout. Any padding in the Drawable will be taken 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * into account by ensuring that the children are inset to be placed 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inside of the padding area. 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param drawable The Drawable to be drawn on top of the children. 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#FrameLayout_foreground 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setForeground(Drawable drawable) { 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mForeground != drawable) { 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mForeground != null) { 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mForeground.setCallback(null); 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unscheduleDrawable(mForeground); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mForeground = drawable; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mForegroundPaddingLeft = 0; 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mForegroundPaddingTop = 0; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mForegroundPaddingRight = 0; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mForegroundPaddingBottom = 0; 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (drawable != null) { 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setWillNotDraw(false); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawable.setCallback(this); 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (drawable.isStateful()) { 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawable.setState(getDrawableState()); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 221105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mForegroundGravity == Gravity.FILL) { 222105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project Rect padding = new Rect(); 223105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (drawable.getPadding(padding)) { 224105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundPaddingLeft = padding.left; 225105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundPaddingTop = padding.top; 226105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundPaddingRight = padding.right; 227105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundPaddingBottom = padding.bottom; 228105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setWillNotDraw(true); 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestLayout(); 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate(); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the drawable used as the foreground of this FrameLayout. The 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * foreground drawable, if non-null, is always drawn on top of the children. 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A Drawable or null if no foreground was set. 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable getForeground() { 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mForeground; 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 2539c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy int count = getChildCount(); 2549c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy 2559c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy final boolean measureMatchParentChildren = 2569c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy MeasureSpec.getMode(widthMeasureSpec) != MeasureSpec.EXACTLY || 2579c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy MeasureSpec.getMode(heightMeasureSpec) != MeasureSpec.EXACTLY; 2589c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy mMatchParentChildren.clear(); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int maxHeight = 0; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int maxWidth = 0; 262189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn int childState = 0; 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View child = getChildAt(i); 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMeasureAllChildren || child.getVisibility() != GONE) { 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project measureChildWithMargins(child, widthMeasureSpec, 0, heightMeasureSpec, 0); 2682b6be701a90a4f0aefefcf8e70feb04722e1bcfeAdam Powell final LayoutParams lp = (LayoutParams) child.getLayoutParams(); 2692b6be701a90a4f0aefefcf8e70feb04722e1bcfeAdam Powell maxWidth = Math.max(maxWidth, 2702b6be701a90a4f0aefefcf8e70feb04722e1bcfeAdam Powell child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin); 2712b6be701a90a4f0aefefcf8e70feb04722e1bcfeAdam Powell maxHeight = Math.max(maxHeight, 2722b6be701a90a4f0aefefcf8e70feb04722e1bcfeAdam Powell child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin); 273189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn childState = combineMeasuredStates(childState, child.getMeasuredState()); 2749c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy if (measureMatchParentChildren) { 2759c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy if (lp.width == LayoutParams.MATCH_PARENT || 2769c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy lp.height == LayoutParams.MATCH_PARENT) { 2779c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy mMatchParentChildren.add(child); 2789c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy } 2799c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy } 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Account for padding too 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maxWidth += mPaddingLeft + mPaddingRight + mForegroundPaddingLeft + mForegroundPaddingRight; 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maxHeight += mPaddingTop + mPaddingBottom + mForegroundPaddingTop + mForegroundPaddingBottom; 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Check against our minimum height and width 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight()); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth()); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Check against our foreground's minimum height and width 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Drawable drawable = getForeground(); 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (drawable != null) { 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maxHeight = Math.max(maxHeight, drawable.getMinimumHeight()); 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maxWidth = Math.max(maxWidth, drawable.getMinimumWidth()); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 298189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, childState), 299189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn resolveSizeAndState(maxHeight, heightMeasureSpec, 3009c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy childState << MEASURED_HEIGHT_STATE_SHIFT)); 3019c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy 302a174d7a0d5475dbae2b48f7359abf1637a882896Romain Guy count = mMatchParentChildren.size(); 303a174d7a0d5475dbae2b48f7359abf1637a882896Romain Guy if (count > 1) { 3049c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy for (int i = 0; i < count; i++) { 3059c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy final View child = mMatchParentChildren.get(i); 3069c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy 3079c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams(); 3089c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy int childWidthMeasureSpec; 3099c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy int childHeightMeasureSpec; 310a174d7a0d5475dbae2b48f7359abf1637a882896Romain Guy 3119c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy if (lp.width == LayoutParams.MATCH_PARENT) { 3129c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(getMeasuredWidth() - 3139c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy mPaddingLeft - mPaddingRight - lp.leftMargin - lp.rightMargin, 3149c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy MeasureSpec.EXACTLY); 3159c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy } else { 3169c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec, 3179c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy mPaddingLeft + mPaddingRight + lp.leftMargin + lp.rightMargin, 3189c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy lp.width); 3199c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy } 3209c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy 3219c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy if (lp.height == LayoutParams.MATCH_PARENT) { 3229c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(getMeasuredHeight() - 3239c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy mPaddingTop - mPaddingBottom - lp.topMargin - lp.bottomMargin, 3249c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy MeasureSpec.EXACTLY); 3259c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy } else { 326cf70dcb0f76d1175f1d3c31da1c827eb443a323aRomain Guy childHeightMeasureSpec = getChildMeasureSpec(heightMeasureSpec, 3279c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy mPaddingTop + mPaddingBottom + lp.topMargin + lp.bottomMargin, 3289c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy lp.height); 3299c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy } 3309c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy 3319c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy child.measure(childWidthMeasureSpec, childHeightMeasureSpec); 3329c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy } 3339c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy } 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = getChildCount(); 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int parentLeft = mPaddingLeft + mForegroundPaddingLeft; 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int parentRight = right - left - mPaddingRight - mForegroundPaddingRight; 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int parentTop = mPaddingTop + mForegroundPaddingTop; 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int parentBottom = bottom - top - mPaddingBottom - mForegroundPaddingBottom; 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn mForegroundBoundsChanged = true; 350958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View child = getChildAt(i); 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (child.getVisibility() != GONE) { 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final LayoutParams lp = (LayoutParams) child.getLayoutParams(); 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int width = child.getMeasuredWidth(); 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int height = child.getMeasuredHeight(); 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3599c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy int childLeft; 3609c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy int childTop; 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3625e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell int gravity = lp.gravity; 3635e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell if (gravity == -1) { 3645e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell gravity = DEFAULT_CHILD_GRAVITY; 3655e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell } 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 367de35ceeeb9f8855c72dfd70593e917aa75b43770Fabrice Di Meglio final int absoluteGravity = Gravity.getAbsoluteGravity(gravity, isLayoutRtl()); 3685e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell final int verticalGravity = gravity & Gravity.VERTICAL_GRAVITY_MASK; 3695e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell 370de35ceeeb9f8855c72dfd70593e917aa75b43770Fabrice Di Meglio switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) { 3715e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell case Gravity.LEFT: 3725e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell childLeft = parentLeft + lp.leftMargin; 3735e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell break; 3745e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell case Gravity.CENTER_HORIZONTAL: 3755e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell childLeft = parentLeft + (parentRight - parentLeft - width) / 2 + 3765e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell lp.leftMargin - lp.rightMargin; 3775e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell break; 3785e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell case Gravity.RIGHT: 3795e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell childLeft = parentRight - width - lp.rightMargin; 3805e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell break; 3815e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell default: 3825e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell childLeft = parentLeft + lp.leftMargin; 3835e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell } 3845e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell 3855e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell switch (verticalGravity) { 3865e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell case Gravity.TOP: 3875e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell childTop = parentTop + lp.topMargin; 3885e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell break; 3895e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell case Gravity.CENTER_VERTICAL: 3905e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell childTop = parentTop + (parentBottom - parentTop - height) / 2 + 3915e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell lp.topMargin - lp.bottomMargin; 3925e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell break; 3935e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell case Gravity.BOTTOM: 3945e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell childTop = parentBottom - height - lp.bottomMargin; 3955e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell break; 3965e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell default: 3975e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell childTop = parentTop + lp.topMargin; 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.layout(childLeft, childTop, childLeft + width, childTop + height); 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onSizeChanged(int w, int h, int oldw, int oldh) { 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onSizeChanged(w, h, oldw, oldh); 411958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn mForegroundBoundsChanged = true; 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void draw(Canvas canvas) { 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.draw(canvas); 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mForeground != null) { 422958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn final Drawable foreground = mForeground; 42382f3495b146b267f3786997752cef25310176349Romain Guy 424958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn if (mForegroundBoundsChanged) { 425958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn mForegroundBoundsChanged = false; 42682f3495b146b267f3786997752cef25310176349Romain Guy final Rect selfBounds = mSelfBounds; 42782f3495b146b267f3786997752cef25310176349Romain Guy final Rect overlayBounds = mOverlayBounds; 428958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn 42982f3495b146b267f3786997752cef25310176349Romain Guy final int w = mRight-mLeft; 43082f3495b146b267f3786997752cef25310176349Romain Guy final int h = mBottom-mTop; 43182f3495b146b267f3786997752cef25310176349Romain Guy 43282f3495b146b267f3786997752cef25310176349Romain Guy if (mForegroundInPadding) { 43382f3495b146b267f3786997752cef25310176349Romain Guy selfBounds.set(0, 0, w, h); 43482f3495b146b267f3786997752cef25310176349Romain Guy } else { 43582f3495b146b267f3786997752cef25310176349Romain Guy selfBounds.set(mPaddingLeft, mPaddingTop, w - mPaddingRight, h - mPaddingBottom); 436958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn } 43782f3495b146b267f3786997752cef25310176349Romain Guy 43882f3495b146b267f3786997752cef25310176349Romain Guy Gravity.apply(mForegroundGravity, foreground.getIntrinsicWidth(), 4396a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio foreground.getIntrinsicHeight(), selfBounds, overlayBounds, isLayoutRtl()); 44082f3495b146b267f3786997752cef25310176349Romain Guy foreground.setBounds(overlayBounds); 441958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn } 442958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn 443958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn foreground.draw(canvas); 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean gatherTransparentRegion(Region region) { 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean opaque = super.gatherTransparentRegion(region); 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (region != null && mForeground != null) { 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applyDrawableToTransparentRegion(mForeground, region); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return opaque; 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Determines whether to measure all children or just those in 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the VISIBLE or INVISIBLE state when measuring. Defaults to false. 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param measureAll true to consider children marked GONE, false otherwise. 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Default value is false. 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#FrameLayout_measureAllChildren 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @android.view.RemotableViewMethod 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setMeasureAllChildren(boolean measureAll) { 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMeasureAllChildren = measureAll; 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Determines whether to measure all children or just those in 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the VISIBLE or INVISIBLE state when measuring. 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getConsiderGoneChildrenWhenMeasuring() { 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMeasureAllChildren; 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams generateLayoutParams(AttributeSet attrs) { 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new FrameLayout.LayoutParams(getContext(), attrs); 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 488e0a799a2ac1ca78e30fbac9e4e12a063425c08d3Patrick Dubroy @Override 489e0a799a2ac1ca78e30fbac9e4e12a063425c08d3Patrick Dubroy public boolean shouldDelayChildPressedState() { 490e0a799a2ac1ca78e30fbac9e4e12a063425c08d3Patrick Dubroy return false; 491e0a799a2ac1ca78e30fbac9e4e12a063425c08d3Patrick Dubroy } 492e0a799a2ac1ca78e30fbac9e4e12a063425c08d3Patrick Dubroy 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p instanceof LayoutParams; 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new LayoutParams(p); 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Per-child layout information for layouts that support margins. 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See {@link android.R.styleable#FrameLayout_Layout FrameLayout Layout Attributes} 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for a list of all child view attributes that this class supports. 510606e8cca6ac0e9a65a1a92003511b7c66d9ea439Romain Guy * 511606e8cca6ac0e9a65a1a92003511b7c66d9ea439Romain Guy * @attr ref android.R.styleable#FrameLayout_Layout_layout_gravity 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class LayoutParams extends MarginLayoutParams { 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The gravity to apply with the View to which these layout parameters 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are associated. 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.view.Gravity 519606e8cca6ac0e9a65a1a92003511b7c66d9ea439Romain Guy * 520606e8cca6ac0e9a65a1a92003511b7c66d9ea439Romain Guy * @attr ref android.R.styleable#FrameLayout_Layout_layout_gravity 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int gravity = -1; 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(Context c, AttributeSet attrs) { 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(c, attrs); 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = c.obtainStyledAttributes(attrs, com.android.internal.R.styleable.FrameLayout_Layout); 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gravity = a.getInt(com.android.internal.R.styleable.FrameLayout_Layout_layout_gravity, -1); 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(int width, int height) { 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(width, height); 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new set of layout parameters with the specified width, height 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and weight. 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 546980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * @param width the width, either {@link #MATCH_PARENT}, 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #WRAP_CONTENT} or a fixed size in pixels 548980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * @param height the height, either {@link #MATCH_PARENT}, 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #WRAP_CONTENT} or a fixed size in pixels 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param gravity the gravity 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.view.Gravity 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(int width, int height, int gravity) { 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(width, height); 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.gravity = gravity; 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(ViewGroup.LayoutParams source) { 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(source); 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(ViewGroup.MarginLayoutParams source) { 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(source); 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 574