我创建了一个用于播放视频的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 +上,从全屏到非全屏的切换流畅。
答案 0 :(得分:0)
我认为只有使用窗口标志而不是系统ui标志才有可能:http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_FULLSCREEN
您可以使用其中一个全屏主题来完成此操作,例如Theme_Holo_NoActionBar_Fullscreen。