1.传值除了用Intent还能用什么
2.自定义view
3.事件分发机制
4.让周末在家:视频实现倍速、镜像以及AB循环播放(倍速和镜像面试官已经做出来了,只要完成AB循环播放,模仿中舞网
app的视频播放)
5.技术是个妹子,技术是个妹子,技术是个妹子
周末找demo,找视频播放框架,去ijkplayer-issues的github上提问最后没有思路放弃了,周一上午一觉睡起来,突来来了灵感
1.先随便找了个demo用来设置ab两点-ATDragViewDemo
2.采用Viatmio
框架播放(妹子用的就是这个)
3.获取视频的时间长度duration = mVideoView.getDuration()
,结果得到的值始终是-1,查了下说要在视频播放器的准备事件里获取
mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
//此处设置播放速度为正常速度1,可以更改倍速
mediaPlayer.setPlaybackSpeed(1.0f);
//在这里获取
duration = mediaPlayer.getDuration()
}
});
这会结果终于不是-1了,变成0了,算了时间快来不及了,写死吧,反正以后获取视频播放地址的时候会返回视频的时间长度的(如果不返回再说0.0)
4.根据时间的长度(多少秒)来把上面的ATDragView
分成多少份,每滑动一次就是一秒
5.在ATDragView
的OnDragFinishedListener中分别设置ab两点
atDragView.setLinstener(new ATDragView.OnDragFinishedListener() {
@Override
public void dragFinished(int leftPostion, int rightPostion) {
//因为每次滑动a或者b都会进入这个方法
//当我只滑动了b的时候,也会让视频跳转到a开始播放
//所以每次记录下新的a的位置`newStart`,与全局的`start`作比较,如果不一致就保存新的位置,并跳转到新的位置播放
long newStart = leftPostion;
long newEnd = rightPostion;
if (start != newStart) {
start = leftPostion;
mVideoView.seekTo(start);
}
end = rightPostion;
Log.i("test", "开始:" + leftPostion + "结束:" + rightPostion + "当前 毫秒" + start);
}
});
6.找到获取当前播放事件的方法mVideoView.getCurrentPosition()
,然后起个定时器,每隔一秒查询下当前的位置,如果大于等于b就跳转到a
timer = new Timer();//定时器,每隔一秒查询下当前的进度
timer.schedule(task, 0, 1000);
TimerTask task = new TimerTask() {
@Override
public void run() {
long currentPosition = mVideoView.getCurrentPosition();//获取当前播放进度
if (end != 0 && currentPosition >= end) {//如果进度大于等于设置的b,那么跳转到a
mVideoView.seekTo(start);
}
}
};
一个简单的demo就完成了,当我兴高采烈的发给面试官的时候,面试官说别人一个下午就做好了,唉,心塞,谁让自己以前没有做过视频播放呢,记录下,就当锻炼自己了
网友评论