第一步:创建好surfaceView模版
第二步:在网上载取了一个小鸟的图片,大小为60*38
第三步:点击屏幕,控制小鸟向上飞,然后自动下落,按差屏幕不放手时,小鸟旋停不动
gameView代码:
//自定义的mySurfaceView类,继承sufaceView实现surfaceHolder.clllback和线程Runnable
public class MyGameView extends SurfaceView implements SurfaceHolder.Callback,Runnable{
<span style="white-space:pre"> </span>private SurfaceHolder sh;//SurfaceView控制器
<span style="white-space:pre"> </span>private Canvas iCanvas;//画布
<span style="white-space:pre"> </span>private Paint ipaint;//画笔
<span style="white-space:pre"> </span>private Path ipath;//路径
<span style="white-space:pre"> </span>private boolean isRunning=true;//布尔参数,死循环提交绘图方法,直到退出false
<span style="white-space:pre"> </span>private float screenWidth, screenHeight;// 屏幕宽/高
<span style="white-space:pre"> </span>float x,y;//小鸟出现时的x,y坐标
<span style="white-space:pre"> </span>Bitmap bitmap_Bird;
<span style="white-space:pre"> </span>BirdManager birdManager;
<span style="white-space:pre"> </span>Context mContext;
<span style="white-space:pre"> </span>//带上下文参的构造方法,在里面实例化组件
<span style="white-space:pre"> </span>public MyGameView(Context context) {
<span style="white-space:pre"> </span>super(context);
<span style="white-space:pre"> </span>mContext = context;
<span style="white-space:pre"> </span>sh=this.getHolder();//获到surfaceHolder控制器<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>ipaint=new Paint();//获取画笔
<span style="white-space:pre"> </span>ipath=new Path();//获到路径
<span style="white-space:pre"> </span>ipaint.setColor(Color.RED);//设置画笔颜色
<span style="white-space:pre"> </span>ipaint.setStyle(Style.STROKE);//设置画笔样式()
<span style="white-space:pre"> </span>ipaint.setStrokeWidth(5);//设置画笔的宽度<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>sh.addCallback(this);//监听控制器(添加回调函数)
<span style="white-space:pre"> </span>this.setFocusable(true);//设置当前焦点
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>bitmap_Bird = BitmapFactory.decodeResource(context.getResources(), R.drawable.bird60);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>//死循环每隔100毫秒调用自定义具体画的方法,直到退出设为false
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public void run() {
<span style="white-space:pre"> </span>while(isRunning){
<span style="white-space:pre"> </span>drawView();//调用自定义具体画的方法
<span style="white-space:pre"> </span>try {
<span style="white-space:pre"> </span>Thread.sleep(100);<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>} catch (InterruptedException e) {
<span style="white-space:pre"> </span>e.printStackTrace();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>//自定义画法
<span style="white-space:pre"> </span>private void drawView() {
<span style="white-space:pre"> </span>try {
<span style="white-space:pre"> </span>if(sh!=null){
<span style="white-space:pre"> </span>iCanvas=sh.lockCanvas();//获取画布
<span style="white-space:pre"> </span>//设置画笔和位图没有锯齿
<span style="white-space:pre"> </span>iCanvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG));
<span style="white-space:pre"> </span>iCanvas.drawColor(Color.WHITE);
<span style="white-space:pre"> </span>birdManager.drawBird(iCanvas);
<span style="white-space:pre"> </span>//iCanvas.drawBitmap(bitmap_Bird, x, y, null);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>} catch (Exception e) {
<span style="white-space:pre"> </span>}finally{
<span style="white-space:pre"> </span>if(iCanvas!=null){
<span style="white-space:pre"> </span>sh.unlockCanvasAndPost(iCanvas);//解锁画布并提交
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>//触屏事件
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public boolean onTouchEvent(MotionEvent event) {<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>switch (event.getAction()) {
<span style="white-space:pre"> </span>case MotionEvent.ACTION_DOWN://按下去
<span style="white-space:pre"> </span>System.out.println("down");
<span style="white-space:pre"> </span>//birdManager.moveUp();
<span style="white-space:pre"> </span>//如果在这加setIsMove(false),当按着屏幕不放手时,小鸟玄停不动
<span style="white-space:pre"> </span>birdManager.setIsMove(false);
<span style="white-space:pre"> </span>break;
<span style="white-space:pre"> </span>case MotionEvent.ACTION_UP://放开
<span style="white-space:pre"> </span>System.out.println("up");
<span style="white-space:pre"> </span>//如果加下面注释掉的代码,小鸟会不停的向下掉
//<span style="white-space:pre"> </span>birdManager.setIsMove(false);
//<span style="white-space:pre"> </span>try {
//<span style="white-space:pre"> </span>Thread.sleep(50);
//<span style="white-space:pre"> </span>} catch (InterruptedException e) {
//<span style="white-space:pre"> </span>// TODO 自动生成的 catch 块
//<span style="white-space:pre"> </span>e.printStackTrace();
//<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>birdManager.setIsMove(true);
<span style="white-space:pre"> </span>new Thread(){
<span style="white-space:pre"> </span>public void run() {<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>birdManager.moveUp();
<span style="white-space:pre"> </span>};
<span style="white-space:pre"> </span>}.start();
<span style="white-space:pre"> </span>break;
<span style="white-space:pre"> </span>case MotionEvent.ACTION_MOVE://移动
<span style="white-space:pre"> </span>break;
<span style="white-space:pre"> </span>default:
<span style="white-space:pre"> </span>break;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>//invalidate();//立刻重绘
<span style="white-space:pre"> </span>return true;//返回true,提交给当前视图
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public void surfaceCreated(SurfaceHolder holder) {
<span style="white-space:pre"> </span>new Thread(this).start();//启动线程
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public void surfaceChanged(SurfaceHolder holder, int format, int width,
<span style="white-space:pre"> </span>int height) {
<span style="white-space:pre"> </span>screenWidth = (float) getWidth();
<span style="white-space:pre"> </span>screenHeight = (float) getHeight();
<span style="white-space:pre"> </span>System.out.println("screenWidth="+screenWidth);
<span style="white-space:pre"> </span>System.out.println("screenHeight="+screenHeight);
<span style="white-space:pre"> </span>x = screenWidth/8;
<span style="white-space:pre"> </span>y = screenHeight*3/4;
<span style="white-space:pre"> </span>birdManager = new BirdManager(mContext,x,y,screenHeight);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public void surfaceDestroyed(SurfaceHolder holder) {
<span style="white-space:pre"> </span>//退出界面,先设循环参数为false,等线程停了,再睡个300毫秒,再真正退出
<span style="white-space:pre"> </span>isRunning=false;
<span style="white-space:pre"> </span>try {
<span style="white-space:pre"> </span>Thread.sleep(300);<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>} catch (InterruptedException e) {
<span style="white-space:pre"> </span>e.printStackTrace();
<span style="white-space:pre"> </span>}<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>}
}
小鸟控制类BirdManager
public class BirdManager {
<span style="white-space:pre"> </span>Context mContext;
<span style="white-space:pre"> </span>Bitmap bitmap_Bird;
<span style="white-space:pre"> </span>float temp, left, top,mScreenHeight;
<span style="white-space:pre"> </span>int bitmap_Bird_Width,bitmap_Bird_Height;
<span style="white-space:pre"> </span>public BirdManager(Context context, float x, float y,float screenHeight) {
<span style="white-space:pre"> </span>mContext = context;
<span style="white-space:pre"> </span>mScreenHeight = screenHeight;
<span style="white-space:pre"> </span>left = x;
<span style="white-space:pre"> </span>top = y;
<span style="white-space:pre"> </span>temp = y;
<span style="white-space:pre"> </span>bitmap_Bird = BitmapFactory.decodeResource(context.getResources(),
<span style="white-space:pre"> </span>R.drawable.bird60);
<span style="white-space:pre"> </span>bitmap_Bird_Width = bitmap_Bird.getWidth();
<span style="white-space:pre"> </span>bitmap_Bird_Height = bitmap_Bird.getHeight();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public void drawBird(Canvas canvas) {
<span style="white-space:pre"> </span>canvas.drawBitmap(bitmap_Bird, left, top, null);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>boolean isMove;
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>public void setIsMove(boolean b){
<span style="white-space:pre"> </span>isMove = b;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public boolean getIsMove(){
<span style="white-space:pre"> </span>return isMove;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public void moveUp() {<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>temp = top;
<span style="white-space:pre"> </span>while (temp - 10 <= top && getIsMove()) {
<span style="white-space:pre"> </span>try {
<span style="white-space:pre"> </span>Thread.sleep(50);
<span style="white-space:pre"> </span>} catch (InterruptedException e) {
<span style="white-space:pre"> </span>e.printStackTrace();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>top = top - 10;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>// 到达当前顶部,然后上落
<span style="white-space:pre"> </span>while (top < mScreenHeight-bitmap_Bird_Height && getIsMove()) {
<span style="white-space:pre"> </span>try {
<span style="white-space:pre"> </span>Thread.sleep(50);
<span style="white-space:pre"> </span>} catch (InterruptedException e) {
<span style="white-space:pre"> </span>e.printStackTrace();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>top = top + 5;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>if (top == mScreenHeight-bitmap_Bird_Height) {
<span style="white-space:pre"> </span>return;// 嫁出最外围循环,当小鸟掉到最底部时
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
}