关闭

Android View学习示例

5575人阅读 评论(0) 收藏 举报

View,是Android的一个超类,这个类几乎包含了所有的屏幕类型。每一个View都有一个用于绘图的画布,这个画布可以进行任意扩展。

在游戏开发中叶可以自定义视图(View),这个画布的功能更能满足我们在游戏开发中的需要。在Android中,任何一个View类都只需重写onDraw 方法来实现界面显示,自定义的视图可以是复杂的3D实现,也可以是非常简单的文本形式等。 

游戏的核心是不断地绘图和刷新界面,Android中提供了 invalidate 方法来实现界面刷新。注意,invalidate 不能直接在线程中调用, 就是不可以在子线程中调用,因此它违背了 Android的单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI 线程中执行,因此Android中最常用的方法就是利用Handler来实现UI线程的更新。 其实用 AsyncTask 也可以。


具体示例:

Activity:

public class Activity01 extends Activity {
	
	private static final String TAG = "mThread";
	private static final int REFRESH = 0x000001;
	private GameView mGameView = null;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		this.mGameView = new GameView(this);
		mGameView.x = 320.0f;
		mGameView.y = 120.0f;
		setContentView(mGameView);
		
		new Thread(new GameThread()).start();
	}

	Handler myHandler = new Handler() {
		
		@Override
		public void handleMessage(Message msg) {

			switch (msg.what) {
			case Activity01.REFRESH:
				mGameView.invalidate();		// repaint View
				break;
			}
			super.handleMessage(msg);
		}
	};
	
	class GameThread implements Runnable {
		
		@Override
		public void run() {
			while (!Thread.currentThread().isInterrupted()) {
				Message message = new Message();
				message.what = Activity01.REFRESH;
				
				Activity01.this.myHandler.sendMessage(message);
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					Thread.currentThread().interrupt();
				}
			}
		}
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		if(event.getAction() == MotionEvent.ACTION_DOWN){
			mGameView.x = event.getX();
			mGameView.y = event.getY();
		}
		
		return true;
	}
	
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if(keyCode == KeyEvent.KEYCODE_BACK){
			this.finish();
		}
		
		return true;
	}
}

gameview

public class GameView extends View {
	int count = 0;
	float x = 0, y = 0;

	public GameView(Context context) {
		super(context);
	}

	public void onDraw(Canvas canvas) {
		if (count < 100) {
			count++;
		} else {
			count = 0;
		}

		Paint mPaint = new Paint();
		switch (count % 4) {
		case 0:
			mPaint.setColor(Color.BLUE);
			break;
		case 1:
			mPaint.setColor(Color.GREEN);
			break;
		case 2:
			mPaint.setColor(Color.RED);
			break;
		case 3:
			mPaint.setColor(Color.YELLOW);
			break;
		default:
			mPaint.setColor(Color.WHITE);
			break;
		}

		canvas.drawRect(x - 40, y - 20, x + 40, y + 20, mPaint);
	}
}

运行效果:



源码下载 




0
0
查看评论

简单说说Android自定义view学习推荐的方式

这几天比较受关注,挺开心的,嘿嘿。 这里给大家总结一下学习自定义view的一些技巧。 1.首先 去看看鸿洋神的博客 Android 自定义view(1). 鸿洋神的入门教程讲的很详细。再次膜拜。 然后我这里对上面博客补充一些内容,那就是MeasureSpec相关的一些东西,这些东西...
  • wingichoy
  • wingichoy
  • 2016-01-08 15:24
  • 8173

Android从零开始:我的自定义view学习过程

做android也有一段时间了,虽然基本都是在自学,不过自我感觉还是良好。。。 然而仅仅是“自我感觉”而已。前段时间发现自己对自定义view真是一窍不通啊! 以前基本都是用系统控件、开源控件什么的,从没有自定义过控件,虽然平时用自定义view的场合可能也不多, 但是通过学习自定义view可以帮助...
  • zhaozhu365
  • zhaozhu365
  • 2016-09-19 23:42
  • 1605

Android View学习示例

View,是Android的一个超类,这个类几乎包含了所有的屏幕类型。每一个View都有一个用于绘图的画布,这个画布可以进行任意扩展。 在游戏开发中叶可以自定义视图(View),这个画布的功能更能满足我们在游戏开发中的需要。在Android中,任何一个View类都只需重写onDraw 方法来实现界...
  • xh16319
  • xh16319
  • 2013-10-20 00:18
  • 461

(转)Android View学习示例

View,是Android的一个超类,这个类几乎包含了所有的屏幕类型。每一个View都有一个用于绘图的画布,这个画布可以进行任意扩展。 在游戏开发中叶可以自定义视图(View),这个画布的功能更能满足我们在游戏开发中的需要。在Android中,任何一个View类都只需重写onDraw 方法来实...
  • gxj1680
  • gxj1680
  • 2013-03-05 15:44
  • 525

多示例学习

http://wenku.baidu.com/view/a66fab43f12d2af90242e6da.html周志华
  • xiaoju1029
  • xiaoju1029
  • 2016-07-07 18:54
  • 317

多示例学习(Multiple Instance Learning)

多示例学习(Multiple Instance Learning)今天一直在准备组会seminar,是导师点名要我做的报告,一篇有关weakly supervised的论文《Weakly supervised discriminative location and classification: a...
  • totodum
  • totodum
  • 2016-06-07 17:23
  • 3164

安卓自定义View教程目录

这是一个从零起步,从入门到懵逼的自定义View教程。本教程从最基础的内容讲解,并且深入到了相关的各个细节,不论你是刚入门的菜鸟,还是有一定经验的工程师相信本系列文章都会对你有所帮助。 你既可以将本教程当作学习资料来学习自定义View相关的各种知识,也可以作为工具来使用,在需要的时候查询相关的知识细...
  • osle123
  • osle123
  • 2016-10-08 14:49
  • 1439

多示例学习 multiple instance learning (MIL)

最近看了几篇关于多示例学习的文章,虽然都是医学方面的,但是还是对我很有启发。另外,多示例学习近几年已经逐渐被用于基于机器学习框架的组织病理学图像癌症检测等方面,是计算机辅助诊断这一学科中一种新崛起的方法,下面就按照我在论文和网上学到的知识对多示例学习进行一下简单的介绍。    ...
  • qrlhl
  • qrlhl
  • 2016-03-05 18:34
  • 5097

多示例学习(Multi Instance Learning)的概念

多示例学习(Multi Instance Learning)
  • roypi
  • roypi
  • 2014-10-10 14:51
  • 7845

View实例化流程(高级)

View实例化流程(高级) 小智 原理:View通过LayoutInflater实现加载 我们一般讲的先把View实例化成对象通过3种方式去实现: 1.LayoutInflater layoutInflater=(LayoutInflater) context.getSystemSe...
  • Fynner
  • Fynner
  • 2016-11-17 20:24
  • 920
    个人资料
    • 访问:12254449次
    • 积分:90809
    • 等级:
    • 排名:第16名
    • 原创:719篇
    • 转载:169篇
    • 译文:16篇
    • 评论:3070条
    学习经历
    中科院、百度、创新工场、小米、阿里巴巴、米扑科技

    期货从业资格证(2017.03)
    基金从业资格证(2016.11)
    证券投资顾问证(2016.9)
    证券从业资格证(2016.6)
    系统架构设计师(2013)
    软件设计师(2008)
    CSDN创业专访

    程序员创业邦
    QQ群: 239292073
    青春,每一个有梦想的人

    资深产品经理人
    QQ群: 338142405
    思与行,人人都是产品经理

    爱脚本,爱技术
    QQ群: 320296250
    (已满)
    python、ruby、php、go、shell

    程序人生的平凡生活
    QQ群: 282297696
    (已满)
    汇聚百度、小米、微软、腾讯、
    创新工场、阿里巴巴、日本雅虎
    个人博客
    博客专栏
    博客公告
    本博客内容,由米扑博客精心整理
    欢迎交流,欢迎转载,大家转载注明出处,禁止用于商业目的。

    文章分类
    文章存档