问题
我有一个自定义的 Android View ,我希望用户在其中设置重力以便在 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 属性 (like this) 获得的。
如果我将重力设置为 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
产下它的 child 。特别是这段代码:
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
中有口罩类(class):VERTICAL_GRAVITY_MASK
, HORIZONTAL_GRAVITY_MASK
这将帮助您了解应用了哪些重力。
关于java - 如何在自定义 Android View 中检查重力标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42174119/