android中view组件使用详解

 
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. }  
package com.loulijun.viewdemo;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.View;

public class ViewDemo extends View {
	//用于后面生成不同颜色而定义的变量
    int count = 0;
    //重写ViewDemo的构造方法
    public ViewDemo(Context context)
    {
    	super(context);
    }
    //画图方法
    public void onDraw(Canvas canvas)
    {
    	if(count < 100)
    	{
    		count++;
    	}
    	else
    	{
    		count = 0;
    	}
    	Paint paint = new Paint();
    	switch(count%4)
    	{
    	case 0:paint.setColor(Color.BLUE);break;
    	case 1:paint.setColor(Color.GREEN);break;
    	case 2:paint.setColor(Color.RED);break;
    	case 3:paint.setColor(Color.YELLOW);break; 
    	default:paint.setColor(Color.WHITE);break;
    	}
    	//画一个坐标在(100,100),半径为60的圆
    	canvas.drawCircle(100,100,60,paint);
    }
   
}
 

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.     }  
package com.loulijun.viewdemo;

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 MainActivity extends Activity {
	//设置一个id
	public static final int REFRESH = 0X000001;
	//声明ViewDemo
	private ViewDemo mv = null;
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		//实例化ViewDemo对象
		mv =  new ViewDemo(this);
		//设置显示为我们自定义的View
		setContentView(mv);
		//开启线程
		new Thread(new GameThread()).start();
	}
	Handler handler = new Handler()
	{
		//接收消息后处理
		public void handleMessage(Message msg)
		{
			switch(msg.what)
			{
			case MainActivity.REFRESH:mv.invalidate();break;
			}
			super.handleMessage(msg);
		}
	};
	//内部类,需要实现一个Runnable接口
	class GameThread implements Runnable
	{

		@Override
		public void run() {
			//如果当前线程没有中断
			while(!Thread.currentThread().isInterrupted())
			{
				Message message = new Message();
				message.what = MainActivity.REFRESH;
				//发送消息
				handler.sendMessage(message);
				try
				{
					Thread.sleep(500);
				}catch(InterruptedException e)
				{
					Thread.currentThread().interrupt();
				}
			}
		}
		
	}

 

分析:

这里,通过实例化一个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. }  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值