Android 游戏开发笔记一、入门之SurfaceView的使用

来源:互联网 发布:元数据定义都用大写吗 编辑:程序博客网 时间:2024/06/06 03:25

入门笔记之SurfaceView 使用

一、首先介绍几个类

1、SurfaceHolder
这里用到了一个类SurfaceHolder,可以把它当成surface的控制器,用来操纵surface。处理Canvas上的效果和动画,控制表面,大小。
2、SurfaceHolder.Callback
实现surfaceView的回调函数,三个函数看名字也知道是什么意思。
3、Canvas
理解为画布,就是你要使用canvas 把你想表现的东西画出来。

二、代码逻辑过程


-->继承SurfaceView并实现SurfaceHolder.Callback 接口 


--> SurfaceView.getHolder()获得SurfaceHolder 对象 


-->SurfaceHolder.addCallback(callback)  添加回调函数


-->SurfaceHolder.lockCanvas()获得Canvas 对象并锁定画布


--> Canvas 绘画 


-->SurfaceHolder.unlockCanvasAndPost(Canvas canvas) 结束锁定,并提交改变,将图形显示。


需要说明一点的是,SurfaceHolder.lockCanvas()  /SurfaceHolder.lockCanvas(Rect dirty),支持区域重画,也就是说你可以之修改画面的一部分。(ok,其实L没有亲自尝试具体效果)


三、具体代码示例

package com.game;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.view.SurfaceHolder;import android.view.MotionEvent;import android.view.SurfaceHolder.Callback;import android.view.SurfaceView;import android.view.View;public class GameView extends SurfaceView implements Callback {SurfaceHolder mHolder;Ball mBall;private GameThread mThread ;public GameView(Context context) {super(context);mHolder = getHolder();mThread = new GameThread(mHolder);mHolder.addCallback(this);setFocusable(true);mBall = new Ball(context);}@Overrideprotected void onDraw(Canvas canvas) {}@Overridepublic boolean onTouchEvent(MotionEvent event) {switch(event.getAction()){case MotionEvent.ACTION_DOWN:break;case MotionEvent.ACTION_MOVE:break;case MotionEvent.ACTION_UP:break;}mBall.getUp();return super.onTouchEvent(event);}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}@Overridepublic void surfaceCreated(SurfaceHolder holder) {mThread.start();}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {mThread.runable = false;}class GameThread extends Thread{public boolean  runable = true ;private SurfaceHolder holder;public GameThread(SurfaceHolder holder){this.holder = holder;}@Overridepublic void run() {super.run();while(runable){synchronized (holder){System.out.println("ondrawing ");Canvas cv = holder.lockCanvas();cv.drawColor(Color.BLACK);mBall.ondraw(cv);holder.unlockCanvasAndPost(cv);}try{Thread.sleep(100);}catch(Exception e){e.printStackTrace();}finally{}}}@Overridepublic synchronized void start() {super.start();}}}

就是通过一个线程去不断地修改图片的位置,在surfacecreated里面 start()!

完整例子随后会给出地址!

0 0
原创粉丝点击