You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过位运算实现SurfaceView中View的可见性反转?已尝试方法失效

解决SurfaceView上View可见性切换的问题

哎,你这问题我太熟了!之前踩过一模一样的坑,先给你掰扯清楚为啥你之前的方法行不通:

  • Integer.reverse()完全用错地方啦!这个方法是反转整数的二进制位的,比如把View.VISIBLE(值为0)反转还是0,View.GONE(值为8)反转后是个完全不相关的整数,根本不是系统认可的可见性常量,自然没效果。
  • View.GONE ^ view.getVisibility()为啥不行?因为View的可见性常量是VISIBLE(0)、INVISIBLE(4)、GONE(8),位运算出来的结果(比如80=8,84=12)都不是合法的可见性值,系统根本识别不了,要么编译报错要么运行无效。

接下来给你两种简单靠谱的实现方式,随便选一种都能搞定:

方法一:直观判断切换(新手友好)

直接检查View当前的可见状态,然后手动切换,逻辑清晰不容易错:

// 给你的目标View设置点击监听器
targetView.setOnClickListener(v -> {
    int currentState = targetView.getVisibility();
    if (currentState == View.VISIBLE) {
        // 切换为隐藏:这里选GONE或INVISIBLE都行,看你需求
        targetView.setVisibility(View.GONE);
    } else {
        // 切换为显示
        targetView.setVisibility(View.VISIBLE);
    }
});

这里提醒下GONE和INVISIBLE的区别:GONE会让View彻底消失,不占布局空间;INVISIBLE只是隐藏起来,还保留原来的位置,你根据自己的布局需求选就行。

方法二:三目运算符简化代码(老手偏爱)

如果觉得上面的if-else有点啰嗦,用三目运算符一行就能搞定,效果完全一样:

targetView.setOnClickListener(v -> {
    targetView.setVisibility(
        targetView.getVisibility() == View.VISIBLE ? View.GONE : View.VISIBLE
    );
});

额外小提醒

因为你的View是在SurfaceView上的,要确保点击事件能传到这个View上哦!如果SurfaceView自己把点击事件消费了,子View可能收不到点击信号,这时候可以检查下SurfaceView的clickable属性,或者调整下View的层级和触摸事件传递逻辑~

内容的提问来源于stack exchange,提问作者Mehdi Haghgoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:30:56