android 之 View
在进行游戏开发时,需要自定义各种控件和界面。
自定义View的使用:
- 绘制屏幕
- 刷新屏幕:后台数据发生了变化,需要开发人员自己刷新屏幕以显示最新数据
例子:
MyView开发,绘制界面View内容:
package com.sunny;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.view.View;public class MyView extends View {
static final int ANGLE_MAX = 50;
static final int SPEED = 4;
static final int SCREEN_WIDTH = 480;
static final int SCREEN_HEIGHT = 320;static final int LEFT = 2;
static final int RIGHT = 0;
static final int UP = 3;
static final int DOWN = 1;int angle = 30;
int angleChange = 3;
int radius = 16;
int centerX = radius;
int centerY = radius;
long timeStamp = System.currentTimeMillis();int currPhoto=0;
int direction = RIGHT;
Bitmap bmpMan;
Bitmap[] bmpPhotos;
int[] imgIds = { R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d };public MyView(Context context) {
super(context);
// TODO Auto-generated constructor stub
bmpMan = BitmapFactory.decodeResource(getResources(), R.drawable.man);
//System.out.println(bmpMan.getWidth());
bmpPhotos = new Bitmap[imgIds.length];
for (int i = 0; i < bmpPhotos.length; i++) {
bmpPhotos[i] = BitmapFactory.decodeResource(getResources(),
imgIds[i]);
}
}@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stubPaint paint = new Paint();
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(bmpMan, centerX - radius, centerY - radius, null);
paint.setColor(Color.BLACK);
paint.setAntiAlias(true);
RectF oval = new RectF(centerX - radius - 1, centerY - radius - 2,
centerX - radius - 1 + 2 * radius + 2, centerY - radius - 2 + 2
* radius + 4);
canvas.drawArc(oval, 360-angle+90*direction, 2*angle, true, paint);
if (System.currentTimeMillis() - timeStamp > 5000) {
timeStamp = System.currentTimeMillis();
currPhoto = (currPhoto + 1) % bmpPhotos.length;
}
canvas.drawBitmap(bmpPhotos[currPhoto], 80, 40, null);
super.onDraw(canvas);
}}
MyThread线程主要控制View中元素的变化,及时刷新View信息:
package com.sunny;
public class MyThread extends Thread {
int sleepSpan = 30;
MyView myView;public MyThread(MyView myView) {
super();
this.myView = myView;
}public void run() {
while (true) {
myView.angle += myView.angleChange;
if (myView.angle > MyView.ANGLE_MAX) {
myView.angleChange = -3;
} else if (myView.angle < 0) {
myView.angleChange = 3;
}
switch (myView.direction) {
case MyView.RIGHT:
myView.centerX = myView.centerX + myView.SPEED;
break;
case MyView.UP:
myView.centerY = myView.centerY - myView.SPEED;
break;
case MyView.LEFT:
myView.centerX = myView.centerX - myView.SPEED;
break;
case MyView.DOWN:
myView.centerY = myView.centerY + myView.SPEED;
break;
}
if (myView.centerY + myView.radius > MyView.SCREEN_HEIGHT) {
myView.centerY = myView.centerY - MyView.SPEED;
myView.direction = MyView.LEFT;
}
if (myView.centerY - myView.radius < 0) {
myView.centerY = myView.centerY + MyView.SPEED;
myView.direction = MyView.RIGHT;
}
if (myView.centerX + myView.radius > MyView.SCREEN_WIDTH) {
myView.centerX = myView.centerX - MyView.SPEED;
myView.direction = MyView.DOWN;
}
if (myView.centerX - myView.radius < 0) {
myView.centerX = myView.radius;
myView.direction = MyView.UP;
}
myView.postInvalidate();
try {
Thread.sleep(sleepSpan);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
在Activity中,创建View和后台线程:
public class mainActivity extends Activity {
/** Called when the activity is first created. */
MyView myView;
MyThread mt;@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
myView = new MyView(this);
setContentView(myView);
mt = new MyThread(myView);
mt.start();
}
}


android 之 View的更多相关文章
- 深入理解 Android 之 View 的绘制流程
概述 本篇文章会从源码(基于Android 6.0)角度分析Android中View的绘制流程,侧重于对整体流程的分析,对一些难以理解的点加以重点阐述,目的是把View绘制的整个流程把握好,而对于特定 ...
- Android自定义View 画弧形,文字,并增加动画效果
一个简单的Android自定义View的demo,画弧形,文字,开启一个多线程更新ui界面,在子线程更新ui是不允许的,但是View提供了方法,让我们来了解下吧. 1.封装一个抽象的View类 B ...
- (转)[原] Android 自定义View 密码框 例子
遵从准则 暴露您view中所有影响可见外观的属性或者行为. 通过XML添加和设置样式 通过元素的属性来控制其外观和行为,支持和重要事件交流的事件监听器 详细步骤见:Android 自定义View步骤 ...
- Android 自定义View合集
自定义控件学习 https://github.com/GcsSloop/AndroidNote/tree/master/CustomView 小良自定义控件合集 https://github.com/ ...
- Android 自定义View (五)——实践
前言: 前面已经介绍了<Android 自定义 view(四)-- onMeasure 方法理解>,那么这次我们就来小实践下吧 任务: 公司现有两个任务需要我完成 (1)监测液化天然气液压 ...
- Android 自定义 view(四)—— onMeasure 方法理解
前言: 前面我们已经学过<Android 自定义 view(三)-- onDraw 方法理解>,那么接下我们还需要继续去理解自定义view里面的onMeasure 方法 推荐文章: htt ...
- Android 自定义 view(三)—— onDraw 方法理解
前言: 上一篇已经介绍了用自己定义的属性怎么简单定义一个view<Android 自定义view(二) -- attr 使用>,那么接下来我们继续深究自定义view,下一步将要去简单理解自 ...
- Android 自定义view(二) —— attr 使用
前言: attr 在前一篇文章<Android 自定义view -- attr理解>已经简单的进行了介绍和创建,那么这篇文章就来一步步说说attr的简单使用吧 自定义view简单实现步骤 ...
- Android 自定义View
Android 自定义View流程中的几个方法解析: onFinishInflate():从布局文件.xml加载完组件后回调 onMeasure() :调用该方法负责测量组件大小 onSizeChan ...
- Android中View类OnClickListener和DialogInterface类OnClickListener冲突解决办法
Android中View类OnClickListener和DialogInterface类OnClickListener冲突解决办法 如下面所示,同时导入这两个,会提示其中一个与另一个产生冲突. 1i ...
随机推荐
- 排序算法(C语言+Python版)宝宝再也不怕面试官写排序算法了
直接插入排序 过程: 1. 数据可分看成两个部分,前面的数据是有序的 2. 从后面的数据取出一个元素,插到前面有序数据的合适位置 从右端开始查找,到找到比此元素大的时候,则此元素向后移动,以空出多余的 ...
- 表单辅助函数-form_open()
使用from_open()之前需要装载本辅助函数: $this->load->helper('form'); php===> echo form_open('email/send') ...
- “chm 已取消到该网页的导航”解决方案
1. 右键单击该 CHM 文件,然后单击“属性”. 2. 单击“取消阻止”或者“解除锁定”. 3. 双击此 .chm 文件以打开此文件.
- SPM-软件项目管理之感想
这学期开始选择选修课的时候是需要把每节课都过一遍的.当我上完SPM那节课的时候,我就已经决定要选这门课了,尽管还有其他的课我都还没上过.由于这节课是双语教学-中文老师兼外籍老师,这样的方式感觉很新颖, ...
- Android学习总结(十四) ———— ListView Item多布局的实现
一.基本概念 实现一个Item的多布局.像我们经常在用的各种即时通讯工具,QQ.微信等,假设他们的会话界面是ListView实现的,那么ListView就有多种Item布局,要实现ListView里面 ...
- VS 2013如何编译ASM文件
1. 左键点击解决方案下面的工程 2. 点击上面菜单中的项目,此时有个生成自定义属性 3. 勾选上masm,此时就有Microsoft Macro Assembler了 https://stac ...
- 0x00000124蓝屏问题解决方法
windows7-32位系统: 0x00000124蓝屏是系统问题,win7才有的, xp系统没有 . 解决办法:下载win7蓝屏补丁包解压安装就ok了. 说明:win7蓝屏补丁KB(25286140 ...
- 遍历PspCidTable枚举进程
//测试环境:win7 32位 1 // DriverEntry.cpp #include "ntddk.h" #include <ntddvol.h> #includ ...
- 关于父类中的this指针的问题
在处理一个消息推送的问题的时候遇到个小问题,比如A是B的子类,当A生成实例时,会执行父类的构造函数,那么在父类中,this会是什么类型呢? 于是做了个小测试 子类ChildClass: public ...
- [Q&A]VS 2012 MVC4专案与网站的差异?「ASP.NET组态」的Login账号出现在「新旧两组」会员数据库里面?
原文出處 http://www.dotblogs.com.tw/mis2000lab/archive/2013/08/30/mvc4_vs2012_login_member_db.aspx [Q&a ...