java - 如何在自定义 Android View 中检查重力标志?

标签 java android android-layout flags android-gravity

问题

我有一个自定义的 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.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 产下它的 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/

相关文章:

java - 用法 : RealmBase -a <algorithm> [-e <encoding>] <credentials>

java - 为什么 Java 枚举文字不能具有泛型类型参数?

java - Android开发中比Switch更有效的方法(Java)

安卓滑动面板

java - 在java中查找子字符串模式

android - 使用 TabsAdapter 动态替换 ViewPager 中的 fragment

android - 在 ScrollView 中将 View 添加到布局底部

java - 在 RecyclerView 中使用多个 View 和数据集

java - 获取父布局中所有按钮的 id

java - 为什么 JOptionPane 中的 JScrollPane 不显示其所有内容?