2014-03-26 47 views
0

我想要实现的是使用全屏模式的图库:点击屏幕时会显示控件,再次点击时会隐藏。 我试图建立一个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() {... } 

管理控件的可见性。

的问题是,该系统UI能见度切换每当controlsViewTOUCHED,而不是当它的CLICKED

当用户尝试以全屏模式滑动画廊时,会导致显示控件的不良行为。

任何帮助表示赞赏。

回答

0

问题出在View.SYSTEM_UI_FLAG_HIDE_NAVIGATION标志。来自文档:

有一个限制:因为导航控件非常重要,所以至少用户互动将导致它们立即重新出现。发生这种情况时,这两个标记将自动清除,以便两个元素同时重新出现。

所以我简单地更换

View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 

View.SYSTEM_UI_FLAG_LOW_PROFILE 
0

在这种情况下使用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罗马Nurik的视频发现了这个问题