簡體   English   中英

如何在自定義Android視圖中檢查重力標記?

[英]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.BOTTOMGravity.CENTER_VERTICAL檢查仍然是正確的!

為什么會這樣?

我必須查看二進制值才能看出原因:

因此,當我這樣做

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_MASKHORIZONTAL_GRAVITY_MASK ,它將幫助您找出已應用的重力。

這是@ azizbekian非常有用的解決方案的補充答案。 我正在添加這個以幫助自己更全面地了解重力在幕后的作用。

水平軸重力

LEFTRIGHT被稱為絕對重力。 也就是說,如果用戶指定STARTEND的相對重力,則根據情況將其內部轉換RIGHTLEFT的絕對重力。

0000 0001  CENTER_HORIZONTAL
0000 0011  LEFT
0000 0101  RIGHT
---------  
0000 0111  HORIZONTAL_GRAVITY_MASK

關於STARTEND

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

正如您在此處所看到的, STARTLEFT僅相差一位。 ENDRIGHT是一樣的。 因此,如果直接在STARTEND上使用HORIZONTAL_GRAVITY_MASK ,它們將分別默認為LEFTRIGHT 但是,應謹慎使用。 應考慮從右到左的語言區域設置。

垂直軸重力

y軸重力從x軸(水平)重力移位4位。

0001 0000  CENTER_VERTICAL
0011 0000  TOP
0101 0000  BOTTOM
---------
0111 0000  VERTICAL_GRAVITY_MASK

兩個軸

請注意, CENTERCENTER_VERTICALCENTER_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM