视频播放相关内容总结

视频播放相关内容总结Surface简介Surface就是“表面”的意思。在SDK的文档中,对Surface的描述是这样的:“Handle onto a raw buffer that is being managed by the screen compositor”,翻译成中文就是“由屏幕显示内容合成器(screen compositor)所管理的原生缓冲器的句柄”,这句话包括下面两个意思: SurfaceView简介简单的说SurfaceView就是一个有Surface的View里面内嵌了一个专门用于绘制的Surface,SurfaceView控制这个Surface的格式和尺寸以及绘制位置.SurfaceView是一个View也许不够严谨,然而从定义中 public class SurfaceView extends View显示SurfaceView确实是派生自View,但是SurfaceView却有着自己的Surface,源码: java if (mWindow == null) { mWindow = new MyWindow(this); mLayout.type = mWindowType; mLayout.gravity = Gravity.LEFT|Gravity.TOP; mSession.addWithoutInputChannel(mWindow, mWindow.mSeq, mLayout, mVisible ? VISIBLE : GONE, mContentInsets); } 很明显,每个SurfaceView创建的时候都会创建一个MyWindow,new MyWindow(this)中的this正是SurfaceView自身,因此将SurfaceView和window绑定在一起,而前面提到过每个window对应一个Surface,所以SurfaceView也就内嵌了一个自己的Surface,可以认为SurfaceView是来控制Surface的位置和尺寸。传统View及其派生类的更新只能在UI线程,然而UI线程还同时处理其他交互逻辑,这就无法保证view更新的速度和帧率了,而SurfaceView可以用独立的线程来进行绘制,因此可以提供更高的帧率,例如游戏,摄像头取景等场景就比较适合用SurfaceView来实现。Surface是纵深排序(Z-ordered)的,这表明它总在自己所在窗口的后面。Surfaceview提供了一个可见区域,只有在这个可见区域内的Surface部分内容才可见,可见区域外的部分不可见,所以可以认为SurfaceView就是展示Surface中数据的地方,Surface就是管理数据的地方,SurfaceView就是展示数据的地方,只有通过SurfaceView才能展现Surface中的数据。

Surface的排版显示受到视图层级关系的影响,它的兄弟视图结点会在顶端显示。这意味者Surface的内容会被它的兄弟视图遮挡,这一特性可以用来放置遮盖物(overlays)(例如,文本和按钮等控件)。注意,如果Surface上面有透明控件,那么它的每次变化都会引起框架重新计算它和顶层控件的透明效果,这会影响性能。surfaceview变得可见时,surface被创建;surfaceview隐藏前,surface被销毁。这样能节省资源。如果你要查看 surface被创建和销毁的时机,可以重载surfaceCreated(SurfaceHolder)和 surfaceDestroyed(SurfaceHolder)。SurfaceView的核心在于提供了两个线程:UI线程和渲染线程,两个线程通过“双缓冲”机制来达到高效的界面适时更新。SurfaceHolder简介

显示一个Surface的抽象接口,使你可以控制Surface的大小和格式以及在Surface上编辑像素,和监视Surace的改变。这个接口通常通过SurfaceView类实现。简单的说就是我们无法直接操作Surface只能通过SurfaceHolder这个接口来获取和操作Surface。 SurfaceHolder中提供了一些lockCanvas()`:获取一个Canvas对象,并锁定之。所得到的Canvas对象,其实就是Surface中一个成员。加锁的目的其实就是为了在绘制的过程中,Surface中的数据不会被改变。lockCanvas是为了防止同一时刻多个线程对同一canvas写入。

从设计模式的角度来看,Surface、SurfaceView、SurfaceHolder实质上就是MVC(Model-View-Controller),Model就是模型或者说是数据模型,更简单的可以理解成数据,在这里也就是Surface,View就是视图,代表用户交互界面,这里就是SurfaceView,SurfaceHolder就是Controller.

MediaControllerMediaController继承FrameLayout,通过MediaPlayerControl接口与VideoView进行结合控制,内部是通过PopupWindow将整个控制栏界面显示到界面上,而该PopupWindow所显示在的位置就是通过setAnchorView()设置进来的Anchor一般可以使当前的VideoView或者是整个Activity的根布局。这里要分为小屏和全屏两种情况来进行设置。如果当前的MediaController只是播放前下面的控制栏部分(进度条、快进、快退、暂停等)这样我们可以通过对VideoView设置点击事件,控制它的显示和隐藏。如果MediaController为整个屏幕包括了控制栏部分、上端的信息显示部分、以及左右栏的功能部分、这时候就可以通过对MediaController本身设置点击事件来控制显示和隐藏。 Controller可以用PopupWindow来实现,具体有两种方式: 整个控制栏(上面的信息部分、下面的控制部分以及左右边)都在Controller中,setAnchorView()的时候就会让Controller中的PopupWindow显示出来(一直显示,但是这个PopupWindow是透明的),真正的显示与隐藏是控制在PopupWindow中的View部分的显示与隐藏来实现。开始的时候我是想用这种方式,当时我想的是播放就播放、控制就控制,,分离开来多好,但是没想到,一旦有PopupWindow显示出来后,Activity是接收不到任何Touch事件的,所有的重试界面等都要放到Controller中实现(手势处理等)。但是也有好处,就是不管显示还是隐藏都可以去处理手势.PopupWindow不是全屏的,只包含下面真正的控制部分(快进、快退、暂停等,不包含上面的信息部分和左右边),而且也不是开始就显示,显示隐藏是通过控制PopupWindow的显示与隐藏来进行的。而对于信息部分、以及左右边都是在Activity的布局当中,我们通过接口回调得到PopupWindow的显示与隐藏来控制这些布局的显示与隐藏即可。这样的话我们就需要将手势等全部放到Activity中去处理,但是也有一个问题,就是如果Controller正在显示的话Activity是接收不到Touch事件的,就无法处理手势,只能是让Controller消失后才能处理手势。邮箱 :charon.chui@gmail.com Good Luck!

我知道有一种爱情,叫做与你白头,有一种幸福,叫做和你相伴。

视频播放相关内容总结

相关文章:

你感兴趣的文章:

标签云: