[英]How to check gravity flags in a custom Android View?
問題
我有一個自定義的Android視圖,我想讓用戶設置重力,以便在onDraw
布局內容。 這是我在onDraw
使用的簡化版本:
// check gravity
if ((mGravity & Gravity.CENTER_VERTICAL) == Gravity.CENTER_VERTICAL) {
// draw the content centered vertically
} else if ((mGravity & Gravity.BOTTOM) == Gravity.BOTTOM) {
// draw the content at the bottom
}
其中mGravity
是從xml屬性中獲取的( 像這樣 )。
如果我將引力設置為Gravity.CENTER_VERTICAL
它可以正常工作。 但我很驚訝地發現,如果我將它設置為Gravity.BOTTOM
, Gravity.CENTER_VERTICAL
檢查仍然是正確的!
為什么會這樣?
我必須查看二進制值才能看出原因:
0001 0000
, Gravity.CENTER_VERTICAL
:常數值:16(0x00000010) 0101 0000
, Gravity.BOTTOM
:常數值:80(0x00000050) 因此,當我這樣做
mGravity = Gravity.BOTTOM;
(mGravity & Gravity.CENTER_VERTICAL) == Gravity.CENTER_VERTICAL
// (0101 & 0001) == 0001
我得到了誤報。
我該怎么辦?
那么我該怎么檢查重力旗呢?
我可以做一些像if (mGravity == Gravity.CENTER_VERTICAL)
,但那時我只會得到完全匹配。 如果用戶將重力設置為像center_vertical|right
話,則會失敗。
您可以檢查FrameLayout
如何為其子項奠定基礎。 特別是,這段代碼:
final int layoutDirection = getLayoutDirection();
final int absoluteGravity = Gravity.getAbsoluteGravity(gravity, layoutDirection);
final int verticalGravity = gravity & Gravity.VERTICAL_GRAVITY_MASK;
switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
case Gravity.CENTER_HORIZONTAL:
...
case Gravity.RIGHT:
...
case Gravity.LEFT:
...
}
switch (verticalGravity) {
case Gravity.TOP:
...
case Gravity.CENTER_VERTICAL:
...
case Gravity.BOTTOM:
...
}
Gravity
類中有掩碼: VERTICAL_GRAVITY_MASK
, HORIZONTAL_GRAVITY_MASK
,它將幫助您找出已應用的重力。
這是@ azizbekian非常有用的解決方案的補充答案。 我正在添加這個以幫助自己更全面地了解重力在幕后的作用。
LEFT
和RIGHT
被稱為絕對重力。 也就是說,如果用戶指定START
或END
的相對重力,則根據情況將其內部轉換為RIGHT
或LEFT
的絕對重力。
0000 0001 CENTER_HORIZONTAL
0000 0011 LEFT
0000 0101 RIGHT
---------
0000 0111 HORIZONTAL_GRAVITY_MASK
關於START
和END
1000 0000 0000 0000 0000 0011 START
0000 0000 0000 0000 0000 0011 LEFT
1000 0000 0000 0000 0000 0101 END
0000 0000 0000 0000 0000 0101 RIGHT
-----------------------------
0000 0000 0000 0000 0000 0111 HORIZONTAL_GRAVITY_MASK
正如您在此處所看到的, START
和LEFT
僅相差一位。 END
和RIGHT
是一樣的。 因此,如果直接在START
和END
上使用HORIZONTAL_GRAVITY_MASK
,它們將分別默認為LEFT
和RIGHT
。 但是,應謹慎使用。 應考慮從右到左的語言區域設置。
y軸重力從x軸(水平)重力移位4位。
0001 0000 CENTER_VERTICAL
0011 0000 TOP
0101 0000 BOTTOM
---------
0111 0000 VERTICAL_GRAVITY_MASK
請注意, CENTER
是CENTER_VERTICAL
和CENTER_HORIZONTAL
的組合。 因此,您還可以使用其中一個重力掩碼進行轉換。
0000 0001 CENTER_HORIZONTAL
0001 0000 CENTER_VERTICAL
0001 0001 CENTER
---------
0000 0111 HORIZONTAL_GRAVITY_MASK
0111 0000 VERTICAL_GRAVITY_MASK
使用位OR運算符( |
)組合水平和垂直重力。
例:
int myGravity = Gravity.RIGHT | Gravity.BOTTOM;
0000 0101 RIGHT
0101 0000 BOTTOM
---------
0101 0101 myGravity
使用位運算符( &
)與其中一個重力掩模隔離水平或垂直重力。
例
int verticalGravity = myGravity & Gravity.VERTICAL_GRAVITY_MASK;
if (verticalGravity == Gravity.BOTTOM) ...
0101 0101 myGravity
0111 0000 VERTICAL_GRAVITY_MASK
---------
0101 0000 verticalGravity
0101 0000 BOTTOM
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.