android中view组件使用详解
2011-09-30 00:46
721 查看
public class
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代码
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代码
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代码
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;
}
}
View
extends Objectimplements Drawable.Callback KeyEvent.Callback AccessibilityEventSource
java.lang.Object | |
↳ | android.view.View |
Known Direct Subclasses AnalogClock, ImageView, KeyboardView, ProgressBar, SurfaceView, TextView, ViewGroup, ViewStub |
Known Indirect Subclasses AbsListView, AbsSeekBar, AbsSpinner, AbsoluteLayout, AdapterView<T extends Adapter>, AdapterViewAnimator, AdapterViewFlipper, AppWidgetHostView,AutoCompleteTextView, Button, CalendarView, CheckBox, CheckedTextView, Chronometer, CompoundButton, and 47 others. |
每个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代码
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);
}
}
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代码
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();
}
}
}
}
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代码
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列表组件ListView使用详解之ViewHolder提高效率
- Android——WebView组件的使用详解
- Android——WebView组件的使用详解
- Android——WebView组件的使用详解
- Android开发之WebView组件的使用详解
- Android开发_WebView组件使用详解_LoadUrl直接显示网页内容
- Android开发_WebView组件使用详解_LoadUrl直接显示网页内容
- Android ViewPager 组件使用详解
- Android客户端开发即WebView组件的使用详解
- Android高级组件AutoCompleteTextView自动完成文本框使用详解
- Android组件ViewStub基本使用方法详解
- Android开发之WebView组件的使用详解
- Android学习 - WebView组件的使用详解
- Android——WebView组件的使用详解
- Android ViewPager 组件使用详解
- Android ViewPager 组件使用详解
- Android--ViewPager 组件使用详解
- Android WebView使用详解包括js互调
- (二十八) Android中ViewStub组件使用(转载自:http://blog.csdn.net/mayingcai1987/article/details/6238609)
- Android ViewDragHelper 使用详解