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