如何通过位运算实现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
相关产品推荐
相关产品推荐

