如何通过位操作反转视图的可见性

时间:2018-03-18 07:25:45

标签: java android bit-manipulation

我想在用户点击时反转SurfaceView上视图的可见性。单击可使视图在屏幕上可见。下一次单击使其不可见,依此类推。
我已经尝试了view.setVisibility(Integer.reverse())view.setVisibility(View.GONE ^ view.getVisibility()),但没有一个可以使用。后者甚至没有编译。

2 个答案:

答案 0 :(得分:2)

视图的可见性不是二进制,因为不仅有两种状态。视图可以分为三种状态:VISIBLE,INVISIBLE或GONE。您要在哪两个之间切换?

通常您可以使用以下内容设置视图的可见性:

class UseCase < ApplicationRecord
  has_and_belongs_to_many :educational_objectives
end

class EducationalObjective < ApplicationRecord
  has_and_belongs_to_many :use_cases
end

class EducationalObjectivesUseCase < ApplicationRecord
  belongs_to :educational_objective
  belongs_to :use_case
end


class UseCasesController < ApplicationController
  def index
    @use_cases = UseCase.all.
                    order(:use_case).
                    joins(:educational_objectives).
                    where('educational_objectives.subject_id = ?',2)
    end
end

这实际上相当于:

view.setVisibility(View.GONE);

因为View类中的三个值都是公共静态int。他们是:

view.setVisibility(8);

它们的每个幂都是2,所以在二进制中它们的值是:

public static final int VISIBLE = 0x00000000;
public static final int INVISIBLE = 0x00000004;
public static final int GONE = 0x00000008;

所以Integer.reverse()并不是你想要的。 VISIBLE总是0,从INVISIBLE到GONE你需要向左移动。

答案 1 :(得分:0)

异或二元运算将适用于当前设置状态为相同整数值或零(可见)的情况。 我编写了一个简单的测试来演示如何实现切换逻辑。

    @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)
    }