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

入门笔记之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);
	}


	@Override
	protected void onDraw(Canvas canvas) {
		
	}
	
	@Override
	public 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);
	}


	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {
		
	}
	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		mThread.start();
	}
	@Override
	public 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;
		}
		
		@Override
		public 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{
				}
			}
		}
		
		@Override
		public synchronized void start() {
			super.start();
		}
	}
}

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值