您的位置:首页 > 移动开发 > Android开发

android 4.0 videoPlayer上层代码分析

2012-07-04 14:59 267 查看
4.0的代码和2.3的代码增加了actionbar的功能,增加了对overlay的应用。由两个类变成四个主要类。

MovieActivity.java

该类的的作用主要是做初始化操作,以及设置屏幕的属性:

1. 设置ActionBar的属性

这里简单介绍一下4.0的新控件。个人觉得ActionBar已经被包装的非常强大,我们只需要设置一下即可使用,视频的代码中,ActionBar主要配合ShareActionProvider来作为共享视频来使用(蓝牙,短信,email等)

Action Bar主要是用于代替传统的标题栏,对于Android平板设备来说屏幕更大它的标题使用Action Bar来设计可以展示更多丰富的内容,方便操控。

 Action Bar主要功能包含:

  1. 显示选项菜单

  2. 提供标签页的切换方式的导航功能,可以切换多个fragment.

  3. 提供下拉的导航条目.

  4. 提供交互式活动视图代替选项条目

  5. 使用程序的图标作为返回Home主屏或向上的导航操作。

视频里的使用方法:

1. 在设置完布局文件后创建实例ActionBar actionBar = getActionBar();

2.设置bar的显示方式,有好多种,可以自己尝试actionBar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP
ActionBar.DISPLAY_HOME_AS_UP);

至此actionBar就可以显示出来了。

3.设置共享条目:设置条目的布局文件,setShareIntent

这里的intent的相关设置为Intent.ACTION_SEND,以及Intent.EXTRA_STREAM(发动二进制数据)等,具体见代码。

4.最后,如果某应用程序可以发送该文件,那么在其可以接收的类中配置相关的

ACTION_FILTER(SEND)即可共享该视频或者图片

2. 创建moviePlayer,请求和释放焦点

mPlayer =
new
MoviePlayer(rootView, this, intent.getData(), savedInstanceState, !mFinishOnCompletion)
传递URI等信息

Onstart方法中请求音频焦点,onstop中释放音频焦点

3.设置屏幕属性

具体见代码,略

MoviePlayer.java

这个类的主要功能是控制视频的播放,对用户的一切动作(触屏,暂停,播放等)进行监听。

首先创建MoviePlayer的时候。实现了三个接口:

1.MediaPlayer.OnErrorListener:
方法onError中我们返回false,这样VideoView本身会弹出错误对话框,这里不用我们做太多处理。
2.MediaPlayer.OnCompletionListener:
方法onCompletion。这里还需要深入
问题所在:这个方法中应该会关闭activity,返回调用界面。但是这里的代码好像不足以做这些事情,后续研究。
3.ControllerOverlay.Listener

实现了很多方法,基本为:播放器播放暂停,开始拖拽,设置videoView的拖拽时间,actionBar的显示和隐藏等。

该类中的还做了一些基本操作:

1.
视频播放的时候,发送广播让音乐停止

2.
对耳机的插入,蓝牙耳机的暂停播放事件的监听。(耳机拔出时暂停播放)

3.
打开上次没有观看结束的视频时,弹出提示对话框。

下面说说打开该对话框的实现:

首先在观看视频的时候,如果中途返回会执行onPause()方法,那么这里会将该视频的Uri,position,duration信息放到bookmark中。

所以每次看视频,执行onCreate的时候,判断该Uri是否为空,如果为空,那么就是代表该视频没有被存为bookmark,那么从头开始播放,否则,弹出dialog提示用户是从头播放还是从bookmark中的position中开始播放。

注意:1.在视频被暂停了超过3分钟后,重新开始播放时,视频会从头播放

没有对来电事件进行监听,后续验证4.0在来电和挂断电话时的状态。

MovieControllerOverlay.java

ControllerOverlay:

该接口中的方法主要控制除了actionBar之外的View的显示和隐藏。
OnClickListener,
实现onClickListener接口中方法,如果停在暂停播放界面,
1.播放结束,如果重复播放,那么调用开始播放
2.暂停或者播放状态,具体问题具体分析
AnimationListener,
onAnimationEnd方法中隐藏View
TimeBar.Listener

onScrubbingStart等三个方法,较容易理解,具体见代码,此处略

分析:视频代码是怎样将这三个类紧密联系起来的。

首先MovieActivity.java这个activity调用MoviePlayer.java来实现播放可以理解.

接口ControllerOverlay定了很多方法,接口中又定义了接口Listener,该做法有什么好处?

而且在MoviePlayer和MovieControllerOverlay实现ControllerOverlay接口时有些混乱,

MoviePlayer实现了Listener,而MovieControllerOverlay实现了ControllerOverlay

首先要仔细观察接口中的方法

View getView();
voidshow();
void showPlaying();
void showPaused();
void showEnded();
void showLoading();
void showErrorMessage…;
void hide();
void setTimes…;
void resetTime();

interface Listener {
void onPlayPause();
void onSeekStart();
void onSeekMove(int time);
void onSeekEnd(int time);
voidonShown();
void onHidden();
void onReplay();

两个方法中都有相似的show方法,但是分析方法发现,show只要是控制除了actionBar(在listener中处理)之外的View的显示,是大方向的显示控制。在进一步想:实现类MovieControllerOverlay也是对大方向的View的控制,所以两者的用意一致。

而listener是MovieControllerOverlay和Movieplayer一个沟通桥梁。因为MovieControllerOverlay主View大方向显示,但是大方向中也有对VideoView信息的获取,所以要利用listener来实现信息的共享,两个类以回调联系。如show中调用onShown来获取VideoView的播放时间和时长,onShown中又调用setprogess,setProgress调用MovieControllerOverlay中的setTime来实现设置播放界面时间点

这是典型的回调
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: