问题现象:使用crosswalk的内核打开播放视频的时候,点击一个弹窗播放,在点击全屏按钮,切换到全屏的过程,会闪现桌面的画面,然后再进入全屏,退出的时候也是相同现象。
思路:观察切换过程调用的方法,在调用的方法中加入覆盖显示一个黑屏转场界面,延时进行关闭。这样切换的过程就是黑屏的了。一开始是简单修改父布局和XWalkView加入颜色,使其不透明,发现没有效果。后面就在上面加了一层黑色的loading_bg
private boolean isFullScreen = false;
private FrameLayout loadingBg;
loadingBg = findViewById(R.id.loading_bg);
xwalkview.setUIClient(new XWalkUIClient(xwalkview) {
@Override
public void onFullscreenToggled(XWalkView view, boolean enterFullscreen) {
isFullScreen = enterFullscreen;
Log.d("XWalkLib", "isFullScreen: " + isFullScreen);
if (isFullScreen && loadingBg.getVisibility() == View.GONE){
Log.d("XWalkLib", "loadingBgShow1: " + isFullScreen);
loadingBg.setVisibility(View.VISIBLE);
handler.removeMessages(DELAY_CLOSE_LOADING);
handler.sendEmptyMessageDelayed(DELAY_CLOSE_LOADING, 500);
}else if (!isFullScreen && loadingBg.getVisibility() == View.GONE){
Log.d("XWalkLib", "loadingBgShow2: " + isFullScreen);
loadingBg.setVisibility(View.VISIBLE);
handler.removeMessages(DELAY_CLOSE_LOADING);
handler.sendEmptyMessageDelayed(DELAY_CLOSE_LOADING, 500);
}
}
});
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
Log.d("XWalkLib", "KEYCODE_BACK");
if (xwalkview.getNavigationHistory().canGoBack() || isFullScreen) {
Log.d("XWalkLib", "back");
if (isFullScreen && loadingBg.getVisibility() == View.GONE){
Log.d("XWalkLib", "loadingBgShow2: " + isFullScreen);
loadingBg.setVisibility(View.VISIBLE);
handler.removeMessages(DELAY_CLOSE_LOADING);
handler.sendEmptyMessageDelayed(DELAY_CLOSE_LOADING, 500);
}
xwalkview.getNavigationHistory().navigate(
XWalkNavigationHistory.Direction.BACKWARD, 1); //返回上一页面
return true;
} else {
Log.d("XWalkLib", "finish");
finish(); //退出
}
return true;
}
return false;
}
private final int DELAY_CLOSE_LOADING = 0x12;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == DELAY_CLOSE_LOADING){
loadingBg.setVisibility(View.GONE);
}
}
};
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.XWalkActivity">
<org.xwalk.core.XWalkView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<FrameLayout
android:id="@+id/loading_bg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black"
android:visibility="gone"/>
</RelativeLayout>
loadingBgShow1 是非全屏切换成全屏的时候显示覆盖页,延时关闭
loadingBgShow2 是全屏切换成非全屏的时候显示覆盖页,延时关闭
但是关闭全屏播放有两种方式:
一种是按返回键,我们在 onKeyDown里面监听了,点击后在闪现到桌面之前可以第一时间覆盖住,这种方式退出全屏没有问题,不会闪了。
另一种点击视频播放界面右下角的缩放按钮退出。这个时候,没办法监听到点击事件,飞鼠的enter按键被拦截了,复写XWalkUIClient里面的点击监听方法也监听不到的。就算能监听到,也无法判断是否点击到了缩放按钮。这个时候只能退而求其次,在onFullscreenToggled里面,进行判断loadingBgShow2,这只能减少闪现的时间。由于点击退出全屏按钮的第一时间没有覆盖住,直接闪现到桌面了,但是点击不会立即调用onFullscreenToggled,这个时候还是会闪一下。目前还没想到好的解决方案,暂时先这样解决了,由于我这个是tv开发,用户一般习惯用返回键关闭。
ps:方法有点笨,后续有更好的方案再更新