`
1320438999
  • 浏览: 127542 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Android SurfaceView使用

 
阅读更多

1.概念

SurfaceView是View类的子类,可以直接从内存或者DMA等硬件接口取得图像数据,是个非常重要的绘图视图。它的特性是:可以在主线程之外的线程中向屏幕绘图上。这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。在游戏开发中多用到SurfaceView,游戏中的背景、人物、动画等等尽量在画布canvas中画出。

2.实现方法

1)实现步骤

a.继承SurfaceView

b.实现SurfaceHolder.Callback接口

2)需要重写的方法

public void surfaceChanged(SurfaceHolder holder,int format,int width,int height){}  //在surface的大小发生改变时激发
public void surfaceCreated(SurfaceHolder holder){}  //在创建时激发,一般在这里调用画图的线程。
public void surfaceDestroyed(SurfaceHolder holder) {}  //销毁时激发,一般在这里将画图的线程停止、释放。

3)SurfaceHolder

  SurfaceHolder,surface的控制器,用来操纵surface。处理它的Canvas上画的效果和动画,控制表面,大小,像素等。
几个需要注意的方法:

abstract void addCallback(SurfaceHolder.Callback callback);
// 给SurfaceView当前的持有者一个回调对象。
abstract Canvas lockCanvas();
// 锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。
abstract Canvas lockCanvas(Rect dirty);
// 锁定画布的某个区域进行画图等..因为画完图后,会调用下面的unlockCanvasAndPost来改变显示内容。
// 相对部分内存要求比较高的游戏来说,可以不用重画dirty外的其它区域的像素,可以提高速度。
abstract void unlockCanvasAndPost(Canvas canvas);
// 结束锁定画图,并提交改变。

4)总结整个过程

  继承SurfaceView并实现SurfaceHolder.Callback接口 ----> SurfaceView.getHolder()获得SurfaceHolder对象 ---->SurfaceHolder.addCallback(callback)添加回调函数---->SurfaceHolder.lockCanvas()获得Canvas对象并锁定画布----> Canvas绘画 ---->SurfaceHolder.unlockCanvasAndPost(Canvas canvas)结束锁定画图,并提交改变,将图形显示。

下面是一个完整的案例:

public class ViewTest extends Activity {    @Override
      public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(new MyView(this));
      }     //视图内部类
      class MyView extends SurfaceView implements SurfaceHolder.Callback
      {
         private SurfaceHolder holder;
         private MyThread myThread; 
         public MyView(Context context) {
             super(context);
             // TODO Auto-generated constructor stub
             holder = this.getHolder();
             holder.addCallback(this);
             myThread = new MyThread(holder);//创建一个绘图线程
         }
  
         @Override
         public void surfaceChanged(SurfaceHolder holder, int format, int width,
                  int height) {
             // TODO Auto-generated method stub
               
         }
  
         @Override
         public void surfaceCreated(SurfaceHolder holder) {
              // TODO Auto-generated method stub
             myThread.isRun = true;
             myThread.start();
        }
  
        @Override
         public void surfaceDestroyed(SurfaceHolder holder) {
            // TODO Auto-generated method stub
            myThread.isRun = false;
        }
      }
      //线程内部类
      class MyThread extends Thread
      {
          private SurfaceHolder holder;
          public boolean isRun ;
          public  MyThread(SurfaceHolder holder)
          {
              this.holder =holder; 
              isRun = true;
          }
          @Override
          public void run()
          {
              int count = 0;
              while(isRun)
              {
                  Canvas c = null;
                  try
                  {
                      synchronized (holder){
                        c = holder.lockCanvas();//锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。
                    c.drawColor(Color.BLACK);//设置画布背景颜色
                    Paint p = new Paint(); //创建画笔
                    p.setColor(Color.WHITE);
                    Rect r = new Rect(100, 50, 300, 250);
                    c.drawRect(r, p);
                    c.drawText("这是第"+(count++)+"秒", 100, 310, p);
                    Thread.sleep(1000);//睡眠时间为1秒
                  }
              }
              catch (Exception e) {
                  e.printStackTrace();
              }
              finally
              {
                   if(c!= null)
                 {
                   holder.unlockCanvasAndPost(c);//结束锁定画图,并提交改变。
                }
           }
         }
       }
     }
  }


分享到:
评论

相关推荐

    Android SurfaceView使用Demo

    **Android SurfaceView 使用详解** `SurfaceView` 是 Android 系统提供的一种特殊的视图组件,它允许开发者在应用程序中创建高性能的图形界面,比如游戏、视频播放器等需要连续更新图像的应用。`SurfaceView` 提供...

    android SurfaceView 使用示例 why SurfaceView上 不可以用控件的轻微解释

    1. 使用TextureView:TextureView是Android 4.0(API Level 14)引入的,它提供了一种在UI层面上处理视频和图形的方式,与SurfaceView相比,它支持更多的交互和动画效果。控件可以直接添加到TextureView上,但需要...

    Android SurfaceView 实现图片缩放 滑动

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者创建高性能的图形界面,尤其适合处理视频播放或游戏等需要连续刷新的场景。本话题主要探讨如何利用SurfaceView实现图片的缩放和滑动功能。 首先,理解...

    android surfaceView 双缓冲

    android使用双缓冲辨析及surfaceview使用例子

    android surfaceview 悬浮窗圆角 windowmanager

    在Android开发中,`SurfaceView`是一个特殊类型的`View`,它允许开发者在应用程序中创建一个独立于应用程序主线程的渲染表面。`SurfaceView`通常用于处理高性能的图形或者视频播放,因为它可以在单独的线程中进行...

    Android SurfaceView 实现实时显示摄像头视频

    `SurfaceView`是Android提供的一种用于高效显示多媒体数据的视图组件,尤其适合处理像视频流这样的实时数据。本篇文章将深入探讨如何利用`SurfaceView`实现实时显示摄像头视频。 首先,我们需要了解`SurfaceView`的...

    Android中SurfaceView截屏

    在Android开发中,`SurfaceView`是一个非常重要的视图组件,尤其在处理视频播放、游戏渲染等高性能图形操作时,它的优势在于拥有独立于主线程的渲染机制,能避免阻塞UI更新。然而,由于其特殊的性质,直接通过常规...

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

    在Android开发中,`SurfaceView`是一个非常重要的组件,它提供了与硬件图形渲染直接交互的能力。这个项目"android surfaceview自定义拍照 绘制头像轮廓"是基于网上现有的示例代码进行了修改,用于实现一个自定义的...

    Android SurfaceView添加组件view不被组件覆盖.zip

    例如,可以使用`android:layout_marginTop`属性来让其他View在SurfaceView之上,但注意这可能会部分遮挡SurfaceView的内容。 另一种解决方案是使用`OverlayLayer`。Android提供了一个叫做`TextureView`的类,它也...

    Android下使用SurfaceView播放视频文件

    本篇文章将深入探讨如何在Android应用中使用SurfaceView来播放视频文件。 首先,我们需要了解SurfaceView的核心组件: 1. **Surface**: 这是SurfaceView内部的一个特殊缓冲区,用于渲染图像。当视频播放器(如...

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

    1. **使用FrameLayout或RelativeLayout**:将SurfaceView和其他View放入同一个布局容器(如FrameLayout或RelativeLayout),然后通过设置布局参数(如`android:layout_above`或`android:layout_below`)来控制组件的...

    android SurfaceView游戏框架

    在Android平台上开发游戏时,SurfaceView是一个至关重要的组件,它为高效、低延迟的图形渲染提供了可能。SurfaceView是Android系统提供的一种特殊视图,它有自己的独立绘制表面,与主线程分离,使得游戏或者视频这类...

    android SurfaceView做二维码扫描源码

    总的来说,实现"android SurfaceView做二维码扫描源码"涉及到Android的SurfaceView使用、摄像头控制、图像处理以及第三方库的集成等多个技术点。理解并掌握这些知识点,才能开发出高效稳定的二维码扫描应用。

    Android SurfaceView 多线程 滑块

    因此,SurfaceView使用了多线程技术,将耗时的绘图任务移到后台线程,避免阻塞主线程,提高用户体验。 3. **滑块组件**:这个示例中的滑块可能是一个自定义控件,用户可以通过滑动来选择一组按钮。实现这种效果可能...

    android surfaceview示例源码下载

    android中的surfaceview示例源码下载,Android SurfaceView在游戏开发中使用想当广泛,SurfaceView对于画面的控制有着更大的自由度,它不像View那样要用handler来更新,但是网上关于 SurfaceView使用这方面的参考...

    android SurfaceView实现人物动画

    - **双缓冲技术**:使用SurfaceView的双缓冲特性,先在后台缓冲区绘制下一帧,再将缓冲区内容复制到前台,减少闪烁。 - **合理计算帧率**:根据设备性能和动画复杂度,确定合适的帧率,过高可能导致性能问题,过低...

    Android 通过SurfaceView 实现实时显示摄像头视频

    总之,通过SurfaceView实现实时显示摄像头视频是Android开发中的一个基础任务,涉及到对Android系统相机API的理解和使用,以及对SurfaceView生命周期的掌握。随着技术的发展,开发者可以选择更高级的API,如Camera2...

    Android圆形相机预览窗口,圆形SurfaceView

    这个场景就涉及到了Android的SurfaceView以及如何定制它的显示效果。本文将深入探讨如何实现一个圆形的相机预览窗口。 首先,让我们理解SurfaceView的基本概念。SurfaceView是Android系统提供的一种用于显示多媒体...

    Android SurfaceView实现动画效果

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者在单独的线程中进行高性能的图形绘制,常用于游戏或者视频播放等需要连续更新显示内容的场景。本篇文章将详细探讨如何利用SurfaceView实现动画效果,...

    android SurfaceView添加线程源码

    在Android开发中,`SurfaceView`是一个非常重要的视图组件,尤其在处理高性能图形和视频渲染时。`SurfaceView`提供了直接与硬件图形管道交互的能力,使得开发者可以在单独的线程中进行绘制,从而避免阻塞UI主线程,...

Global site tag (gtag.js) - Google Analytics