Android 游戏开发值 2 View

 

 

     首先声明,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线程里面。

 

 

 

你可能感兴趣的:(Android 游戏开发值 2 View)