View类是Android的一个超类,这个类几乎包含了所有的屏幕类型。每一个View都有一个用于绘图的画布,这个画布可以进行任意扩展。在游戏开发中叶可以自定义视图(View),这个画布的功能更能满足我们在游戏开发中的需要。在Android中,任何一个View类都只需重写onDraw 方法来实现界面显示,自定义的视图可以是复杂的3D实现,也可以是非常简单的文本形式等。

游戏中最重要的就是需要与玩家交互,比如键盘输入、触笔点击事件,我们如何来处理这些事件呢?Android中提供了 onKeyUp、onKeyDown、onKeyMultiple、onKeyPreIme、onTouchEvent、onTrackballEvent等方法,可以轻松地处理游戏中的事件信息。所以,在继承View时,需要重载这几个方法,当有按键按下或弹起等事件时,按键代码自动会传输给这些相应的方法来处理。

游戏的核心是不断地绘图和刷新界面,图我们已经通过onDraw 方法绘制了,下面来分析如何刷新界面。Android中提供了 invalidate 方法来实现界面刷新,注意,invalidate 不能直接在线程中调用, 就是不可以在子线程中调用明白乎?因为它违背了 Android的单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI 线程中执行,因此Android中最常用的方法就是利用Handler来实现UI线程的更新。 其实用 AsyncTask 也可以。

下面是这样一个例子 我 画了一个在屏幕上不停变换颜色的矩形 我们定义一些 事件 可以通过 模拟器的 上下键 调节矩形的位置,比如把这个矩形向上移动或者把这个矩形向下移动。下边们看一下运行效果。

我们一共有2个类一个继承了View用来画图 另外Activity类用来刷新我们的视图 这2类分别是 Activity01和 GameView。

GameView类

package com.yarin.android.Examples_05_01;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.view.View;public class GameView extends View{int  miCount = 0;int  y = 0;public GameView(Context context){super(context);}////具体绘图内容我们紧接着就会讲public void onDraw(Canvas canvas){if (miCount < 100){miCount++;}else {miCount = 0;}//绘图Paint mPaint = new Paint();           switch (miCount%4){case 0:mPaint.setColor(Color.BLUE);  break;case 1:mPaint.setColor(Color.GREEN);  break;case 2:mPaint.setColor(Color.RED);  break;case 3:mPaint.setColor(Color.YELLOW);  break;default:mPaint.setColor(Color.WHITE);  break;}         //绘制矩形--后面我们将详细讲解        canvas.drawRect((320-80)/2, y, (320-80)/2+80, y+40, mPaint); }}

2:Activity01

package com.yarin.android.Examples_05_01;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.KeyEvent;import android.view.MotionEvent;public class Activity01 extends Activity{private static final intREFRESH= 0x000001;/* 声明GameView类对象 */private GameViewmGameView= null;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);/* 实例化GameView对象 */this.mGameView = new GameView(this);// 设置显示为我们自定义的View(GameView)setContentView(mGameView);// 开启线程new Thread(new GameThread()).start();}HandlermyHandler= new Handler() {//接收到消息后处理public void handleMessage(Message msg){switch (msg.what){case Activity01.REFRESH:mGameView.invalidate();break;}super.handleMessage(msg);}};class GameThread implements Runnable{public void run(){while (!Thread.currentThread().isInterrupted()){Message message = new Message();message.what = Activity01.REFRESH;//发送消息Activity01.this.myHandler.sendMessage(message);try{Thread.sleep(100);}catch (InterruptedException e){Thread.currentThread().interrupt();}}}}/** * 当然可以将GameThread类这样写 * 同样可以更新界面,并且不在需要 * Handler在接受消息class GameThread implements Runnable{public void run(){while (!Thread.currentThread().isInterrupted()){try{Thread.sleep(100);}catch (InterruptedException e){Thread.currentThread().interrupt();}//使用postInvalidate可以直接在线程中更新界面mGameView.postInvalidate();}}}*///详细事件处理见第三章//当然这些事件也可以写在GameView中//触笔事件public boolean onTouchEvent(MotionEvent event){return true;}//按键按下事件    public boolean onKeyDown(int keyCode, KeyEvent event)    {    return true;    }    //按键弹起事件public boolean onKeyUp(int keyCode, KeyEvent event){switch (keyCode){//上方向键case KeyEvent.KEYCODE_DPAD_UP:mGameView.y-=3;break;//下方向键case KeyEvent.KEYCODE_DPAD_DOWN:mGameView.y+=3;break;}return false;}public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event){return true;}}

注:可参考《应用开发揭秘》P111

更多相关文章

  1. Android线程间通信机制
  2. android的touch事件详解
  3. 你真的理解android事件分发机制了吗
  4. android(基于回调)的事件处理

随机推荐

  1. android里的线程和进程
  2. Android进阶知识树——Android(安卓)多进
  3. Android(安卓)各大手机品牌手机跳转到权
  4. Android开发——利用Cursor+CursorAdapte
  5. 一个不想当作家的程序员不是好爸爸(3)
  6. Android(安卓)网络请求,应用的下载与安装
  7. android之自定义控件篇
  8. 在android中如何显示维语
  9. Android调用天气接口(和风天气)
  10. Android新建项目与简易Button事件