您的位置:首页 > 其它

打造视频播放界面

2016-01-15 20:11 190 查看
开始自己写播放器界面,其实出于迫不得已。此前一直用vitmaio的官方播放界面。但问题是,我现在需要使用分段播放的功能,而带有MediaController(播放控制器)的VideoView并不具有分段播放的功能。本想试着把分段播放的功能从Vitamio改造过的MediaPlayer的分段播放功能移植到VideoView中,但时间仓促,不能细看两个类的源代码,而且也并不清楚是否和底层实现密切相关。因此只能老老实实在MediaPlayer上做修改。 尽管视频播放的界面其实大同小异。但真做起来,发现细节不少。由于木有产品设计人员,我需要参照现有的市面上的播放器播放界面,然后仿照。后面我选定了腾讯的播放界面。

当我费了一番心思,反编译了腾讯视频apk,把res全部导入新建项目,通过上次讲过的一些排错方法后,终于看到每个xml文件都能正常显示。当然,我最需要的就是播放控制器页面:qqlive_media_controller.xml。英文ok的话,很快就能联想到。不知为何,尽管用的是最新的apk,但解压出来的播放器界面,却明显是早期版本。不过并不影响借鉴。 把qqlive_media_controller.xml拆分出来后,引入到一个新建的测试项目中,就可以开始开发了。我的播放器界面其实很简单:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
<io.vov.vitamio.widget.CenterLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<SurfaceView android:id="@+id/surface"
android:layout_height="match_parent"
android:layout_gravity="center" >
</SurfaceView>
</io.vov.vitamio.widget.CenterLayout>
<include layout="@layout/qqlive_media_controller" />
</FrameLayout>


播放控制器在SurfaceView上层。SurfaceView则负责绘制展示视频资源。接下来我就在想,我要给播放控制器添加什么样的功能。从界面上看,其实很容易分析:

播放进度控制和显示;

声音调控;

电量变化;

暂停恢复;

按home键,锁屏,接电话时的进度保存等。

不过,我想了一番后,选择了从一个小的细节入手。那就是对屏幕无操作一段时间后,让qqlive_media_controller消失,用户可以全然地聚焦在视频本身。当用户需要控制进度时,再点击屏幕,显示qqlive_media_controller。而且,用户操作完可以直接点击屏幕隐藏qqlive_media_controller。我觉得这才是播放器最人性化的地方。要使这几项操作不冲突,一是要知道最后操作时间,二是要处理好控件的onTouch事件。 我对surface和media_controller都实现了onTouch监听:

@Override public boolean onTouch(View v, MotionEvent event) {
//每操作一次,修改一次最后操作时间
synchronized (lastOperationTime)
{
lastOperationTime = System.currentTimeMillis();
}
/*如果media_controller获得touch事件,表明它正显示,
点击屏幕即可隐藏。 而media_controller里的seekbar,
button被操作时,media_controller没有机会 获得touch事件,
不会影响seekbar,button的操作 */
if (v.getId() == R.id.media_controller) {
media_controller.setVisibility(View.INVISIBLE);
Date now = new Date();
SimpleDateFormat simpleDateFormat =new   SimpleDateFormat("HH:mm");
tv_beijing_time.setText(simpleDateFormat.format(now));
}

}
/*media_controller获得touch事件后,需要返回true,
否则事件会往下传递,surface也能收到 */

return true;
}


至于屏幕无操作一段时间后,自动隐藏则需要借助与Timer和TimerTask类。每隔一段时间,就检查当前时间与上次操作的时差是否大于预定值,例如5秒钟,大于则隐藏media_controller。需要注意一点的是,因为代码里,设计到了北京时间的更新,当前播放时间的更新和进度条更新等。这些操作都不要放在media_controller不可见的时候,这会导致media_controller异常地收到onTouch事件,导致逻辑混乱。

写于2013年,来自于eoe博客。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  视频 mediaplayer