`
如沐春风的小妮
  • 浏览: 69762 次
  • 性别: Icon_minigender_2
  • 来自: 西安
社区版块
存档分类
最新评论

Android学习--surfaceview

 
阅读更多

题记:

后续会做一个关于网络视频播放的应用,所以提前将需要用到的相关知识进行学习总结。

 

首先看一下API对surfaceview的定义:
SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Surface。你可以控制这个Surface的格式和尺寸。Surfaceview控制这个Surface的绘制位置。
        surface是纵深排序(Z-ordered)的,这表明它总在自己所在窗口的后面。surfaceview提供了一个可见区域,只有在这个可见区域内 的surface部分内容才可见,可见区域外的部分不可见。surface的排版显示受到视图层级关系的影响,它的兄弟视图结点会在顶端显示。这意味者 surface的内容会被它的兄弟视图遮挡,这一特性可以用来放置遮盖物(overlays)(例如,文本和按钮等控件)。注意,如果surface上面 有透明控件,那么它的每次变化都会引起框架重新计算它和顶层控件的透明效果,这会影响性能。
        可以通过SurfaceHolder接口访问这个surface,getHolder()方法可以得到这个接口。
        surfaceview变得可见时,surface被创建;surfaceview隐藏前,surface被销毁。这样能节省资源。如果要查看 surface被创建和销毁的时机,可以重载surfaceCreated(SurfaceHolder)和 surfaceDestroyed(SurfaceHolder)。
        surfaceview的核心在于提供了两个线程:UI线程和渲染线程。这里应注意:
        1> 所有SurfaceView和SurfaceHolder.Callback的方法都应该在UI线程里调用,一般来说就是应用程序主线程。渲染线程所要访问的各种变量应该作同步处理。
        2> 由于surface可能被销毁,它只在SurfaceHolder.Callback.surfaceCreated()和 SurfaceHolder.Callback.surfaceDestroyed()之间有效,所以要确保渲染线程访问的是合法有效的surface。

 

突然间意识到,之前做过的3D相册应用其实就是在SurfaceView绘制的,怪不得看API介绍的时候倍感亲切~_~

 

要继承SurfaceView类,必须实现SurfaceHolder.Callback接口通过这个接口,可以获得Surface对象正在处理的底层信息,比如Surface对象被创建、更新或销毁。这些非常重要,因为可以知道何时开始绘制,对于新的Surface对象的属性,可以知道在何处调整,也知道何时停止绘制合适。

需要重写的方法:

  (1) public void surfaceChanged(SurfaceHolder holder,int format,int width,int height){}

     //在surface的大小发生改变时激发(第一次也肯定会被调用啦~)

 (2) public void surfaceCreated(SurfaceHolder holder){}

     //在创建时激发,一般在这里调用画图的线程。

 (3) public void surfaceDestroyed(SurfaceHolder holder) {}

     //销毁时激发,一般在这里将画图的线程停止、释放。

这里用到了一个类SurfaceHolder, SurfaceView不会直接的处理Surface对象,必须通过 SurfaceHolder。 可以把它当成surface的控制器,用来操纵surface。
几个需要注意的方法:
(1)、abstract void addCallback(SurfaceHolder.Callback callback);
// 给SurfaceView当前的持有者一个回调对象。
(2)、abstract Canvas lockCanvas();
// 锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。
(3)、abstract Canvas lockCanvas(Rect dirty);
// 锁定画布的某个区域进行画图等..因为画完图后,会调用下面的unlockCanvasAndPost来改变显示内容。
// 相对部分内存要求比较高的游戏来说,可以不用重画dirty外的其它区域的像素,可以提高速度。
(4)、abstract void unlockCanvasAndPost(Canvas canv as);
// 结束锁定画图,并提交改变。


因要研究的是surfaceview 用于播放视频,所以只关注addCallback方法,其它方法在代码实现时,未有体验。

测试代码如下:

 

        mSurfaceView = (SurfaceView)findViewById(R.id.video_play);
        mSurfaceHolder = mSurfaceView.getHolder();
        mSurfaceHolder.addCallback(new HolderCallback()); 
        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        public class HolderCallback implements SurfaceHolder.Callback{
      	@Override
     	public void surfaceChanged(SurfaceHolder holder, int format, int width,
    			int height) {
    		// TODO Auto-generated method stub
    		Log.d(TAG, "surfaceChanged called");
        }
    	
    	@Override
    	public void surfaceCreated(SurfaceHolder holder) {
    		// TODO Auto-generated method stub
    		Log.d(TAG, "surfaceCreated called");
               playVedioInit();	    		
    	}
    	
    	@Override
    	public void surfaceDestroyed(SurfaceHolder holder) {
    		// TODO Auto-generated method stub
    		Log.d(TAG, "surfaceDestroyed called");
    	}
    	
    }

 

网上查找资料得出:SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS的意思是创建一个"PUSH"surface,这个surface没有自己的缓冲区,没有自己的缓冲Buffer.

 



 

分享到:
评论

相关推荐

    Android-surfaceview-camera

    通过“Android-surfaceview-camera”项目,开发者可以学习到如何将SurfaceView与Camera结合,构建一个功能完善的相机应用。项目中的注释将有助于理解每个步骤的目的和实现细节,这对于Android开发者来说是一份宝贵的...

    android-SurfaceView 测试Demo

    在Android平台上,SurfaceView是一种特殊的View,用于处理高性能、低延迟的图形绘制,尤其是在开发游戏或者视频播放等需要高效刷新率...同时,源码分析也能帮助开发者学习到Android系统层面的更多知识,提升开发能力。

    SurfaceView-Sample-master.zip_android_surfaceview

    在"SurfaceView-Sample-master.zip"这个压缩包中,包含了"说明.txt"和"SurfaceView-Sample-master"两个文件。"说明.txt"可能详细介绍了如何使用这个示例代码以及其中的关键概念,而"SurfaceView-Sample-master"很...

    mini-bird-android-surfaceview

    以上就是关于"迷你小鸟"Android游戏使用SurfaceView开发的详细讲解,希望对你在Android游戏编程的学习之路上有所帮助。接下来,你可以尝试添加更多的元素和功能,比如音效、动画效果,让游戏更加丰富有趣。祝你在...

    android之surfaceview学习示例

    在这个"android之surfaceview学习示例"中,我们将深入探讨SurfaceView的核心特性和使用方法。 首先,SurfaceView拥有自己的Surface对象,它位于窗口的最底层,直接与硬件交互,允许在主线程之外进行绘制操作,避免...

    Android开发--仿景点通景区地图SurfaceView实现

    在Android应用开发中,自定义视图是实现特定功能或独特界面的重要手段。本示例“Android开发--...对于初学者,通过阅读和理解这段代码,可以深入学习Android中的SurfaceView使用,以及如何处理触摸事件和实现地图功能。

    Android游戏开发学习(2)--SurfaceView实例控制角色移动

    在Android游戏开发中,SurfaceView是一个非常重要的组件,它提供了高效、低延迟的图形渲染机制,特别适合用于游戏和实时视频等对性能要求...这就是"Android游戏开发学习(2)--SurfaceView实例控制角色移动"的主要内容。

    android SurfaceView游戏框架

    开发者可以通过查看这个例子学习如何结合SurfaceView和游戏逻辑来构建自己的游戏框架。 通过理解和熟练运用SurfaceView,开发者可以创建出高性能、流畅的游戏体验,满足用户对于游戏画质和响应速度的需求。同时,...

    Android SurfaceView添加组件view不被组件覆盖-IT计算机-毕业设计.zip

    对于学生来说,这个案例提供了很好的实践机会,可以学习到Android视图层次结构、SurfaceView的特殊性质,以及如何在复杂的UI布局中处理高性能的图形渲染。同时,它还涵盖了Android开发中的布局管理和事件处理等基础...

    Android游戏开发学习(5)--实现Button悬浮于与SurfaceView之上

    在Android游戏开发中,将一个`Button`控件悬浮于`SurfaceView`之上是一项常见的需求。这通常是为了解决在游戏界面中添加交互元素,如暂停、设置或返回按钮,以便用户可以随时进行操作。本篇文章将深入探讨如何实现这...

    android surfaceview自定义拍照 绘制头像轮廓

    在Android开发中,`SurfaceView`是一个非常重要的组件,它提供了与硬件图形渲染直接交互的能力。...通过理解并实践这个项目,开发者可以深入学习Android的底层图形处理以及如何利用第三方库增强应用程序的功能。

    最简单的surfaceview画图和截图

    SurfaceView是Android系统提供...综上所述,这个项目涵盖了SurfaceView的基本使用,包括创建、绘制以及截图等关键步骤,同时也涉及到Bitmap操作和用户交互,是一个很好的学习和实践Android图形处理和自定义视图的实例。

    Android学习-画图着色

    下面将详细介绍这款"Android学习-画图着色"程序的相关知识点。 首先,我们要了解Android应用的基本架构。任何Android应用都是由一系列组件(如Activity、Service、BroadcastReceiver和ContentProvider)构成的。在...

    实例3--使用surfaceView

    《实例3--使用SurfaceView》 SurfaceView是Android系统中一个非常重要的视图组件,它在处理复杂的图形...实例"Demond_3"提供了一个基础的使用示例,读者可以通过阅读源码,进一步学习和实践SurfaceView的使用技巧。

    Android-HeartView通过继承SurfaceView实现直播点亮功能的心形效果

    综上所述,这个项目是一个很好的示例,展示了如何通过继承SurfaceView来自定义复杂视图并实现动画效果,对于学习Android图形绘制和性能优化有着重要的参考价值。在实际开发中,可以借鉴这种方法来创建其他形状的动画...

    Android代码-Android使用SurfaceView实现墨迹天气的风车效果.zip

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者创建高性能的图形界面,尤其适合处理密集型的图像处理和动画效果,如游戏或者我们这里的案例——墨迹天气的风车效果。本教程将深入探讨如何利用...

    Android下使用SurfaceView播放视频文件

    在Android平台上,SurfaceView是一种特殊的视图,常用于处理高性能的图形渲染,比如播放视频或者游戏画面。...通过学习和实践这个Demo,开发者可以掌握在Android应用中集成视频播放功能的关键技术。

    android SurfaceView实现人物动画

    在Android开发中,SurfaceView是一种特殊的视图组件,它提供了在UI线程之外进行渲染的能力,使得...这个示例程序提供了一个实践这些概念的起点,开发者可以通过学习和修改它来提升自己在Android动画开发方面的技能。

    android之surfaceview游戏开发

    通过学习和理解这些代码,开发者可以更好地掌握SurfaceView在游戏开发中的应用。 总的来说,Android的SurfaceView为游戏开发提供了一个高效的平台,结合OpenGL ES和其他Android图形API,开发者可以创建出丰富多彩、...

    Android SurfaceView 多线程 滑块

    总的来说,这个"Android SurfaceView 多线程 滑块"示例是一个很好的学习资源,它涵盖了Android开发中的多线程编程、自定义视图、动画效果和性能优化等多个重要知识点,对于提升Android应用的性能和用户体验有着重要...

Global site tag (gtag.js) - Google Analytics