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.view;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect;
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Standard constants and tools for placing an object within a potentially
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * larger container.
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Gravity
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Constant indicating that no gravity has been set **/
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int NO_GRAVITY = 0x0000;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Raw bit indicating the gravity for an axis has been specified. */
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int AXIS_SPECIFIED = 0x0001;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Raw bit controlling how the left/top edge is placed. */
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int AXIS_PULL_BEFORE = 0x0002;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Raw bit controlling how the right/bottom edge is placed. */
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int AXIS_PULL_AFTER = 0x0004;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Raw bit controlling whether the right/bottom edge is clipped to its
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * container, based on the gravity direction being applied. */
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int AXIS_CLIP = 0x0008;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Bits defining the horizontal axis. */
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int AXIS_X_SHIFT = 0;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Bits defining the vertical axis. */
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int AXIS_Y_SHIFT = 4;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Push object to the top of its container, not changing its size. */
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int TOP = (AXIS_PULL_BEFORE|AXIS_SPECIFIED)<<AXIS_Y_SHIFT;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Push object to the bottom of its container, not changing its size. */
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int BOTTOM = (AXIS_PULL_AFTER|AXIS_SPECIFIED)<<AXIS_Y_SHIFT;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Push object to the left of its container, not changing its size. */
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int LEFT = (AXIS_PULL_BEFORE|AXIS_SPECIFIED)<<AXIS_X_SHIFT;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Push object to the right of its container, not changing its size. */
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RIGHT = (AXIS_PULL_AFTER|AXIS_SPECIFIED)<<AXIS_X_SHIFT;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Place object in the vertical center of its container, not changing its
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  size. */
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int CENTER_VERTICAL = AXIS_SPECIFIED<<AXIS_Y_SHIFT;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Grow the vertical size of the object if needed so it completely fills
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  its container. */
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FILL_VERTICAL = TOP|BOTTOM;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Place object in the horizontal center of its container, not changing its
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  size. */
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int CENTER_HORIZONTAL = AXIS_SPECIFIED<<AXIS_X_SHIFT;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Grow the horizontal size of the object if needed so it completely fills
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  its container. */
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FILL_HORIZONTAL = LEFT|RIGHT;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Place the object in the center of its container in both the vertical
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  and horizontal axis, not changing its size. */
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int CENTER = CENTER_VERTICAL|CENTER_HORIZONTAL;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Grow the horizontal and vertical size of the object if needed so it
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  completely fills its container. */
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FILL = FILL_VERTICAL|FILL_HORIZONTAL;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Flag to clip the edges of the object to its container along the
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  vertical axis. */
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int CLIP_VERTICAL = AXIS_CLIP<<AXIS_Y_SHIFT;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Flag to clip the edges of the object to its container along the
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  horizontal axis. */
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int CLIP_HORIZONTAL = AXIS_CLIP<<AXIS_X_SHIFT;
836a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio
84c46f7ffa9079f3ae8a5204e7519ed7a1250116d0Fabrice Di Meglio    /** Raw bit controlling whether the layout direction is relative or not (START/END instead of
85c46f7ffa9079f3ae8a5204e7519ed7a1250116d0Fabrice Di Meglio     * absolute LEFT/RIGHT).
86c46f7ffa9079f3ae8a5204e7519ed7a1250116d0Fabrice Di Meglio     */
87c46f7ffa9079f3ae8a5204e7519ed7a1250116d0Fabrice Di Meglio    public static final int RELATIVE_LAYOUT_DIRECTION = 0x00800000;
886a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
906a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio     * Binary mask to get the absolute horizontal gravity of a gravity.
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int HORIZONTAL_GRAVITY_MASK = (AXIS_SPECIFIED |
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AXIS_PULL_BEFORE | AXIS_PULL_AFTER) << AXIS_X_SHIFT;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Binary mask to get the vertical gravity of a gravity.
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int VERTICAL_GRAVITY_MASK = (AXIS_SPECIFIED |
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AXIS_PULL_BEFORE | AXIS_PULL_AFTER) << AXIS_Y_SHIFT;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Special constant to enable clipping to an overall display along the
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  vertical dimension.  This is not applied by default by
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  {@link #apply(int, int, int, Rect, int, int, Rect)}; you must do so
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  yourself by calling {@link #applyDisplay}.
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int DISPLAY_CLIP_VERTICAL = 0x10000000;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Special constant to enable clipping to an overall display along the
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  horizontal dimension.  This is not applied by default by
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  {@link #apply(int, int, int, Rect, int, int, Rect)}; you must do so
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  yourself by calling {@link #applyDisplay}.
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int DISPLAY_CLIP_HORIZONTAL = 0x01000000;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149e3b002d3f9141d54948a65e0330fdcd09e75a30Fabrice Di Meglio    /** Push object to x-axis position at the start of its container, not changing its size. */
115c46f7ffa9079f3ae8a5204e7519ed7a1250116d0Fabrice Di Meglio    public static final int START = RELATIVE_LAYOUT_DIRECTION | LEFT;
1166a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio
1179e3b002d3f9141d54948a65e0330fdcd09e75a30Fabrice Di Meglio    /** Push object to x-axis position at the end of its container, not changing its size. */
118c46f7ffa9079f3ae8a5204e7519ed7a1250116d0Fabrice Di Meglio    public static final int END = RELATIVE_LAYOUT_DIRECTION | RIGHT;
1196a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1216a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio     * Binary mask for the horizontal gravity and script specific direction bit.
1226a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio     */
1239e3b002d3f9141d54948a65e0330fdcd09e75a30Fabrice Di Meglio    public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = START | END;
1246a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio
1256a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio    /**
126c502744f2ddcc80a34f5197b5d2c0d701c7d6e71Newton Allen     * Apply a gravity constant to an object. This supposes that the layout direction is LTR.
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param gravity The desired placement of the object, as defined by the
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                constants in this class.
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param w The horizontal size of the object.
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param h The vertical size of the object.
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param container The frame of the containing space, in which the object
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                  will be placed.  Should be large enough to contain the
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                  width and height of the object.
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outRect Receives the computed frame of the object in its
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                container.
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1386a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio    public static void apply(int gravity, int w, int h, Rect container, Rect outRect) {
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        apply(gravity, w, h, container, 0, 0, outRect);
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1436a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio     * Apply a gravity constant to an object and take care if layout direction is RTL or not.
1446a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio     *
1456a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio     * @param gravity The desired placement of the object, as defined by the
1466a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio     *                constants in this class.
1476a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio     * @param w The horizontal size of the object.
1486a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio     * @param h The vertical size of the object.
1496a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio     * @param container The frame of the containing space, in which the object
1506a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio     *                  will be placed.  Should be large enough to contain the
1516a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio     *                  width and height of the object.
1526a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio     * @param outRect Receives the computed frame of the object in its
1536a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio     *                container.
154c0053223bedf33581b0830fb87be32c1f26e5372Fabrice Di Meglio     * @param layoutDirection The layout direction.
1556a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio     *
15649b0a9b4705d869f05a57ed3acf42ba5652294b2Fabrice Di Meglio     * @see View#LAYOUT_DIRECTION_LTR
15749b0a9b4705d869f05a57ed3acf42ba5652294b2Fabrice Di Meglio     * @see View#LAYOUT_DIRECTION_RTL
1586a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio     */
1596a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio    public static void apply(int gravity, int w, int h, Rect container,
160c0053223bedf33581b0830fb87be32c1f26e5372Fabrice Di Meglio            Rect outRect, int layoutDirection) {
161c0053223bedf33581b0830fb87be32c1f26e5372Fabrice Di Meglio        int absGravity = getAbsoluteGravity(gravity, layoutDirection);
1626a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio        apply(absGravity, w, h, container, 0, 0, outRect);
1636a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio    }
1646a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio
1656a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio    /**
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Apply a gravity constant to an object.
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param gravity The desired placement of the object, as defined by the
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                constants in this class.
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param w The horizontal size of the object.
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param h The vertical size of the object.
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param container The frame of the containing space, in which the object
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                  will be placed.  Should be large enough to contain the
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                  width and height of the object.
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param xAdj Offset to apply to the X axis.  If gravity is LEFT this
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             pushes it to the right; if gravity is RIGHT it pushes it to
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             the left; if gravity is CENTER_HORIZONTAL it pushes it to the
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             right or left; otherwise it is ignored.
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param yAdj Offset to apply to the Y axis.  If gravity is TOP this pushes
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             it down; if gravity is BOTTOM it pushes it up; if gravity is
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             CENTER_VERTICAL it pushes it down or up; otherwise it is
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             ignored.
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outRect Receives the computed frame of the object in its
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                container.
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void apply(int gravity, int w, int h, Rect container,
1876a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio            int xAdj, int yAdj, Rect outRect) {
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (gravity&((AXIS_PULL_BEFORE|AXIS_PULL_AFTER)<<AXIS_X_SHIFT)) {
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 0:
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outRect.left = container.left
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ((container.right - container.left - w)/2) + xAdj;
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outRect.right = outRect.left + w;
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((gravity&(AXIS_CLIP<<AXIS_X_SHIFT))
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        == (AXIS_CLIP<<AXIS_X_SHIFT)) {
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (outRect.left < container.left) {
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outRect.left = container.left;
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (outRect.right > container.right) {
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outRect.right = container.right;
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case AXIS_PULL_BEFORE<<AXIS_X_SHIFT:
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outRect.left = container.left + xAdj;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outRect.right = outRect.left + w;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((gravity&(AXIS_CLIP<<AXIS_X_SHIFT))
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        == (AXIS_CLIP<<AXIS_X_SHIFT)) {
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (outRect.right > container.right) {
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outRect.right = container.right;
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case AXIS_PULL_AFTER<<AXIS_X_SHIFT:
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outRect.right = container.right - xAdj;
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outRect.left = outRect.right - w;
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((gravity&(AXIS_CLIP<<AXIS_X_SHIFT))
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        == (AXIS_CLIP<<AXIS_X_SHIFT)) {
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (outRect.left < container.left) {
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outRect.left = container.left;
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outRect.left = container.left + xAdj;
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outRect.right = container.right + xAdj;
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (gravity&((AXIS_PULL_BEFORE|AXIS_PULL_AFTER)<<AXIS_Y_SHIFT)) {
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 0:
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outRect.top = container.top
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ((container.bottom - container.top - h)/2) + yAdj;
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outRect.bottom = outRect.top + h;
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((gravity&(AXIS_CLIP<<AXIS_Y_SHIFT))
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        == (AXIS_CLIP<<AXIS_Y_SHIFT)) {
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (outRect.top < container.top) {
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outRect.top = container.top;
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (outRect.bottom > container.bottom) {
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outRect.bottom = container.bottom;
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case AXIS_PULL_BEFORE<<AXIS_Y_SHIFT:
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outRect.top = container.top + yAdj;
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outRect.bottom = outRect.top + h;
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((gravity&(AXIS_CLIP<<AXIS_Y_SHIFT))
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        == (AXIS_CLIP<<AXIS_Y_SHIFT)) {
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (outRect.bottom > container.bottom) {
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outRect.bottom = container.bottom;
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case AXIS_PULL_AFTER<<AXIS_Y_SHIFT:
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outRect.bottom = container.bottom - yAdj;
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outRect.top = outRect.bottom - h;
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((gravity&(AXIS_CLIP<<AXIS_Y_SHIFT))
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        == (AXIS_CLIP<<AXIS_Y_SHIFT)) {
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (outRect.top < container.top) {
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outRect.top = container.top;
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outRect.top = container.top + yAdj;
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outRect.bottom = container.bottom + yAdj;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
272e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     * Apply a gravity constant to an object.
273e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     *
274e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     * @param gravity The desired placement of the object, as defined by the
275e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     *                constants in this class.
276e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     * @param w The horizontal size of the object.
277e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     * @param h The vertical size of the object.
278e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     * @param container The frame of the containing space, in which the object
279e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     *                  will be placed.  Should be large enough to contain the
280e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     *                  width and height of the object.
281e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     * @param xAdj Offset to apply to the X axis.  If gravity is LEFT this
282e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     *             pushes it to the right; if gravity is RIGHT it pushes it to
283e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     *             the left; if gravity is CENTER_HORIZONTAL it pushes it to the
284e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     *             right or left; otherwise it is ignored.
285e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     * @param yAdj Offset to apply to the Y axis.  If gravity is TOP this pushes
286e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     *             it down; if gravity is BOTTOM it pushes it up; if gravity is
287e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     *             CENTER_VERTICAL it pushes it down or up; otherwise it is
288e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     *             ignored.
289e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     * @param outRect Receives the computed frame of the object in its
290e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     *                container.
291e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     * @param layoutDirection The layout direction.
292e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     *
29349b0a9b4705d869f05a57ed3acf42ba5652294b2Fabrice Di Meglio     * @see View#LAYOUT_DIRECTION_LTR
29449b0a9b4705d869f05a57ed3acf42ba5652294b2Fabrice Di Meglio     * @see View#LAYOUT_DIRECTION_RTL
295e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     */
296e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio    public static void apply(int gravity, int w, int h, Rect container,
297e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio                             int xAdj, int yAdj, Rect outRect, int layoutDirection) {
298e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio        int absGravity = getAbsoluteGravity(gravity, layoutDirection);
299e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio        apply(absGravity, w, h, container, xAdj, yAdj, outRect);
300e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio    }
301e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio
302e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio    /**
303935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn     * Apply additional gravity behavior based on the overall "display" that an
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * object exists in.  This can be used after
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #apply(int, int, int, Rect, int, int, Rect)} to place the object
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * within a visible display.  By default this moves or clips the object
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to be visible in the display; the gravity flags
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #DISPLAY_CLIP_HORIZONTAL} and {@link #DISPLAY_CLIP_VERTICAL}
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can be used to change this behavior.
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param gravity Gravity constants to modify the placement within the
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * display.
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param display The rectangle of the display in which the object is
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * being placed.
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param inoutObj Supplies the current object position; returns with it
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * modified if needed to fit in the display.
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void applyDisplay(int gravity, Rect display, Rect inoutObj) {
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((gravity&DISPLAY_CLIP_VERTICAL) != 0) {
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (inoutObj.top < display.top) inoutObj.top = display.top;
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (inoutObj.bottom > display.bottom) inoutObj.bottom = display.bottom;
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int off = 0;
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (inoutObj.top < display.top) off = display.top-inoutObj.top;
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            else if (inoutObj.bottom > display.bottom) off = display.bottom-inoutObj.bottom;
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (off != 0) {
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (inoutObj.height() > (display.bottom-display.top)) {
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    inoutObj.top = display.top;
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    inoutObj.bottom = display.bottom;
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    inoutObj.top += off;
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    inoutObj.bottom += off;
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((gravity&DISPLAY_CLIP_HORIZONTAL) != 0) {
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (inoutObj.left < display.left) inoutObj.left = display.left;
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (inoutObj.right > display.right) inoutObj.right = display.right;
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int off = 0;
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (inoutObj.left < display.left) off = display.left-inoutObj.left;
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            else if (inoutObj.right > display.right) off = display.right-inoutObj.right;
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (off != 0) {
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (inoutObj.width() > (display.right-display.left)) {
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    inoutObj.left = display.left;
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    inoutObj.right = display.right;
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    inoutObj.left += off;
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    inoutObj.right += off;
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
355e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio
356e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio    /**
357e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     * Apply additional gravity behavior based on the overall "display" that an
358e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     * object exists in.  This can be used after
359e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     * {@link #apply(int, int, int, Rect, int, int, Rect)} to place the object
360e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     * within a visible display.  By default this moves or clips the object
361e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     * to be visible in the display; the gravity flags
362e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     * {@link #DISPLAY_CLIP_HORIZONTAL} and {@link #DISPLAY_CLIP_VERTICAL}
363e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     * can be used to change this behavior.
364e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     *
365e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     * @param gravity Gravity constants to modify the placement within the
366e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     * display.
367e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     * @param display The rectangle of the display in which the object is
368e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     * being placed.
369e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     * @param inoutObj Supplies the current object position; returns with it
370e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     * modified if needed to fit in the display.
371e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     * @param layoutDirection The layout direction.
372e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     *
37349b0a9b4705d869f05a57ed3acf42ba5652294b2Fabrice Di Meglio     * @see View#LAYOUT_DIRECTION_LTR
37449b0a9b4705d869f05a57ed3acf42ba5652294b2Fabrice Di Meglio     * @see View#LAYOUT_DIRECTION_RTL
375e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio     */
376e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio    public static void applyDisplay(int gravity, Rect display, Rect inoutObj, int layoutDirection) {
377e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio        int absGravity = getAbsoluteGravity(gravity, layoutDirection);
378e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio        applyDisplay(absGravity, display, inoutObj);
379e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio    }
380e8dc07dcdb983d5d3999b16c2a49ddee4bdb942cFabrice Di Meglio
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Indicate whether the supplied gravity has a vertical pull.</p>
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param gravity the gravity to check for vertical pull
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the supplied gravity has a vertical pull
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static boolean isVertical(int gravity) {
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return gravity > 0 && (gravity & VERTICAL_GRAVITY_MASK) != 0;
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Indicate whether the supplied gravity has an horizontal pull.</p>
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param gravity the gravity to check for horizontal pull
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the supplied gravity has an horizontal pull
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static boolean isHorizontal(int gravity) {
3986a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio        return gravity > 0 && (gravity & RELATIVE_HORIZONTAL_GRAVITY_MASK) != 0;
3996a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio    }
4006a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio
4016a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio    /**
4026a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio     * <p>Convert script specific gravity to absolute horizontal value.</p>
4036a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio     *
4049e3b002d3f9141d54948a65e0330fdcd09e75a30Fabrice Di Meglio     * if horizontal direction is LTR, then START will set LEFT and END will set RIGHT.
4059e3b002d3f9141d54948a65e0330fdcd09e75a30Fabrice Di Meglio     * if horizontal direction is RTL, then START will set RIGHT and END will set LEFT.
4066a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio     *
407c0053223bedf33581b0830fb87be32c1f26e5372Fabrice Di Meglio     *
4086a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio     * @param gravity The gravity to convert to absolute (horizontal) values.
409c0053223bedf33581b0830fb87be32c1f26e5372Fabrice Di Meglio     * @param layoutDirection The layout direction.
4106a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio     * @return gravity converted to absolute (horizontal) values.
4116a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio     */
412c0053223bedf33581b0830fb87be32c1f26e5372Fabrice Di Meglio    public static int getAbsoluteGravity(int gravity, int layoutDirection) {
4136a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio        int result = gravity;
4149e3b002d3f9141d54948a65e0330fdcd09e75a30Fabrice Di Meglio        // If layout is script specific and gravity is horizontal relative (START or END)
415c46f7ffa9079f3ae8a5204e7519ed7a1250116d0Fabrice Di Meglio        if ((result & RELATIVE_LAYOUT_DIRECTION) > 0) {
4169e3b002d3f9141d54948a65e0330fdcd09e75a30Fabrice Di Meglio            if ((result & Gravity.START) == Gravity.START) {
4179e3b002d3f9141d54948a65e0330fdcd09e75a30Fabrice Di Meglio                // Remove the START bit
4189e3b002d3f9141d54948a65e0330fdcd09e75a30Fabrice Di Meglio                result &= ~START;
419c0053223bedf33581b0830fb87be32c1f26e5372Fabrice Di Meglio                if (layoutDirection == View.LAYOUT_DIRECTION_RTL) {
4206a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio                    // Set the RIGHT bit
4216a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio                    result |= RIGHT;
4226a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio                } else {
4236a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio                    // Set the LEFT bit
4246a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio                    result |= LEFT;
4256a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio                }
4269e3b002d3f9141d54948a65e0330fdcd09e75a30Fabrice Di Meglio            } else if ((result & Gravity.END) == Gravity.END) {
4279e3b002d3f9141d54948a65e0330fdcd09e75a30Fabrice Di Meglio                // Remove the END bit
4289e3b002d3f9141d54948a65e0330fdcd09e75a30Fabrice Di Meglio                result &= ~END;
429c0053223bedf33581b0830fb87be32c1f26e5372Fabrice Di Meglio                if (layoutDirection == View.LAYOUT_DIRECTION_RTL) {
4306a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio                    // Set the LEFT bit
4316a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio                    result |= LEFT;
4326a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio                } else {
4336a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio                    // Set the RIGHT bit
4346a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio                    result |= RIGHT;
4356a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio                }
4366a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio            }
4376a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio            // Don't need the script specific bit any more, so remove it as we are converting to
4386a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio            // absolute values (LEFT or RIGHT)
439c46f7ffa9079f3ae8a5204e7519ed7a1250116d0Fabrice Di Meglio            result &= ~RELATIVE_LAYOUT_DIRECTION;
4406a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio        }
4416a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio        return result;
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
444