前言
我使用VideoView的时候遇到一个很棘手的问题:VideoView播放本地视频的开始会出现短暂的黑屏。
在网上查找方法,实测发现网上并不能解决这个问题。
如何避免播放前的黑屏现象呢,于是,记录一下我解决本地视频短暂黑屏的方法。
目录
方法
自定义一个布局:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.VideoActivity"
android:orientation="vertical">
<VideoView
android:id="@+id/activity_video_videoView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<View
android:id="@+id/activity_video_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"/>
</FrameLayout>
首先在VideoView前面添加一个View背景
代码示例如下:
public class VideoActivity extends AppCompatActivity {
private VideoView mVideoView;
private View mView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video);
mVideoView = findViewById(R.id.activity_video_videoView);
mView = findViewById(R.id.activity_video_view);
// 直接使用资源ID来播放视频
mVideoView.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.a4));
//监听器会在视频准备播放时被调用
mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.setOnInfoListener(new MediaPlayer.OnInfoListener() {
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
//这个状态表示展现了用于渲染的第一帧视频
if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START){
//将View的背景色设置为透明。
mView.setBackgroundColor(Color.TRANSPARENT);
}
return true;//表示这个信息事件已经被处理,不需要再传递给其他可能的监听器
}
});
}
});
mVideoView.start();
}
}
最终的解决办法是在onPrepared回调中,加添加一个setOnInfoListener的监听,在这个监听中将View的背景设置成透明色。
PS: 这个方法在4.1版本才支持,4.1之前的版本不支持