`
263229365
  • 浏览: 465392 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android游戏开发使用View还是SurfaceView

阅读更多

文章转自东方尚智沈大海博客:

  在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) {}
}

实例2:用线程画一个蓝色的长方形。

package com.g3.test;
/*
* SurfaceView的示例程序
* 演示其流程
*/
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class Test extends Activity {
  public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(new MyView(this));
  }
    
  //内部类
  class MyView extends SurfaceView implements SurfaceHolder.Callback{

  SurfaceHolder holder;
public MyView(Context context) {
  super(context);
  holder = this.getHolder();//获取holder
  holder.addCallback(this);
  //setFocusable(true);
    
}

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

@Override
public void surfaceCreated(SurfaceHolder holder) {
  new Thread(new MyThread()).start();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    
}

//内部类的内部类
class MyThread implements Runnable{

  @Override
  public void run() {
  Canvas canvas = holder.lockCanvas(null);//获取画布
  Paint mPaint = new Paint();
  mPaint.setColor(Color.BLUE);
    
  canvas.drawRect(new RectF(40,60,80,80), mPaint);
  holder.unlockCanvasAndPost(canvas);//解锁画布,提交画好的图像
    
  }
    
}
    
  }
}

访问SurfaceView的底层图形是通过SurfaceHolder接口来实现的,通过getHolder()方法可以得到这个SurfaceHolder对象。你应该实现surfaceCreated(SurfaceHolder)和surfaceDestroyed(SurfaceHolder)方法来知道在这个Surface在窗口的显示和隐藏过程中是什么时候创建和销毁的。
SurfaceView可以在多线程中被访问。
注意:一个SurfaceView只在SurfaceHolder.Callback.surfaceCreated() 和 SurfaceHolder.Callback.surfaceDestroyed()调用之间是可用的,其他时间是得不到它的Canvas对象的(null)。

我的访问过程:
创建一个SurfaceView的子类,实现SurfaceHolder.Callback接口。
得到这个SurfaceView的SurfaceHolder对象holder。
holder.addCallback(callback),也就是实现SurfaceHolder.Callback接口的类对象。
在SurfaceHolder.Callback.surfaceCreated()调用过后holder.lockCanvas()对象就可以得到SurfaceView对象对应的Canvas对象canvas了。
用canvas对象画图。
画图结束后调用holder.unlockCanvasAndPost()就把图画在窗口中了。
SurfaceView可以多线程访问,在多线程中画图。


import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {


private Context mContext;
private SurfaceHolder mHolder;

public TouchScreenAdjusterSurfaceView(Context context,) {
super(context);

mContext = context;

mHolder = TouchScreenAdjusterSurfaceView.this.getHolder();
mHolder.addCallback(TouchScreenAdjusterSurfaceView.this);

this.setFocusableInTouchMode(true); // to make sure that we can get
// touch events and key events,and
// "setFocusable()" to make sure we
// can get key events
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// TODO Auto-generated method stub

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
//now you can get the Canvas and draw something here
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub

}


public void drawMyShape(PointPostion ps) {

mCanvas = mHolder.lockCanvas();

// draw anything you like

mHolder.unlockCanvasAndPost(mCanvas);
}

}

0
2
分享到:
评论

相关推荐

    Android游戏开发20回合

    Android游戏开发二 View和SurfaceView Android游戏开发三 View类详解 Android游戏开发四 Canvas和Paint实例 Android游戏开发五Path和Typeface Android游戏开发六 自定义View Android游戏开发七 自定义SurfaceView ...

    Android游戏开发之旅

    2.Android游戏开发之旅二 View和SurfaceView 3.Android游戏开发之旅三 View类详解 4.Android游戏开发之旅四 Canvas和Paint实例 5.Android游戏开发之旅五 Path和Typeface 6.Android游戏开发之旅六 自定义View 7....

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

    Android开发中,如何实现SurfaceView添加组件view不被组件覆盖。  

    android surfaceview示例源码下载

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

    Android 自定义SurfaceView详解

    在Android游戏开发教程之二:View类与SurfaceView类中我们已经谈到,SurfaceView类是有很多优势的,所以在Android游戏开发中还是选择SurfaceView。  这里我们直接继承SurfaceView,实现SurfaceHolder.Callback接口...

    Android中TextureView与SurfaceView用法区别总结

    SurfaceView和TextureView均继承于android.view.View 与其它View不同的是,两者都能在独立的线程中绘制和渲染,在专用的GPU线程中大大提高渲染的性能。 一、SurfaceView专门提供了嵌入视图层级的绘制界面,开发者...

    android游戏开发实例

    android游戏开发常用类View、surfaceView、graphics、Canvas、shader及字符串、图像的绘制,图像旋转缩放,动画播放与制作等

    android开发揭秘PDF

    第1章 Android开发简介 1.1 Android基本概念 1.1.1 Android简介 1.1.2 Android的系统构架 1.1.3 Android应用程序框架 1.2 OMS介绍 1.2.1 OPhone介绍 1.2.2 Widget介绍 1.3 小结 第2章 Android开发环境搭建 2.1 ...

    《Android应用开发揭秘》附带光盘代码.

     第1章 Android开发简介  1.1 Android基本概念  1.1.1 Android简介  1.1.2 Android的系统构架  1.1.3 Android应用程序框架  1.2 OMS介绍  1.2.1 OPhone介绍  1.2.2 Widget介绍  1.3 小结  第2章 Android...

    《Android应用开发揭秘》源码

     第1章 Android开发简介  1.1 Android基本概念  1.1.1 Android简介  1.1.2 Android的系统构架  1.1.3 Android应用程序框架  1.2 OMS介绍  1.2.1 OPhone介绍  1.2.2 Widget介绍  1.3 小结  第2章 Android...

    Android应用开发揭秘pdf高清版

    第1章 Android开发简介 1.1 Android基本概念 1.1.1 Android简介 1.1.2 Android的系统构架 1.1.3 Android应用程序框架 1.2 OMS介绍 1.2.1 OPhone介绍 1.2.2 Widget介绍 1.3 小结 第2章 Android开发环境搭建 2.1 ...

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

    Android 开发应用源码 参考学习使用

    android游戏开发从入门到应用实例

    4-4(SurfaceView游戏框架) 4-7-1(贝塞尔曲线) 4-7-2(Canvas画布) 4-8(Paint画笔) 4-9(Bitmap位图渲染与操作) 5-1(飞行射击游戏实战) 6-1(360°平滑游戏摇杆) 6-10-1(Socket协议) 6-10-2(Http协议) 6-11(本地化与国际...

    Android应用源码之VIEW双缓冲与SurfaceView比较.zip项目安卓应用源码下载

    Android应用源码之VIEW双缓冲与SurfaceView比较.zip项目安卓应用源码下载Android应用源码之VIEW双缓冲与SurfaceView比较.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司...

    Android SurfaceView添加组件view不被组件覆盖.zip项目安卓应用源码下载

    Android SurfaceView添加组件view不被组件覆盖.zip项目安卓应用源码下载Android SurfaceView添加组件view不被组件覆盖.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发...

    Android应用源码之VIEW双缓冲与SurfaceView比较-IT计算机-毕业设计.zip

    Android应用源码开发Demo,主要用于毕业设计学习。

Global site tag (gtag.js) - Google Analytics