全屏模式下的手势

时间:2015-02-16 14:33:07

标签: android fullscreen gesture

我创建了一个用于播放视频的Android应用程序。这些视频以全屏模式播放。我正在使用这段代码启用全屏:

if (mActivity != null) {
        Window window = mActivity.getWindow();
        View decorView = window.getDecorView();

        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            decorView.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 | View.SYSTEM_UI_FLAG_FULLSCREEN
            );
        } else {
            window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
            window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
            decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
            mActivity.getActionBar().hide();
        }
        if (hideBottomPanel) {
            mVideoController.smoothHide();
        }
        mIsFullscreenOn = true;            
}

请注意,我的应用程序的最低Android API设置为14.一切都适合我。

现在,我需要实现新功能 - 在视频中改变位置的手势(如向左和向右滑动)(我的意思是向前和向后搜索;非常类似于Google的PlayMovie应用程序中的手势)。 我知道我应该使用GestureOverlayView,GestureLibraries等。我已经准备好了这个功能,但是有一些问题。

如果我的视频处于全屏模式,则不会检测到手势。而不是检测手势,出现带有时钟,通知等的状态栏。

有什么办法可以达到我的要求吗?换句话说,有什么办法可以在不显示状态栏的情况下在全屏模式下检测手势?

感谢您的帮助。

更新

为了检测手势,我已经注册了听众:

gestureOverlayView.addOnGesturePerformedListener(mOnGesturePerformedListener);

看起来像这样:

private GestureOverlayView.OnGesturePerformedListener mOnGesturePerformedListener = new GestureOverlayView.OnGesturePerformedListener() {
    @Override
    public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
        ArrayList<Prediction> predictions = mGestureLibrary.recognize(gesture);
        for (Prediction prediction : predictions) {
            if (prediction.score > 1.0) {
                if (prediction.name.equals(SEEK_BACKWARD_GESTURE) && mPlayerIsPrepared) {
                    mPlayer.seekTo(Math.max(mPlayer.getCurrentPosition() - SEEK_SIZE, 0));                        
                } else if (prediction.name.equals(SEEK_FORWARD_GESTURE) && mPlayerIsPrepared) {
                    mPlayer.seekTo(Math.min(mPlayer.getCurrentPosition() + SEEK_SIZE, mPlayer.getDuration()));                       
                }
                Log.d(LOG_TAG, prediction.name);
                break;
            }
        }
    }
};

onActivityCreated中我有一个手势库的初始化:

mGestureLibrary = GestureLibraries.fromRawResource(mActivity, R.raw.gestures);

我检测手势的代码工作正常,但仅限于“非全屏”模式。所以,我认为这个问题不是直接用于检测手势的代码,而是全屏,因为在全屏手势中没有检测到(例如,与按钮上的OnClickListener相同 - 在全屏中,第一次触摸不会触发监听器,但只显示状态栏)。

更新2

我编辑了我的代码,用于在全屏和“非全屏”模式之间切换。对于API19 +,我添加了immersive模式,对于API 16 - 18,我添加了一些其他标志。现在我的全屏代码如下所示:

if (mActivity != null) {
        Window window = mActivity.getWindow();
        View decorView = window.getDecorView();            
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
            decorView.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 | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE);
        } else if (Build.VERSION.SDK_INT >= 16) {
            decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            mActivity.getActionBar().hide();
            window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
            window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
        } else {
            window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
            window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
            mActivity.getActionBar().hide();
        }            
        mVideoController.smoothHide(CONTROL_PANEL_ANIMATION_DURATION);
        mIsFullscreenOn = true;

上次修改位于Activity,其中包含我的Fragment进行播放。

// Flag from API18
window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_OVERSCAN); 

现在,手势在全屏模式下运行良好。但是API 17和更低版本存在问题。当我在全屏和非全屏模式之间切换时,会出现明显的“视频跳转”。换句话说,可以看到布局已更改。在API18 +上,从全屏到非全屏的切换流畅。

1 个答案:

答案 0 :(得分:0)

我认为只有使用窗口标志而不是系统ui标志才有可能:http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_FULLSCREEN
您可以使用其中一个全屏主题来完成此操作,例如Theme_Holo_NoA​​ctionBar_Fullscreen。