【发布时间】: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