Java 如何反转视图';通过位操作提高可视性
我希望在用户单击时反转SurfaceView上视图的可见性。单击可使视图在屏幕上可见。下一次单击将使其不可见,依此类推。Java 如何反转视图';通过位操作提高可视性,java,android,bit-manipulation,Java,Android,Bit Manipulation,我希望在用户单击时反转SurfaceView上视图的可见性。单击可使视图在屏幕上可见。下一次单击将使其不可见,依此类推。 我已经尝试了view.setVisibility(Integer.reverse())和view.setVisibility(view.GONE^view.getVisibility()),但都不起作用。后者甚至不编译 视图的可见性不是二进制的,因为视图中不只有两种状态。视图可以处于三种状态:可见、不可见或消失。你想在哪两个之间切换 通常,您可以使用以下内容设置视图的可见性:
我已经尝试了
view.setVisibility(Integer.reverse())
和view.setVisibility(view.GONE^view.getVisibility())
,但都不起作用。后者甚至不编译 视图的可见性不是二进制的,因为视图中不只有两种状态。视图可以处于三种状态:可见、不可见或消失。你想在哪两个之间切换
通常,您可以使用以下内容设置视图的可见性:
view.setVisibility(View.GONE);
这实际上相当于:
view.setVisibility(8);
因为这三个值都是View类中的公共静态int。它们是:
public static final int VISIBLE = 0x00000000;
public static final int INVISIBLE = 0x00000004;
public static final int GONE = 0x00000008;
它们都是2的幂,所以在二进制中它们的值是:
VISIBLE = ...0000;
INVISIBLE = ...0100;
GONE = ...1000;
所以Integer.reverse()并不是您真正想要的。“可见”始终为0,要从“不可见”变为“消失”,您需要向左移动。视图的可见性不是二进制的,因为在视图中不只有两种状态。视图可以处于三种状态:可见、不可见或消失。你想在哪两个之间切换 通常,您可以使用以下内容设置视图的可见性:
view.setVisibility(View.GONE);
这实际上相当于:
view.setVisibility(8);
因为这三个值都是View类中的公共静态int。它们是:
public static final int VISIBLE = 0x00000000;
public static final int INVISIBLE = 0x00000004;
public static final int GONE = 0x00000008;
它们都是2的幂,所以在二进制中它们的值是:
VISIBLE = ...0000;
INVISIBLE = ...0100;
GONE = ...1000;
所以Integer.reverse()并不是您真正想要的。可见始终为0,要从不可见变为消失,您需要向左移动。如果当前设置状态为相同的整数值或零(可见),则XOR二进制操作将适用。 我编写了一个简单的测试来演示如何实现切换逻辑
@Test
fun toggleVisibility() {
// toggle GONE
var visibility = VISIBLE
visibility = visibility xor GONE
assertEquals(visibility, GONE)
visibility = visibility xor GONE
assertEquals(visibility, VISIBLE)
// toggle INVISIBLE
visibility = VISIBLE
visibility = visibility xor INVISIBLE
assertEquals(visibility, INVISIBLE)
visibility = visibility xor INVISIBLE
assertEquals(visibility, VISIBLE)
}
异或二进制操作将适用于当前设置状态为相同整数值或零(可见)的情况。 我编写了一个简单的测试来演示如何实现切换逻辑
@Test
fun toggleVisibility() {
// toggle GONE
var visibility = VISIBLE
visibility = visibility xor GONE
assertEquals(visibility, GONE)
visibility = visibility xor GONE
assertEquals(visibility, VISIBLE)
// toggle INVISIBLE
visibility = VISIBLE
visibility = visibility xor INVISIBLE
assertEquals(visibility, INVISIBLE)
visibility = visibility xor INVISIBLE
assertEquals(visibility, VISIBLE)
}
此处不允许使用
标志
@MikeM。在我键入代码时,这实际上是一个语法错误。您不会使用位操作来执行此操作,因为可见性是一个三元状态,而不是位字段。如果您只想切换到可见,标准方式是view.setVisibility(view.getVisibility()==view.gone?view.visible:view.gone);然而,如果你不想包含不可见的可能性,你需要更清楚地知道你想要什么。为什么你需要使用位操作来实现这一点?我正在寻找一种通过一元或二元运算符实现的简洁方法。但是,这似乎是不可能的。此处不允许使用标志
@MikeM。在我键入代码时,这实际上是一个语法错误。您不会使用位操作来执行此操作,因为可见性是一个三元状态,而不是位字段。如果您只想切换到可见,标准方式是view.setVisibility(view.getVisibility()==view.gone?view.visible:view.gone);然而,如果你不想包含不可见的可能性,你需要更清楚地知道你想要什么。为什么你需要使用位操作来实现这一点?我正在寻找一种通过一元或二元运算符实现的简洁方法。然而,这似乎是不可能的。