我想要实现的是使用全屏模式的图库:当单击屏幕时,将显示控件,当再次单击时,它们将被隐藏。
我尝试过这种方式设置OnClickListener
来管理系统UI
public void onClick(View v) {
//toggle state
systemUIVisible = !systemUIVisible;
//show controls
if(systemUIVisible) {
controlsView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
//hide controls
else {
controlsView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
| View.SYSTEM_UI_FLAG_IMMERSIVE);
}
}
我已经设定了
controlsView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {... }
管理控件的可见性。
问题是,只要controlsView
TOUCHED ,系统UI可见性就会切换,而不是点击时切换。
当用户尝试以全屏模式滑动图库时,这会导致显示控件的不良行为。
感谢任何帮助。
答案 0 :(得分:0)
问题在于View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
标志。来自doc:
存在一个限制:因为导航控件非常重要,所以用户最少 互动将使他们立即重新出现。当这发生时,两者都有 此标志将自动清除,以便两个元素同时重新出现。
所以我只需更换
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
与
View.SYSTEM_UI_FLAG_LOW_PROFILE
答案 1 :(得分:0)
在这种情况下, NOT 使用onClickListener。 它通过此代码解决
View contentView = findViewById(R.id.contentLayout);
contentView.setClickable(true);
final GestureDetector clickDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
boolean visible = (mDecorView.getSystemUiVisibility()
& View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0;
if (visible)
hideSystemUI();
else
showSystemUI();
return true;
}
});
contentView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return clickDetector.onTouchEvent(event);
}
});
以及进入/隐藏沉浸式全屏模式的功能:
private void hideSystemUI() {
mDecorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
| View.SYSTEM_UI_FLAG_IMMERSIVE);
}
private void showSystemUI() {
mDecorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
我在罗马努里克的视频中发现了这个问题 https://developer.android.com/training/system-ui/immersive.html