2014-03-26 69 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的視頻發現了這個問題