【问题标题】:Gestures in fullscreen mode全屏模式下的手势
【发布时间】:2015-02-16 14:33:06
【问题描述】:

我创建了一个用于播放视频的 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+ 上,从全屏到非全屏的切换很流畅。

【问题讨论】:

    标签: android fullscreen gesture


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2013-06-06
      • 2019-11-03
      • 1970-01-01
      • 2013-06-19
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多