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;
328a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganovimport android.view.accessibility.AccessibilityEvent;
338a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganovimport android.view.accessibility.AccessibilityNodeInfo;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.RemoteViews.RemoteView;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * FrameLayout is designed to block out an area on the screen to display
39812634c236b83e100c8473d607e44f8d8c48e805Scott Main * a single item. Generally, FrameLayout should be used to hold a single child view, because it can
40812634c236b83e100c8473d607e44f8d8c48e805Scott Main * be difficult to organize child views in a way that's scalable to different screen sizes without
41812634c236b83e100c8473d607e44f8d8c48e805Scott Main * the children overlapping each other. You can, however, add multiple children to a FrameLayout
42812634c236b83e100c8473d607e44f8d8c48e805Scott Main * and control their position within the FrameLayout by assigning gravity to each child, using the
43812634c236b83e100c8473d607e44f8d8c48e805Scott Main * <a href="FrameLayout.LayoutParams.html#attr_android:layout_gravity">{@code
44812634c236b83e100c8473d607e44f8d8c48e805Scott Main * android:layout_gravity}</a> attribute.
45812634c236b83e100c8473d607e44f8d8c48e805Scott Main * <p>Child views are drawn in a stack, with the most recently added child on top.
46812634c236b83e100c8473d607e44f8d8c48e805Scott Main * The size of the FrameLayout is the size of its largest child (plus padding), visible
47812634c236b83e100c8473d607e44f8d8c48e805Scott Main * or not (if the FrameLayout's parent permits). Views that are {@link android.view.View#GONE} are
48812634c236b83e100c8473d607e44f8d8c48e805Scott Main * used for sizing
49812634c236b83e100c8473d607e44f8d8c48e805Scott Main * only if {@link #setMeasureAllChildren(boolean) setConsiderGoneChildrenWhenMeasuring()}
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is set to true.
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#FrameLayout_foreground
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#FrameLayout_foregroundGravity
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#FrameLayout_measureAllChildren
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@RemoteView
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class FrameLayout extends ViewGroup {
58aac0d4ed026d1cfbcf3fa81c6e4eb96f4347ca17Fabrice Di Meglio    private static final int DEFAULT_CHILD_GRAVITY = Gravity.TOP | Gravity.START;
599c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy
60bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev    @ViewDebug.ExportedProperty(category = "measurement")
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mMeasureAllChildren = false;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev    @ViewDebug.ExportedProperty(category = "drawing")
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Drawable mForeground;
65bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev
66bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev    @ViewDebug.ExportedProperty(category = "padding")
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mForegroundPaddingLeft = 0;
68bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev
69bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev    @ViewDebug.ExportedProperty(category = "padding")
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mForegroundPaddingTop = 0;
71bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev
72bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev    @ViewDebug.ExportedProperty(category = "padding")
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mForegroundPaddingRight = 0;
74bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev
75bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev    @ViewDebug.ExportedProperty(category = "padding")
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mForegroundPaddingBottom = 0;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Rect mSelfBounds = new Rect();
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Rect mOverlayBounds = new Rect();
80bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev
81bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev    @ViewDebug.ExportedProperty(category = "drawing")
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mForegroundGravity = Gravity.FILL;
83883e7eb389d55866f329150f258a70104abb10d7Karl Rosaen
84883e7eb389d55866f329150f258a70104abb10d7Karl Rosaen    /** {@hide} */
85bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev    @ViewDebug.ExportedProperty(category = "drawing")
86883e7eb389d55866f329150f258a70104abb10d7Karl Rosaen    protected boolean mForegroundInPadding = true;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
88958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn    boolean mForegroundBoundsChanged = false;
89958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn
909c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy    private final ArrayList<View> mMatchParentChildren = new ArrayList<View>(1);
919c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FrameLayout(Context context) {
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FrameLayout(Context context, AttributeSet attrs) {
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this(context, attrs, 0);
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FrameLayout(Context context, AttributeSet attrs, int defStyle) {
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context, attrs, defStyle);
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.FrameLayout,
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    defStyle, 0);
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
106105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mForegroundGravity = a.getInt(
107105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                com.android.internal.R.styleable.FrameLayout_foregroundGravity, mForegroundGravity);
108105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Drawable d = a.getDrawable(com.android.internal.R.styleable.FrameLayout_foreground);
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (d != null) {
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setForeground(d);
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (a.getBoolean(com.android.internal.R.styleable.FrameLayout_measureAllChildren, false)) {
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setMeasureAllChildren(true);
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
118105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mForegroundInPadding = a.getBoolean(
119105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                com.android.internal.R.styleable.FrameLayout_foregroundInsidePadding, true);
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.recycle();
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1251018fb42cb4958511a141787705aa429c5ec9bd3Philip Milne     * Describes how the foreground is positioned.
1261018fb42cb4958511a141787705aa429c5ec9bd3Philip Milne     *
1271018fb42cb4958511a141787705aa429c5ec9bd3Philip Milne     * @return foreground gravity.
1281018fb42cb4958511a141787705aa429c5ec9bd3Philip Milne     *
1291018fb42cb4958511a141787705aa429c5ec9bd3Philip Milne     * @see #setForegroundGravity(int)
1301018fb42cb4958511a141787705aa429c5ec9bd3Philip Milne     *
1311018fb42cb4958511a141787705aa429c5ec9bd3Philip Milne     * @attr ref android.R.styleable#FrameLayout_foregroundGravity
1321018fb42cb4958511a141787705aa429c5ec9bd3Philip Milne     */
1331018fb42cb4958511a141787705aa429c5ec9bd3Philip Milne    public int getForegroundGravity() {
1341018fb42cb4958511a141787705aa429c5ec9bd3Philip Milne        return mForegroundGravity;
1351018fb42cb4958511a141787705aa429c5ec9bd3Philip Milne    }
1361018fb42cb4958511a141787705aa429c5ec9bd3Philip Milne
1371018fb42cb4958511a141787705aa429c5ec9bd3Philip Milne    /**
1389e3b002d3f9141d54948a65e0330fdcd09e75a30Fabrice Di Meglio     * Describes how the foreground is positioned. Defaults to START and TOP.
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param foregroundGravity See {@link android.view.Gravity}
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1421018fb42cb4958511a141787705aa429c5ec9bd3Philip Milne     * @see #getForegroundGravity()
1431018fb42cb4958511a141787705aa429c5ec9bd3Philip Milne     *
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#FrameLayout_foregroundGravity
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @android.view.RemotableViewMethod
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setForegroundGravity(int foregroundGravity) {
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mForegroundGravity != foregroundGravity) {
1496a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio            if ((foregroundGravity & Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK) == 0) {
1509e3b002d3f9141d54948a65e0330fdcd09e75a30Fabrice Di Meglio                foregroundGravity |= Gravity.START;
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((foregroundGravity & Gravity.VERTICAL_GRAVITY_MASK) == 0) {
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                foregroundGravity |= Gravity.TOP;
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mForegroundGravity = foregroundGravity;
158105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
159105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
160105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (mForegroundGravity == Gravity.FILL && mForeground != null) {
161105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                Rect padding = new Rect();
162105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                if (mForeground.getPadding(padding)) {
163105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    mForegroundPaddingLeft = padding.left;
164105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    mForegroundPaddingTop = padding.top;
165105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    mForegroundPaddingRight = padding.right;
166105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    mForegroundPaddingBottom = padding.bottom;
167105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                }
168105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            } else {
169105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mForegroundPaddingLeft = 0;
170105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mForegroundPaddingTop = 0;
171105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mForegroundPaddingRight = 0;
172105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mForegroundPaddingBottom = 0;
173105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
174105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            requestLayout();
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected boolean verifyDrawable(Drawable who) {
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return super.verifyDrawable(who) || (who == mForeground);
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
187e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn    @Override
188e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn    public void jumpDrawablesToCurrentState() {
189e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn        super.jumpDrawablesToCurrentState();
190e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn        if (mForeground != null) mForeground.jumpToCurrentState();
191e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn    }
192e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void drawableStateChanged() {
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.drawableStateChanged();
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mForeground != null && mForeground.isStateful()) {
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mForeground.setState(getDrawableState());
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns a set of layout parameters with a width of
206980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy     * {@link android.view.ViewGroup.LayoutParams#MATCH_PARENT},
207980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy     * and a height of {@link android.view.ViewGroup.LayoutParams#MATCH_PARENT}.
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected LayoutParams generateDefaultLayoutParams() {
211980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy        return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Supply a Drawable that is to be rendered on top of all of the child
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * views in the frame layout.  Any padding in the Drawable will be taken
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * into account by ensuring that the children are inset to be placed
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inside of the padding area.
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param drawable The Drawable to be drawn on top of the children.
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#FrameLayout_foreground
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setForeground(Drawable drawable) {
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mForeground != drawable) {
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mForeground != null) {
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mForeground.setCallback(null);
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                unscheduleDrawable(mForeground);
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mForeground = drawable;
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mForegroundPaddingLeft = 0;
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mForegroundPaddingTop = 0;
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mForegroundPaddingRight = 0;
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mForegroundPaddingBottom = 0;
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (drawable != null) {
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                setWillNotDraw(false);
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                drawable.setCallback(this);
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (drawable.isStateful()) {
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    drawable.setState(getDrawableState());
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
243105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                if (mForegroundGravity == Gravity.FILL) {
244105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    Rect padding = new Rect();
245105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    if (drawable.getPadding(padding)) {
246105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        mForegroundPaddingLeft = padding.left;
247105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        mForegroundPaddingTop = padding.top;
248105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        mForegroundPaddingRight = padding.right;
249105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        mForegroundPaddingBottom = padding.bottom;
250105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    }
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }  else {
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                setWillNotDraw(true);
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            requestLayout();
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            invalidate();
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the drawable used as the foreground of this FrameLayout. The
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * foreground drawable, if non-null, is always drawn on top of the children.
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return A Drawable or null if no foreground was set.
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Drawable getForeground() {
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mForeground;
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
270c4d712237cba31d0f34c6b96ea3533d4a8e1f028Fabrice Di Meglio    int getPaddingLeftWithForeground() {
27102473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka        return mForegroundInPadding ? Math.max(mPaddingLeft, mForegroundPaddingLeft) :
27202473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka            mPaddingLeft + mForegroundPaddingLeft;
27302473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka    }
27402473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka
275c4d712237cba31d0f34c6b96ea3533d4a8e1f028Fabrice Di Meglio    int getPaddingRightWithForeground() {
27602473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka        return mForegroundInPadding ? Math.max(mPaddingRight, mForegroundPaddingRight) :
27702473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka            mPaddingRight + mForegroundPaddingRight;
27802473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka    }
27902473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka
28002473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka    private int getPaddingTopWithForeground() {
28102473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka        return mForegroundInPadding ? Math.max(mPaddingTop, mForegroundPaddingTop) :
28202473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka            mPaddingTop + mForegroundPaddingTop;
28302473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka    }
28402473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka
28502473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka    private int getPaddingBottomWithForeground() {
28602473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka        return mForegroundInPadding ? Math.max(mPaddingBottom, mForegroundPaddingBottom) :
28702473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka            mPaddingBottom + mForegroundPaddingBottom;
28802473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka    }
28902473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka
29002473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
2969c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy        int count = getChildCount();
2979c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy
2989c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy        final boolean measureMatchParentChildren =
2999c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                MeasureSpec.getMode(widthMeasureSpec) != MeasureSpec.EXACTLY ||
3009c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                MeasureSpec.getMode(heightMeasureSpec) != MeasureSpec.EXACTLY;
3019c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy        mMatchParentChildren.clear();
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int maxHeight = 0;
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int maxWidth = 0;
305189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn        int childState = 0;
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < count; i++) {
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final View child = getChildAt(i);
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mMeasureAllChildren || child.getVisibility() != GONE) {
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                measureChildWithMargins(child, widthMeasureSpec, 0, heightMeasureSpec, 0);
3112b6be701a90a4f0aefefcf8e70feb04722e1bcfeAdam Powell                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
3122b6be701a90a4f0aefefcf8e70feb04722e1bcfeAdam Powell                maxWidth = Math.max(maxWidth,
3132b6be701a90a4f0aefefcf8e70feb04722e1bcfeAdam Powell                        child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin);
3142b6be701a90a4f0aefefcf8e70feb04722e1bcfeAdam Powell                maxHeight = Math.max(maxHeight,
3152b6be701a90a4f0aefefcf8e70feb04722e1bcfeAdam Powell                        child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin);
316189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                childState = combineMeasuredStates(childState, child.getMeasuredState());
3179c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                if (measureMatchParentChildren) {
3189c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                    if (lp.width == LayoutParams.MATCH_PARENT ||
3199c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                            lp.height == LayoutParams.MATCH_PARENT) {
3209c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                        mMatchParentChildren.add(child);
3219c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                    }
3229c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                }
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Account for padding too
32702473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka        maxWidth += getPaddingLeftWithForeground() + getPaddingRightWithForeground();
32802473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka        maxHeight += getPaddingTopWithForeground() + getPaddingBottomWithForeground();
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Check against our minimum height and width
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight());
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth());
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Check against our foreground's minimum height and width
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Drawable drawable = getForeground();
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (drawable != null) {
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            maxHeight = Math.max(maxHeight, drawable.getMinimumHeight());
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            maxWidth = Math.max(maxWidth, drawable.getMinimumWidth());
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
341189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn        setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, childState),
342189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                resolveSizeAndState(maxHeight, heightMeasureSpec,
3439c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                        childState << MEASURED_HEIGHT_STATE_SHIFT));
3449c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy
345a174d7a0d5475dbae2b48f7359abf1637a882896Romain Guy        count = mMatchParentChildren.size();
346a174d7a0d5475dbae2b48f7359abf1637a882896Romain Guy        if (count > 1) {
3479c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy            for (int i = 0; i < count; i++) {
3489c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                final View child = mMatchParentChildren.get(i);
3499c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy
3509c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();
3519c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                int childWidthMeasureSpec;
3529c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                int childHeightMeasureSpec;
353a174d7a0d5475dbae2b48f7359abf1637a882896Romain Guy
3549c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                if (lp.width == LayoutParams.MATCH_PARENT) {
3559c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                    childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(getMeasuredWidth() -
35602473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka                            getPaddingLeftWithForeground() - getPaddingRightWithForeground() -
35702473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka                            lp.leftMargin - lp.rightMargin,
3589c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                            MeasureSpec.EXACTLY);
3599c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                } else {
3609c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                    childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec,
36102473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka                            getPaddingLeftWithForeground() + getPaddingRightWithForeground() +
36202473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka                            lp.leftMargin + lp.rightMargin,
3639c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                            lp.width);
3649c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                }
3659c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy
3669c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                if (lp.height == LayoutParams.MATCH_PARENT) {
3679c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                    childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(getMeasuredHeight() -
36802473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka                            getPaddingTopWithForeground() - getPaddingBottomWithForeground() -
36902473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka                            lp.topMargin - lp.bottomMargin,
3709c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                            MeasureSpec.EXACTLY);
3719c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                } else {
372cf70dcb0f76d1175f1d3c31da1c827eb443a323aRomain Guy                    childHeightMeasureSpec = getChildMeasureSpec(heightMeasureSpec,
37302473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka                            getPaddingTopWithForeground() + getPaddingBottomWithForeground() +
37402473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka                            lp.topMargin + lp.bottomMargin,
3759c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                            lp.height);
3769c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                }
3779c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy
3789c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
3799c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy            }
3809c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy        }
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
388c4d712237cba31d0f34c6b96ea3533d4a8e1f028Fabrice Di Meglio        layoutChildren(left, top, right, bottom, false /* no force left gravity */);
389c4d712237cba31d0f34c6b96ea3533d4a8e1f028Fabrice Di Meglio    }
390c4d712237cba31d0f34c6b96ea3533d4a8e1f028Fabrice Di Meglio
391c4d712237cba31d0f34c6b96ea3533d4a8e1f028Fabrice Di Meglio    void layoutChildren(int left, int top, int right, int bottom,
392c4d712237cba31d0f34c6b96ea3533d4a8e1f028Fabrice Di Meglio                                  boolean forceLeftGravity) {
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int count = getChildCount();
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39502473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka        final int parentLeft = getPaddingLeftWithForeground();
39602473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka        final int parentRight = right - left - getPaddingRightWithForeground();
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39802473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka        final int parentTop = getPaddingTopWithForeground();
39902473da2b0a99d886d0dbcf5fba5619047855111Michael Jurka        final int parentBottom = bottom - top - getPaddingBottomWithForeground();
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
401958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn        mForegroundBoundsChanged = true;
402958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < count; i++) {
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final View child = getChildAt(i);
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (child.getVisibility() != GONE) {
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int width = child.getMeasuredWidth();
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int height = child.getMeasuredHeight();
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4119c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                int childLeft;
4129c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy                int childTop;
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4145e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell                int gravity = lp.gravity;
4155e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell                if (gravity == -1) {
4165e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell                    gravity = DEFAULT_CHILD_GRAVITY;
4175e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell                }
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419e56ffdc7b31b0937628609cc3bbaa15879023569Fabrice Di Meglio                final int layoutDirection = getLayoutDirection();
420c0053223bedf33581b0830fb87be32c1f26e5372Fabrice Di Meglio                final int absoluteGravity = Gravity.getAbsoluteGravity(gravity, layoutDirection);
4215e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell                final int verticalGravity = gravity & Gravity.VERTICAL_GRAVITY_MASK;
4225e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell
423de35ceeeb9f8855c72dfd70593e917aa75b43770Fabrice Di Meglio                switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
4245e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell                    case Gravity.CENTER_HORIZONTAL:
4255e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell                        childLeft = parentLeft + (parentRight - parentLeft - width) / 2 +
4265e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell                        lp.leftMargin - lp.rightMargin;
4275e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell                        break;
4285e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell                    case Gravity.RIGHT:
429c4d712237cba31d0f34c6b96ea3533d4a8e1f028Fabrice Di Meglio                        if (!forceLeftGravity) {
430c4d712237cba31d0f34c6b96ea3533d4a8e1f028Fabrice Di Meglio                            childLeft = parentRight - width - lp.rightMargin;
431c4d712237cba31d0f34c6b96ea3533d4a8e1f028Fabrice Di Meglio                            break;
432c4d712237cba31d0f34c6b96ea3533d4a8e1f028Fabrice Di Meglio                        }
433c4d712237cba31d0f34c6b96ea3533d4a8e1f028Fabrice Di Meglio                    case Gravity.LEFT:
4345e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell                    default:
4355e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell                        childLeft = parentLeft + lp.leftMargin;
4365e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell                }
4375e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell
4385e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell                switch (verticalGravity) {
4395e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell                    case Gravity.TOP:
4405e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell                        childTop = parentTop + lp.topMargin;
4415e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell                        break;
4425e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell                    case Gravity.CENTER_VERTICAL:
4435e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell                        childTop = parentTop + (parentBottom - parentTop - height) / 2 +
4445e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell                        lp.topMargin - lp.bottomMargin;
4455e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell                        break;
4465e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell                    case Gravity.BOTTOM:
4475e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell                        childTop = parentBottom - height - lp.bottomMargin;
4485e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell                        break;
4495e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell                    default:
4505e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell                        childTop = parentTop + lp.topMargin;
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                child.layout(childLeft, childTop, childLeft + width, childTop + height);
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onSizeChanged(w, h, oldw, oldh);
464958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn        mForegroundBoundsChanged = true;
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void draw(Canvas canvas) {
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.draw(canvas);
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mForeground != null) {
475958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            final Drawable foreground = mForeground;
47682f3495b146b267f3786997752cef25310176349Romain Guy
477958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            if (mForegroundBoundsChanged) {
478958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn                mForegroundBoundsChanged = false;
47982f3495b146b267f3786997752cef25310176349Romain Guy                final Rect selfBounds = mSelfBounds;
48082f3495b146b267f3786997752cef25310176349Romain Guy                final Rect overlayBounds = mOverlayBounds;
481958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn
48282f3495b146b267f3786997752cef25310176349Romain Guy                final int w = mRight-mLeft;
48382f3495b146b267f3786997752cef25310176349Romain Guy                final int h = mBottom-mTop;
48482f3495b146b267f3786997752cef25310176349Romain Guy
48582f3495b146b267f3786997752cef25310176349Romain Guy                if (mForegroundInPadding) {
48682f3495b146b267f3786997752cef25310176349Romain Guy                    selfBounds.set(0, 0, w, h);
48782f3495b146b267f3786997752cef25310176349Romain Guy                } else {
48882f3495b146b267f3786997752cef25310176349Romain Guy                    selfBounds.set(mPaddingLeft, mPaddingTop, w - mPaddingRight, h - mPaddingBottom);
489958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn                }
49082f3495b146b267f3786997752cef25310176349Romain Guy
491e56ffdc7b31b0937628609cc3bbaa15879023569Fabrice Di Meglio                final int layoutDirection = getLayoutDirection();
49282f3495b146b267f3786997752cef25310176349Romain Guy                Gravity.apply(mForegroundGravity, foreground.getIntrinsicWidth(),
493c0053223bedf33581b0830fb87be32c1f26e5372Fabrice Di Meglio                        foreground.getIntrinsicHeight(), selfBounds, overlayBounds,
494c0053223bedf33581b0830fb87be32c1f26e5372Fabrice Di Meglio                        layoutDirection);
49582f3495b146b267f3786997752cef25310176349Romain Guy                foreground.setBounds(overlayBounds);
496958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            }
497958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn
498958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            foreground.draw(canvas);
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean gatherTransparentRegion(Region region) {
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean opaque = super.gatherTransparentRegion(region);
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (region != null && mForeground != null) {
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            applyDrawableToTransparentRegion(mForeground, region);
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return opaque;
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
515b25825a1b159a469f80423800daa7f5b6250acceSteve Block     * Sets whether to consider all children, or just those in
516b25825a1b159a469f80423800daa7f5b6250acceSteve Block     * the VISIBLE or INVISIBLE state, when measuring. Defaults to false.
517b25825a1b159a469f80423800daa7f5b6250acceSteve Block     *
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param measureAll true to consider children marked GONE, false otherwise.
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default value is false.
520b25825a1b159a469f80423800daa7f5b6250acceSteve Block     *
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#FrameLayout_measureAllChildren
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @android.view.RemotableViewMethod
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setMeasureAllChildren(boolean measureAll) {
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMeasureAllChildren = measureAll;
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
527b25825a1b159a469f80423800daa7f5b6250acceSteve Block
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
529b25825a1b159a469f80423800daa7f5b6250acceSteve Block     * Determines whether all children, or just those in the VISIBLE or
530b25825a1b159a469f80423800daa7f5b6250acceSteve Block     * INVISIBLE state, are considered when measuring.
531b25825a1b159a469f80423800daa7f5b6250acceSteve Block     *
532b25825a1b159a469f80423800daa7f5b6250acceSteve Block     * @return Whether all children are considered when measuring.
533b25825a1b159a469f80423800daa7f5b6250acceSteve Block     *
534b25825a1b159a469f80423800daa7f5b6250acceSteve Block     * @deprecated This method is deprecated in favor of
535b25825a1b159a469f80423800daa7f5b6250acceSteve Block     * {@link #getMeasureAllChildren() getMeasureAllChildren()}, which was
536b25825a1b159a469f80423800daa7f5b6250acceSteve Block     * renamed for consistency with
537b25825a1b159a469f80423800daa7f5b6250acceSteve Block     * {@link #setMeasureAllChildren(boolean) setMeasureAllChildren()}.
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
539b25825a1b159a469f80423800daa7f5b6250acceSteve Block    @Deprecated
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean getConsiderGoneChildrenWhenMeasuring() {
541b25825a1b159a469f80423800daa7f5b6250acceSteve Block        return getMeasureAllChildren();
542b25825a1b159a469f80423800daa7f5b6250acceSteve Block    }
543b25825a1b159a469f80423800daa7f5b6250acceSteve Block
544b25825a1b159a469f80423800daa7f5b6250acceSteve Block    /**
545b25825a1b159a469f80423800daa7f5b6250acceSteve Block     * Determines whether all children, or just those in the VISIBLE or
546b25825a1b159a469f80423800daa7f5b6250acceSteve Block     * INVISIBLE state, are considered when measuring.
547b25825a1b159a469f80423800daa7f5b6250acceSteve Block     *
548b25825a1b159a469f80423800daa7f5b6250acceSteve Block     * @return Whether all children are considered when measuring.
549b25825a1b159a469f80423800daa7f5b6250acceSteve Block     */
550b25825a1b159a469f80423800daa7f5b6250acceSteve Block    public boolean getMeasureAllChildren() {
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mMeasureAllChildren;
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public LayoutParams generateLayoutParams(AttributeSet attrs) {
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new FrameLayout.LayoutParams(getContext(), attrs);
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
562e0a799a2ac1ca78e30fbac9e4e12a063425c08d3Patrick Dubroy    @Override
563e0a799a2ac1ca78e30fbac9e4e12a063425c08d3Patrick Dubroy    public boolean shouldDelayChildPressedState() {
564e0a799a2ac1ca78e30fbac9e4e12a063425c08d3Patrick Dubroy        return false;
565e0a799a2ac1ca78e30fbac9e4e12a063425c08d3Patrick Dubroy    }
566e0a799a2ac1ca78e30fbac9e4e12a063425c08d3Patrick Dubroy
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return p instanceof LayoutParams;
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new LayoutParams(p);
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5808a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov
5818a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov    @Override
5828a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov    public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
5838a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov        super.onInitializeAccessibilityEvent(event);
5848a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov        event.setClassName(FrameLayout.class.getName());
5858a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov    }
5868a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov
5878a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov    @Override
5888a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
5898a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov        super.onInitializeAccessibilityNodeInfo(info);
5908a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov        info.setClassName(FrameLayout.class.getName());
5918a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov    }
5928a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Per-child layout information for layouts that support margins.
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See {@link android.R.styleable#FrameLayout_Layout FrameLayout Layout Attributes}
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for a list of all child view attributes that this class supports.
597606e8cca6ac0e9a65a1a92003511b7c66d9ea439Romain Guy     *
598606e8cca6ac0e9a65a1a92003511b7c66d9ea439Romain Guy     * @attr ref android.R.styleable#FrameLayout_Layout_layout_gravity
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class LayoutParams extends MarginLayoutParams {
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The gravity to apply with the View to which these layout parameters
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * are associated.
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @see android.view.Gravity
606606e8cca6ac0e9a65a1a92003511b7c66d9ea439Romain Guy         *
607606e8cca6ac0e9a65a1a92003511b7c66d9ea439Romain Guy         * @attr ref android.R.styleable#FrameLayout_Layout_layout_gravity
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int gravity = -1;
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@inheritDoc}
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public LayoutParams(Context c, AttributeSet attrs) {
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(c, attrs);
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TypedArray a = c.obtainStyledAttributes(attrs, com.android.internal.R.styleable.FrameLayout_Layout);
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gravity = a.getInt(com.android.internal.R.styleable.FrameLayout_Layout_layout_gravity, -1);
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.recycle();
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@inheritDoc}
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public LayoutParams(int width, int height) {
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(width, height);
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Creates a new set of layout parameters with the specified width, height
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * and weight.
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
633980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy         * @param width the width, either {@link #MATCH_PARENT},
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *        {@link #WRAP_CONTENT} or a fixed size in pixels
635980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy         * @param height the height, either {@link #MATCH_PARENT},
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *        {@link #WRAP_CONTENT} or a fixed size in pixels
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param gravity the gravity
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @see android.view.Gravity
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public LayoutParams(int width, int height, int gravity) {
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(width, height);
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.gravity = gravity;
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@inheritDoc}
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public LayoutParams(ViewGroup.LayoutParams source) {
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(source);
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@inheritDoc}
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public LayoutParams(ViewGroup.MarginLayoutParams source) {
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(source);
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6590a0e155cadecd32599a7354a1836232c885f4bd2Alan Viverette
6600a0e155cadecd32599a7354a1836232c885f4bd2Alan Viverette        /**
6610a0e155cadecd32599a7354a1836232c885f4bd2Alan Viverette         * Copy constructor. Clones the width, height, margin values, and
6620a0e155cadecd32599a7354a1836232c885f4bd2Alan Viverette         * gravity of the source.
6630a0e155cadecd32599a7354a1836232c885f4bd2Alan Viverette         *
6640a0e155cadecd32599a7354a1836232c885f4bd2Alan Viverette         * @param source The layout params to copy from.
6650a0e155cadecd32599a7354a1836232c885f4bd2Alan Viverette         */
6660a0e155cadecd32599a7354a1836232c885f4bd2Alan Viverette        public LayoutParams(LayoutParams source) {
6670a0e155cadecd32599a7354a1836232c885f4bd2Alan Viverette            super(source);
6680a0e155cadecd32599a7354a1836232c885f4bd2Alan Viverette
6690a0e155cadecd32599a7354a1836232c885f4bd2Alan Viverette            this.gravity = source.gravity;
6700a0e155cadecd32599a7354a1836232c885f4bd2Alan Viverette        }
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
673