玩转Android---2D图形及动画---View类使用

原址:http://hualang.iteye.com/category/143855

由于游戏界面是由大量美工资源图片构成的,所以,在设计游戏界面的时候,千万不能用Layout来布局,因为这样的话,会将游戏界面中的对象当成一个组件来处理,开发过程中就会出现各种各样的问题。

其实,游戏就是通过状态机让Canvas不断的在View上画你想要的东西,这个状态机不仅包括游戏的内部执行,还包括外部的输入。

 

View类是Android的一个超类,这个类几乎包含了所有的屏幕类型。

public class

View

extends  Object
implements  Drawable.Callback  KeyEvent.Callback  AccessibilityEventSource

上面的是SDK中对View类的一个定义,可以看到,有很多类是它的直接子类或者间接子类。

每个View类都有个可以进行绘画的画布,这个画布可以进行任一扩展。在游戏当中,可以自定义视图(View),使得这个画布的功能更能满足我们在游戏中的需要。

 

在Android中,任何一个View类都要重写onDraw()方法来实现画面显示,自定义的视图或者3D实现。

 

游戏中经常会使用触屏、键盘等事件,在View中同样也要实现它们来满足相应的功能。

onKeyUp,onKeyDown,onKeyMultiple,onKeyPreIme,onTouchEvent,onTrackballEvent等方法,在继承View的时候需要重载这些方法。

 

其实,游戏的核心就是不断的刷新界面和绘图,绘图可以在onDraw()方法中实现,那么刷新界面呢?Android中提供了

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

 

下面是个例子:

ViewDemo.java

Java代码   收藏代码
  1. package com.loulijun.viewdemo;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Color;  
  6. import android.graphics.Paint;  
  7. import android.os.Bundle;  
  8. import android.view.View;  
  9.   
  10. public class ViewDemo extends View {  
  11.     //用于后面生成不同颜色而定义的变量  
  12.     int count = 0;  
  13.     //重写ViewDemo的构造方法  
  14.     public ViewDemo(Context context)  
  15.     {  
  16.         super(context);  
  17.     }  
  18.     //画图方法  
  19.     public void onDraw(Canvas canvas)  
  20.     {  
  21.         if(count < 100)  
  22.         {  
  23.             count++;  
  24.         }  
  25.         else  
  26.         {  
  27.             count = 0;  
  28.         }  
  29.         Paint paint = new Paint();  
  30.         switch(count%4)  
  31.         {  
  32.         case 0:paint.setColor(Color.BLUE);break;  
  33.         case 1:paint.setColor(Color.GREEN);break;  
  34.         case 2:paint.setColor(Color.RED);break;  
  35.         case 3:paint.setColor(Color.YELLOW);break;   
  36.         default:paint.setColor(Color.WHITE);break;  
  37.         }  
  38.         //画一个坐标在(100,100),半径为60的圆  
  39.         canvas.drawCircle(100,100,60,paint);  
  40.     }  
  41.      
  42. }  

 

MainActivity.java

Java代码   收藏代码
  1. package com.loulijun.viewdemo;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.os.Handler;  
  6. import android.os.Message;  
  7. import android.view.KeyEvent;  
  8. import android.view.MotionEvent;  
  9.   
  10. public class MainActivity extends Activity {  
  11.     //设置一个id  
  12.     public static final int REFRESH = 0X000001;  
  13.     //声明ViewDemo  
  14.     private ViewDemo mv = null;  
  15.     public void onCreate(Bundle savedInstanceState)  
  16.     {  
  17.         super.onCreate(savedInstanceState);  
  18.         //实例化ViewDemo对象  
  19.         mv =  new ViewDemo(this);  
  20.         //设置显示为我们自定义的View  
  21.         setContentView(mv);  
  22.         //开启线程  
  23.         new Thread(new GameThread()).start();  
  24.     }  
  25.     Handler handler = new Handler()  
  26.     {  
  27.         //接收消息后处理  
  28.         public void handleMessage(Message msg)  
  29.         {  
  30.             switch(msg.what)  
  31.             {  
  32.             case MainActivity.REFRESH:mv.invalidate();break;  
  33.             }  
  34.             super.handleMessage(msg);  
  35.         }  
  36.     };  
  37.     //内部类,需要实现一个Runnable接口  
  38.     class GameThread implements Runnable  
  39.     {  
  40.   
  41.         @Override  
  42.         public void run() {  
  43.             //如果当前线程没有中断  
  44.             while(!Thread.currentThread().isInterrupted())  
  45.             {  
  46.                 Message message = new Message();  
  47.                 message.what = MainActivity.REFRESH;  
  48.                 //发送消息  
  49.                 handler.sendMessage(message);  
  50.                 try  
  51.                 {  
  52.                     Thread.sleep(500);  
  53.                 }catch(InterruptedException e)  
  54.                 {  
  55.                     Thread.currentThread().interrupt();  
  56.                 }  
  57.             }  
  58.         }  
  59.           
  60.     }  

 

分析:

这里,通过实例化一个Handler对象并重写handleMessage方法来实现一个消息接收器,然后再线程中通过sendMessage()方法发送更新界面的消息,当接收器收到更新界面的时候,便开始执行invalidate()方法更新屏幕信息。

 

当然,还可以直接在线程中使用postInvalidate()方法在线程中更新界面,而不用再使用Handler来接收消息了

MainActivity.java

Java代码   收藏代码
  1. package com.loulijun.viewdemo;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.os.Handler;  
  6. import android.os.Message;  
  7. import android.view.KeyEvent;  
  8. import android.view.MotionEvent;  
  9.   
  10. public class MainActivity extends Activity {  
  11.     //设置一个id  
  12.     public static final int REFRESH = 0X000001;  
  13.     //声明ViewDemo  
  14.     private ViewDemo mv = null;  
  15.     public void onCreate(Bundle savedInstanceState)  
  16.     {  
  17.         super.onCreate(savedInstanceState);  
  18.         //实例化ViewDemo对象  
  19.         mv =  new ViewDemo(this);  
  20.         //设置显示为我们自定义的View  
  21.         setContentView(mv);  
  22.         //开启线程  
  23.         new Thread(new GameThread()).start();  
  24.     }  
  25.   
  26.     //内部类,需要实现一个Runnable接口  
  27.     class GameThread implements Runnable  
  28.     {  
  29.   
  30.         @Override  
  31.         public void run() {  
  32.             //如果当前线程没有中断  
  33.             while(!Thread.currentThread().isInterrupted())  
  34.             {  
  35.                 try  
  36.                 {  
  37.                     Thread.sleep(500);  
  38.                 }catch(InterruptedException e)  
  39.                 {  
  40.                     Thread.currentThread().interrupt();  
  41.                 }  
  42.                 //使用postInvalidate()也可以直接在线程中更新界面,这样就不再需要HandlerMessage来接收消息了  
  43.                 mv.postInvalidate();  
  44.             }  
  45.         }  
  46.           
  47.     }  
  48.       
  49.     //触笔事件  
  50.     public boolean onTouchEvent(MotionEvent event)  
  51.     {  
  52.         return true;  
  53.     }  
  54.       
  55.     //按键按下事件  
  56.     public boolean onKeyDown(int keyCode, KeyEvent event)  
  57.     {  
  58.           
  59.         return true;  
  60.     }  
  61.     //按键弹起事件  
  62.     public boolean onKeyUp(int keyCode, KeyEvent event)  
  63.     {  
  64.         return false;  
  65.     }  
  66.       
  67.     public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event)  
  68.     {  
  69.         return true;  
  70.     }  
  71. }  

 

 

 

运行结果如下:




 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值