`
quanminchaoren
  • 浏览: 932400 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android SurfaceHolder处理SurfaceView的画图

阅读更多

在用SurfaceView进行游戏开发过程中,用到SurfaceHolder来处理它的Canvas上画的效果和动画是必不可少的。用于控制表面,大小,像素等。
Abstract interface to someone holding a display surface. Allows you to control the surface size and format,
edit the pixels in the surface, and monitor changes to the surface. This interface is typically available
through the SurfaceView class.
其中特别要注意以下的几个函数:
abstract void addCallback(SurfaceHolder.Callback callback);
// 给SurfaceView当前的持有者一个回调对象。
abstract Canvas lockCanvas();
// 锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。
abstract Canvas lockCanvas(Rect dirty);
// 锁定画布的某个区域进行画图等..因为画完图后,会调用下面的unlockCanvasAndPost来改变显示内容。
// 相对部分内存要求比较高的游戏来说,可以不用重画dirty外的其它区域的像素,可以提高速度。
abstract void unlockCanvasAndPost(Canvas canvas);
// 结束锁定画图,并提交改变。

例子:

// 请参考上一篇文章:android中用SurfaceView做游戏开发


    class DrawThread extends Thread {
        private SurfaceHolder holder;
        private boolean running = true;
        protected DrawThread(SurfaceHolder holder) {this.holder = holder;}
        protected void doStop() { running = false; }
        public void run() {
            Canvas c = null;
            while( running ) {
                c = holder.lockCanvas(null);
                // 锁定整个画布,在内存要求比较高的情况下,建议参数不要为null
                try {
                    synchronized(holder) {
                        bGrid.drawGrid(c);//画游戏中的网格
                        BBoom.drawBooms(c, booms); //画游戏中
                        bFairy.drawFairy(c);//画游戏中的主角
                        // 画的内容是z轴的,后画的会覆盖前面画的。
                    }
                } catch(Exception ex) {}
                finally {
                    holder.unlockCanvasAndPost(c);
                    //更新屏幕显示内容
                }
    
            }
        }
    };

在android中开发游戏,一般来说,或想写一个复杂一点的游戏,是必须用到SurfaceView来开发的。
经过这一阵子对android的学习,我找到了自已在android中游戏开发的误区,不要老想着用Layout和view去实现,不要将某个游戏
中的对象做成一个组件来处理。应该尽量想着在Canvas(画布)中画出游戏戏中的背景、人物、动画等...
SurfaceView提供直接访问一个可画图的界面,可以控制在界面顶部的子视图层。SurfaceView是提供给需要直接画像素而不是使用
窗体部件的应用使用的。Android图形系统中一个重要的概念和线索是surface。View及其子类(如TextView, Button)
要画在surface上。每个surface创建一个Canvas对象(但属性时常改变),用来管理view在surface上的绘图操作,如画点画线。
还要注意的是,使用它的时候,一般都是出现在最顶层的:The view hierarchy will take care of correctly compositing 
with the Surface any siblings of the SurfaceView that would normally appear on top of it.

使用的SurfaceView的时候,一般情况下还要对其进行创建,销毁,改变时的情况进行监视,这就要用到SurfaceHolder.Callback.
class BBatt extends SurfaceView implements SurfaceHolder.Callback {
    public void surfaceChanged(SurfaceHolder holder,int format,int width,int height){}
//看其名知其义,在surface的大小发生改变时激发
    public void surfaceCreated(SurfaceHolder holder){}
//同上,在创建时激发,一般在这里调用画图的线程。
    public void surfaceDestroyed(SurfaceHolder holder) {}
//同上,销毁时激发,一般在这里将画图的线程停止、释放。
}

例子:
public class BBatt extends SurfaceView implements 
                 SurfaceHolder.Callback, OnKeyListener {
             private BFairy bFairy;
             private DrawThread drawThread;
             public BBatt(Context context) {
                 super(context);
                 this.setLayoutParams(
                     new ViewGroup.LayoutParams(
                         Global.battlefieldWidth, Global.battlefieldHeight));
                 this.getHolder().addCallback( this );
                 this.setFocusable( true );
                 this.setOnKeyListener( this );
                 bFairy = new BFairy(this.getContext());
             }
             public void surfaceChanged(SurfaceHolder holder,
                  int format,int width,int height) {
                  drawThread = new DrawThread(holder);
                  drawThread.start();
             }
             public void surfaceDestroyed(SurfaceHolder holder) {
                  if( drawThread != null ) {
                        drawThread.doStop();
                        while (true) try {
                             drawThread.join();
                             break ;
                        } catch(Exception ex) {}
                  }
             }
             public boolean onKey(View view, int keyCode, KeyEvent event) {}
}

 

分享到:
评论

相关推荐

    Android开发摄像头SurfaceView预览 背景画图(矩形和圆形) 实现(双surfaceview,顶层画矩形框,底层预览视频)

    Android开发摄像头SurfaceView预览 背景画图(矩形和圆形) 实现(双surfaceview,顶层画矩形框,底层预览视频); UI:三个按钮 预览 摄像 图片保存,预览界面 可以显示(矩形和圆形等图画)

    最简单的surfaceview画图和截图

    在“最简单的SurfaceView画图和截图”这个项目中,主要涉及以下知识点: 1. **SurfaceView的创建与使用**: - SurfaceView的创建通常是在布局文件中通过XML添加,或者在代码中通过`new SurfaceView(Context)`构造...

    SurfaceView画图

    SurfaceView在Android开发中是一种特殊的View,主要用于处理高性能、低延迟的图形绘制,例如游戏、视频播放或实时数据显示等场景。它的核心特点是拥有独立的渲染线程,可以在不阻塞UI线程的情况下进行复杂的图像处理...

    android自定义SurfaceView源代码

    在Android平台上进行游戏开发时,SurfaceView是一个至关重要的组件,它是专门为高性能的图形渲染设计的。这个源代码可能包含了一个自定义的SurfaceView类,用于实现更高效、更灵活的游戏界面。下面,我们将深入探讨...

    Android绘图机制与处理技巧(五)——View的孪生兄弟SurfaceView

    在Android系统中,UI更新是通过一个名为UI线程的主线程来处理的,而SurfaceView拥有自己的独立渲染线程,这使得它可以在不阻塞主线程的情况下进行高效率的图像绘制。这种设计特别适用于需要连续流畅动画或视频播放的...

    Android画图示例集合

    虽然Canvas本身不处理触摸事件,但可以通过SurfaceView监听触摸事件,根据事件调整绘图行为,实现交互式画图应用。 这个"Android画图示例集合"项目,通过实际代码示例,将帮助开发者熟悉以上知识点,并能熟练地在...

    3.在Android上显示摄像头,并在摄像头画面上画图

    总结来说,实现"在Android上显示摄像头并在摄像头画面上画图"的功能,需要结合使用Android的摄像头API和触摸事件处理机制。在实际开发中,还需要考虑性能优化、用户体验和各种设备的兼容性。通过上述技术的综合运用...

    Android简单画图应用开发

    在Android平台上,开发一款简单的画图应用涉及到许多关键知识点,主要集中在Android Studio的使用、UI设计、绘图机制以及交互处理。以下是对这些知识点的详细解释: 1. **Android Studio**: Android Studio是...

    Android源码——画图程序源码.zip

    `SurfaceView`有一个`SurfaceHolder`接口,可以通过其`setCallback`方法注册回调,当Surface准备就绪或改变时,可以调用`invalidate`刷新视图。 10. **手势识别**: 可以使用`GestureDetector`和`...

    Android 画图工具源码.zip源码资源下载

    在Android平台上,开发一款画图工具是一个常见的需求,这通常涉及到图形用户界面(GUI)的构建,以及对用户输入事件的处理。这个“Android 画图工具源码.zip”资源包含了一个实现此类功能的示例代码,对于学习和理解...

    Android程序源码--画图

    在Android平台上,开发一款能够画图的应用程序是一个常见的任务,涉及到许多核心的编程概念和技术。这个"Android程序源码--画图"项目很可能是提供了一个简单的Android应用示例,允许用户在屏幕上绘制图形。让我们...

    Android Surface画图游戏 示例代码

    "Android Surface画图游戏 示例代码"提供了一个完整的工程实例,可以帮助开发者深入理解如何利用SurfaceView及其相关组件来实现游戏的图形渲染。下面我们将详细探讨这个示例项目中的关键知识点。 1. **Android ...

    重力曲线画图(传感器和画图)

    总的来说,“重力曲线画图(传感器和画图)”是一个结合了硬件传感器、数据处理和图形显示的综合实例,对于学习Android开发、传感器应用和数据可视化的初学者来说,是一个非常有价值的实践项目。通过这样的练习,...

    Draw 画图

    5. **SurfaceView和SurfaceHolder**:对于高性能的图形绘制,SurfaceView是一个更好的选择,因为它提供了独立于主线程的绘图表面,避免阻塞UI更新。 6. **Bitmap和Drawable**:Bitmap是像素数据的表示,用于存储...

    android 手写、涂鸦demo

    4. **MotionEvent**:Android系统用于处理触摸事件的类。当用户在屏幕上触摸或移动手指时,会产生一系列MotionEvent。开发者可以通过监听这些事件,获取用户的触控轨迹,从而实现手写或涂鸦。 5. **SurfaceView**/*...

    android canvas 画图

    `SurfaceHolder`是Android系统提供用来控制SurfaceView的接口,`lockCanvas()`用于锁定Surface并返回Canvas对象,确保我们在绘制时不会与其他线程冲突。 2. **坐标系统**:Android Canvas的坐标系统原点位于屏幕...

    手动绘制图案-画板

    在Android系统中,`SurfaceView`是一个特殊的视图类,它提供了独立于主线程的绘图表面,允许开发者在后台线程中高效地进行连续的图像处理,如游戏画面或者视频播放。在画板应用中,`SurfaceView`是理想的组件,因为...

    android自定义画板

    在这个类中,我们将重写`SurfaceHolder.Callback`接口的方法,以便在`Surface`创建、改变或销毁时进行相应的处理。特别是`surfaceCreated()`方法,这里我们将初始化绘图环境,如设置画笔颜色、宽度等。 ```java ...

    Android,米老鼠时钟

    创建自定义`SurfaceView`的第一步是创建一个新的Java类,继承自`SurfaceView`并实现`SurfaceHolder.Callback`接口。这个接口提供了三个关键方法:`surfaceCreated()`, `surfaceChanged()`, 和 `surfaceDestroyed()`...

    android 资料

    class YourSurfaceView extends SurfaceView implements SurfaceHolder.Callback { // ... @Override protected void onDraw(Canvas canvas) { // 自定义绘图操作 } } ``` 同时,通过调用View的`invalidate()`...

Global site tag (gtag.js) - Google Analytics