MyException - 我的异常网
当前位置:我的异常网» 图形/图像 » 玩转Android-2D图形及卡通-View类使用

玩转Android-2D图形及卡通-View类使用

www.MyException.Cn  网友分享于:2013-06-28  浏览:6次
玩转Android---2D图形及动画---View类使用

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

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

 

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

public class

View

extends Object
implements Drawable.Callback KeyEvent.Callback AccessibilityEventSource
java.lang.Object
   ↳ android.view.View
Known Direct Subclasses
Known Indirect Subclasses

上面的是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

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

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

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();
	}

	//内部类,需要实现一个Runnable接口
	class GameThread implements Runnable
	{

		@Override
		public void run() {
			//如果当前线程没有中断
			while(!Thread.currentThread().isInterrupted())
			{
				try
				{
					Thread.sleep(500);
				}catch(InterruptedException e)
				{
					Thread.currentThread().interrupt();
				}
				//使用postInvalidate()也可以直接在线程中更新界面,这样就不再需要HandlerMessage来接收消息了
				mv.postInvalidate();
			}
		}
		
	}
	
	//触笔事件
	public boolean onTouchEvent(MotionEvent event)
	{
		return true;
	}
	
	//按键按下事件
	public boolean onKeyDown(int keyCode, KeyEvent event)
	{
		
		return true;
	}
	//按键弹起事件
	public boolean onKeyUp(int keyCode, KeyEvent event)
	{
		return false;
	}
	
	public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event)
	{
		return true;
	}
}
 

 

 

运行结果如下:




 

 

 

文章评论

为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
我是如何打败拖延症的
我是如何打败拖延症的
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
那些争议最大的编程观点
那些争议最大的编程观点
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
我的丈夫是个程序员
我的丈夫是个程序员
编程语言是女人
编程语言是女人
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序员必看的十大电影
程序员必看的十大电影
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
漫画:程序员的工作
漫画:程序员的工作
程序员应该关注的一些事儿
程序员应该关注的一些事儿
程序员的鄙视链
程序员的鄙视链
鲜为人知的编程真相
鲜为人知的编程真相
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
代码女神横空出世
代码女神横空出世
10个调试和排错的小建议
10个调试和排错的小建议
每天工作4小时的程序员
每天工作4小时的程序员
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
总结2014中国互联网十大段子
总结2014中国互联网十大段子
Java程序员必看电影
Java程序员必看电影
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
为什么程序员都是夜猫子
为什么程序员都是夜猫子
 程序员的样子
程序员的样子
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
程序员都该阅读的书
程序员都该阅读的书
中美印日四国程序员比较
中美印日四国程序员比较
旅行,写作,编程
旅行,写作,编程
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
程序员和编码员之间的区别
程序员和编码员之间的区别
老程序员的下场
老程序员的下场
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
如何成为一名黑客
如何成为一名黑客
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有