展会信息港展会大全

Android之SurfaceView游戏开发示例
来源:互联网   发布日期:2015-10-03 15:13:51   浏览:2857次  

导读:,而且对程序的执行效率要求很高时,View类就不能满足需求了,这时必须用SurfaceView类进行开发。例 如,对速度要求很高的游戏时,View类就不能满足需求了,这时必须使用SurfaceView类进行开发。例如,对速度要......

,而且对程序的执行效率要求很高时,View类就不能满足需求了,这时必须用SurfaceView类进行开发。

例 如,对速度要求很高的游戏时,View类就不能满足需求了,这时必须使用SurfaceView类进行开发。例如,对速度要求很高的游戏,可以使用双缓冲 来显示。游戏中的背景、人物、动画等都需要绘制在一个画布(Canvas)上,而SurfaceView可以直接访问一个画布,SurfaceView 是提供给需要直接画像素而不是使用窗体部件的应用使用的。 每个Surface创建一个Canvas对象(但属性时常改变),用来管理View和Surface上的绘图操作。

具体示例:

Activity

public class Activity01 extends Activity {

GameSurfaceView gameView = null;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

gameView = new GameSurfaceView(this);

setContentView(gameView);

}

}

GameSurfaceView

public class GameSurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable{

private Activity01 mActivity = null;

private SurfaceHolder mHolder = null;

private Thread mThread = null;;

private boolean mLoop = false;

private Canvas mCanvas = null;

private Paint mPaint = null;

private long drawStartTime = 0, drawCostTime = 0, drawTotalTime = 30;

private float x, y;

private int screenWidth = 480, screenHeight = 800;

public GameSurfaceView(Context context) {

super(context);

mActivity = (Activity01)context;

mHolder = this.getHolder();

mHolder.addCallback(this);

setFocusable(true);

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

mPaint = new Paint();

mPaint.setColor(Color.CYAN);

mLoop = true;

new Thread(this).start();

}

@Override

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

screenWidth = width;

screenHeight = height;

x = screenWidth / 2;

y = screenHeight / 2;

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

mLoop = false;

}

@Override

public void run() {

while(mLoop){

drawStartTime = SystemClock.uptimeMillis();

synchronized (mHolder) {

try {

mCanvas = mHolder.lockCanvas();

onDraw();// repaint

} catch (Exception e) {

e.printStackTrace();

} finally {

if(mCanvas != null){

mHolder.unlockCanvasAndPost(mCanvas);

}

}

}

drawCostTime = SystemClock.uptimeMillis() - drawStartTime;

Log.i("drawCostTime", "drawCostTime = " + drawCostTime);

try {

if(drawCostTime < drawTotalTime){

Thread.sleep(drawTotalTime - drawCostTime);// sleep elapse time

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

private void onDraw(){

if(mHolder == null && mPaint == null){

return;

}

mPaint.setAntiAlias(true);

mPaint.setAlpha(100);

mPaint.setColor(Color.CYAN); // paint background color

mCanvas.drawRect(0, 0, screenWidth, screenHeight, mPaint);

mPaint.setColor(Color.BLUE); // paint foreground color

mCanvas.drawCircle(x, y, 50, mPaint);

}

@Override

public boolean onTouchEvent(MotionEvent event) {

super.onTouchEvent(event);

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

this.x = event.getX();

this.y = event.getY();

break;

case MotionEvent.ACTION_MOVE:

this.x = event.getX();

this.y = event.getY();

break;

case MotionEvent.ACTION_UP:

this.x = event.getX();

this.y = event.getY();

break;

default:

this.x = event.getX();

this.y = event.getY();

break;

}

return true; // true then event can be implemented again

}

@Override

public boolean onKeyDown(int keyCode, KeyEvent event){

super.onKeyDown(keyCode, event);

if(keyCode == KeyEvent.ACTION_DOWN){

this.mActivity.finish();

}

return true;

}

}

运行效果:

赞助本站

人工智能实验室

相关热词: SurfaceView 游戏开发

相关内容
AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港