首先声明,View类是Android的一个超类,这个类几乎包含了所有的屏幕类型。每一个View都有一个用于绘图的画布,这个画布可以进行任意的扩展。在Android中任何一个View类都只有重写OnDraw方法来实现界面显示。

游戏(或者普通的APP)最重要的是和用户交互,例如键盘,触摸笔,我们需要来处理这些事件。Android中提供了onKeyUP,OnKeyDown,OnKeyMultiple,OnKeyPreIme,OnTouchEvent、OnTrackballEvent等方法。可以轻松的处理游戏的事件消息。所以我们在继承View类的时候,需要重载这几个方法。当在此控件有焦点的时候,有事件发生,会自动调用这些方法。

游戏的过程是不断的绘图和刷新界面。我们这里来看下如何刷新。

Android提供了Invalidate方法来实现界面刷新,注意,invalidate方法并不能直接在线程中调用,因为它违背了单线程模型:Android UI线程操作是不安全的,并且这些操作必须在UI线程中执行。因此Android中最常见的是利用Hander来实现UI线程的更新。

首先我们要重写这个View来,来写一个GameView.

package com.rocky; 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); // TODO Auto-generated constructor stub } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub //super.onDraw(canvas); if(miCount<100) { miCount++; } else { miCount=0; } Paint mPaint=new Paint(); switch(miCount%4) { case 0: mPaint.setColor(Color.RED); case 1: mPaint.setColor(Color.BLUE); case 2: mPaint.setColor(Color.YELLOW); case 3: mPaint.setColor(Color.WHITE); case 4: default: mPaint.setColor(Color.GREEN); } canvas.drawRect((320-80)/2,y,(320-80)/2+80,y+40, mPaint); } }

package com.rocky; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.KeyEvent; public class GameDemo1Activity extends Activity { private GameView mGameView; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.main); this.mGameView=new GameView(this); this.setContentView(mGameView); } Handler myHander= new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub //super.handleMessage(msg); switch(msg.what) { case 1: { mGameView.invalidate(); } default: { super.handleMessage(msg); } } } }; @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub switch(keyCode) { case KeyEvent.KEYCODE_DPAD_UP: { break; } case KeyEvent.KEYCODE_DPAD_DOWN: { break; } } return false; //return super.onKeyDown(keyCode, event); } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { // TODO Auto-generated method stub return super.onKeyUp(keyCode, event); } class GameThread implements Runnable { @Override public void run() { // TODO Auto-generated method stub while(!Thread.currentThread().isInterrupted()) { Message message =new Message(); message.what=1; GameDemo1Activity.this.myHander.sendMessage(message); try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); Thread.currentThread().interrupt(); } } } } }

或者简单的一句话说,屏幕更新的动作不能发生在UI线程里面。

更多相关文章

  1. android菜单详解二:选项菜单
  2. Android智能指针SP WP使用方法介绍
  3. android - 为响应度而设计 - 开发文档翻译
  4. Android高手进阶教程(十一)之----Android(安卓)通用获取Ip的方法
  5. Android面试系列文章2018之Android部分HandlerThread机制篇
  6. Android基本功:Handler消息传送机制
  7. Android(安卓)dex分包
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. 移动应用测试框架—Calabash Android(安
  2. 点击事件必须点两次才能生效的原因
  3. android 识别图片上的二维码
  4. SD卡读写文件 代码学习
  5. Android实现自动点击 - 无障碍服务
  6. android源代码下载——android环境配置
  7. 【Android】_SmsReceicer_短信监听
  8. 渐变色与圆角显示(填充,描边)
  9. Android入门之SeekBar
  10. Android(安卓)——Window类