因为项目需求是对影像资料的浏览,在完成视频图片的选择压缩或录制压缩上传后做了仿类似微信的图片视频浏览支持横向滚动和拖拽退出功能,现在抽点时间写一下。
需要解决的问题有
MediaPlayer中的release,reset,stopPlayBack都是同步的,不可见时调用stopPlayBack停止播放
列表播放视频
1.videoview播放时现黑屏或者透明的问题。
videoView.setZOrderOnTop(true);
Surface是纵深排序(Z-ordered)的,说明它总在自己所在窗口的后面。这个方法是将SurfaceView挪到上层。这样就能简单的避免透明的发生。
由于VideoView加载资源需要一定的耗时,视频加载到视频渲染到屏幕这个过程也是需要时间的。如何避免播放前的黑屏现象呢需要等到视频真正开始渲染后再去掉VideoView 的背景
videoView.setOnInfoListener中
if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) {
imgThumb.animate().alpha(0).setDuration(200).start();
}
当前界面有视频播放时进入其他界面(或者谈起PopupWindow/分享到微信、朋朋友圈、QQ等),然后跳转回来后VideoView展示全黑(按home键再次进入app也会有同样的问题)
SufaceView继承自View,复写了View中的onWindowVisibilityChanged方法。
@Override
protected void onWindowVisibilityChanged(int visibility) {
super.onWindowVisibilityChanged(visibility);
mWindowVisibility = visibility == VISIBLE;
mRequestedVisible = mWindowVisibility && mViewVisibility;
updateWindow(false, false);
}
具体看下updateWindows方法
if (mSurfaceCreated && (surfaceChanged || (!visible && visibleChanged))) {
mSurfaceCreated = false;
if (mSurface.isValid()) {
if (DEBUG) Log.i(TAG, "visibleChanged -- surfaceDestroyed");
callbacks = getSurfaceCallbacks();
for (SurfaceHolder.Callback c : callbacks) {
c.surfaceDestroyed(mSurfaceHolder);
}
}
}
也就是当Windwos不可见的时候,会执行到SufaceHolder的Destory方法。
总结一下,SufaceView在Windows状态可见不可见的变化中,SufaceView会重新create及destory,这样就会导致黑屏
还有视频的浏览的转场动画和拖拽功能
使用ActivityOptionsCompa实现Activity转场动画
手势的处理参考拖拽返回