最近遇到了一个比较奇葩的需求:要求一个屏幕分上下两屏来显示不同的视频,视频有很多段,我把它们组成一个list或者一个数组,然后让上下两个VideoView分别以单、双数的方式循环这些视频,我做的初始模型比较简单,是根据递归调用方式来实现的,这个代码比较简单,不考虑性能和美观,做一个简单处理。
首先第一步在布局中分上下两个VideoView:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<VideoView
android:id="@+id/videoview_1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="center"
android:layout_weight="1" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@android:color/white" />
<VideoView
android:id="@+id/videoview_2"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="center"
android:layout_weight="1" />
</LinearLayout>
第二步在Activity中初始化这两个控件:
mVideoView_1 = (VideoView) findViewById(R.id.videoview_1);
mVideoView_2 = (VideoView) findViewById(R.id.videoview_2);
videosList = new ArrayList<String>();
for (int i = 0; i < videos.length; i++) {
String uri_one = "android.resource://" + getPackageName() + "/" + videos[i];
videosList.add(uri_one);
}
这里我取用了四个短视频,然后再把它们一一add到videosList中:
private int[] videos = { R.raw.video1, R.raw.video2, R.raw.video3,
R.raw.video4};
第三步是利用递归来实现我们的分屏幕播放,在我们的方法当中传参当前要播放的VideoView,以及我们的videosList,最后一个参数是我们的起始播放position:
private void videoView_Play(final VideoView videoView, final List<String> videosList, final int position) {
videoView.setVideoURI(Uri.parse(videosList.get(position)));
videoView.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
videoView.start();
}
});
videoView.setOnErrorListener(new OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
// TODO Auto-generated method stub
return false;
}
});
//播放成功完成之后
videoView.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
if (position + 2 < videosList.size()) {
//递归回调
videoView_Play(videoView, videosList, position + 2);
} else {//检查是否播放完成,开始循环播放
if (position % 2 == 0) {
videoView_Play(videoView, videosList, 0);
} else if (position % 2 == 1) {
videoView_Play(videoView, videosList, 1);
}
}
}
});
}
最后,我们在我们需要的地方进行这个递归方法的调用就可以了
videoView_Play(mVideoView_1, videosList, 0);
videoView_Play(mVideoView_2, videosList, 1);
mVideoView_1负责实现第1、3、5、7......视频的播放并循环;
mVideoView_2负责实现第2、4、6、8......视频的播放并循环;
这样功能就实现了,代码比较low,自己摸索的,希望大家多给给相关改进意见,O(∩_∩)O谢谢