打造视频播放界面
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拆分出来后,引入到一个新建的测试项目中,就可以开始开发了。我的播放器界面其实很简单:
播放控制器在SurfaceView上层。SurfaceView则负责绘制展示视频资源。接下来我就在想,我要给播放控制器添加什么样的功能。从界面上看,其实很容易分析:
播放进度控制和显示;
声音调控;
电量变化;
暂停恢复;
按home键,锁屏,接电话时的进度保存等。
不过,我想了一番后,选择了从一个小的细节入手。那就是对屏幕无操作一段时间后,让qqlive_media_controller消失,用户可以全然地聚焦在视频本身。当用户需要控制进度时,再点击屏幕,显示qqlive_media_controller。而且,用户操作完可以直接点击屏幕隐藏qqlive_media_controller。我觉得这才是播放器最人性化的地方。要使这几项操作不冲突,一是要知道最后操作时间,二是要处理好控件的onTouch事件。 我对surface和media_controller都实现了onTouch监听:
至于屏幕无操作一段时间后,自动隐藏则需要借助与Timer和TimerTask类。每隔一段时间,就检查当前时间与上次操作的时差是否大于预定值,例如5秒钟,大于则隐藏media_controller。需要注意一点的是,因为代码里,设计到了北京时间的更新,当前播放时间的更新和进度条更新等。这些操作都不要放在media_controller不可见的时候,这会导致media_controller异常地收到onTouch事件,导致逻辑混乱。
写于2013年,来自于eoe博客。
当我费了一番心思,反编译了腾讯视频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博客。
相关文章推荐
- DVI 视频接口图文解析
- C#实现语音视频录制-附demo源码
- AnyChat的视频会议程序实例详解
- C#调用mmpeg进行各种视频转换的类实例
- C#获取视频某一帧的缩略图的方法
- MediaPlayer 在线播放器代码
- 显示youtube视频缩略图和Vimeo视频缩略图代码分享
- PHP使用ffmpeg给视频增加字幕显示的方法
- PHP实现将视频转成MP4并获取视频预览图的方法
- C++实现优酷土豆去视频广告的方法
- PHP简单获取视频预览图的方法
- asp.net 页面中添加普通视频的几种方式介绍
- 深入Android MediaPlayer的使用方法详解
- Mac OS下为Android Studio编译FFmpeg解码库的详细教程
- Android提高之MediaPlayer播放网络视频的实现方法
- Android开发之MediaPlayer多媒体(音频,视频)播放工具类
- Android提高之MediaPlayer播放网络音频的实现方法
- Android提高之MediaPlayer音视频播放
- Android获取SD卡上图片和视频缩略图的小例子
- php使用memcoder将视频转成mp4格式的方法