这两天遇到这样的bug:播放视频的时候,会先闪现一下桌面再显示视频。
第一我想到的是activity 的window background设置为了null,找到对应的activity (/packages/apps/Gallery2/src/com/android/gallery3d/app/MovieActivity.java)将
// We set the background in the theme to have the launching animation.
// But for the performance (and battery), we remove the background here.
win.setBackgroundDrawable(null); win.setBackgroundDrawable()设置为一张图片。运行问题仍存在。
接着我看了播放视频MovieActivity的布局文件:
RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/movie_view_root"
android:background="@android:color/black"
android:layout_width="match_parent"
android:layout_height="match_parent">
//这里使用了自定义的surfaceview来播放视频
</RelativeLayout>
这个布局文件里也设置了黑色的背景。接着我也修改了activity的主题,还是没有作业。按道理不可能看到桌面才对!可是事实是看到了!
最后定位到了SurfaceView,最后在网上搜索了到SurfaceView的原理:
http://blog.csdn.net/luoshengyang/article/details/8661317/
注意,用来描述SurfaceView的Layer或者LayerBuffer的Z轴位置是小于用来其宿主Activity窗口的Layer的Z轴位置的,但是前者会在后者的上面挖一个“洞”出来,以便它的UI可以对用户可见。实际上,SurfaceView在其宿主Activity窗口上所挖的“洞”只不过是在其宿主Activity窗口上设置了一块透明区域。
接着我按照网上的方法,修改
setZOrderOnTop(true);
mHolder.setFormat(PixelFormat.TRANSPARENT);//设置背景透明
但这种做法会使得surfaceView属于view树的顶层,导致将其他的播放按钮挡住了。
最后再同事的提醒下参考了/packages/apps/Gallery2/src/com/android/gallery3d/ui/GLRootView.java这里的做法。
增加一层view来遮住surfaceview.
GLSurfaceView也是继承Surfaceview,所以也同样有透明到桌面的问题。
// We put a black cover View in front of the SurfaceView and hide it
// after the first draw. This prevents the SurfaceView being transparent
// before the first draw.
if (mFirstDraw) {
mFirstDraw = false;
post(new Runnable() {
@Override
public void run() {
View root = getRootView();
View cover = root.findViewById(R.id.gl_root_cover);
cover.setVisibility(GONE);
}
});
}
所以我也在
RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/movie_view_root"
android:background="@android:color/black"
android:layout_width="match_parent"
android:layout_height="match_parent">
//这里使用了自定义的surfaceview来播放视频
//增加一层cover
<View android:id="@+id/root_cover"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black"/>
</RelativeLayout>
当视频prepare完成之后将这个cover隐藏起来。在MediaPlayer.OnPreparedListener回调函数里增加
if (mFirstDraw) {
mFirstDraw = false;
post(new Runnable() {
@Override
public void run() {
View root = getRootView();
View cover = root.findViewById(R.id.gl_root_cover);
cover.setVisibility(GONE);
}
});
}
问题完美解决。
分享到:
相关推荐
解决SurfaceView设置透明造成覆盖其他组件的替代方案,同时也实现了圆盘的功能
安卓看视频的时候,视频画面局部放大和缩小插件,基于SurfaceView修改的。
SurfaceView 多层绘制透明图 一层有一层 上层能看见以前绘制的
Android SurfaceView 实现实时显示摄像头视频,详见博客:https://blog.csdn.net/qq_30297763/article/details/90241102
Android游戏开发, SurfaceView!
这是一个用surfaceview来捕捉摄像头画面并拍照存储图片到sdcard的demo。众所周知,在一个应用中,我们可以通过intent来调用系统自带的相机功能进行拍 照,但,这样做不如自己写一个拍照界面来的酷!用surfaceview的...
surfaceView 网页surfaceView 网页surfaceView 网页surfaceView 网页surfaceView 网页surfaceView 网页
android使用双缓冲辨析及surfaceview使用例子
这是在上网收集的,能够截取当前Activity中surfaceView中图片。本人亲测可以通过。
android MediaPlayer SurfaceView
SurfaceView一般用于游戏中,但是有时候我们自定义View的时候,自定义View现有的功能区不能达到我们预期的效果,所以surfaceview也是一个不错的选择.这个demo是一个surfaceview的基础应用,适合新手.
android surfaceview圆角
surfaceview进行屏幕截图demo
Android中使用surfaceview开发的Camera相机,内容含有注释,非常清楚
android之surfaceview游戏开发