打造视频播放界面

开始自己写播放器界面,其实出于迫不得已。此前一直用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则负责绘制展示视频资源。接下来我就在想,我要给播放控制器添加什么样的功能。从界面上看,其实很容易分析:

  1. 播放进度控制和显示;
  2. 声音调控;
  3. 电量变化;
  4. 暂停恢复;
  5. 按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博客。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值