因爲項目需求是對影像資料的瀏覽,在完成視頻圖片的選擇壓縮或錄製壓縮上傳後做了仿類似微信的圖片視頻瀏覽支持橫向滾動和拖拽退出功能,現在抽點時間寫一下。
需要解決的問題有
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轉場動畫
手勢的處理參考拖拽返回