public class

View

extends Object
implements 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<Textends Adapter>, AdapterViewAnimator, AdapterViewFlipper, AppWidgetHostView, AutoCompleteTextView, Button, CalendarView, CheckBox, CheckedTextView, Chronometer, CompoundButton, and 47 others.

上面的是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. packagecom.loulijun.viewdemo;
  2. importandroid.content.Context;
  3. importandroid.graphics.Canvas;
  4. importandroid.graphics.Color;
  5. importandroid.graphics.Paint;
  6. importandroid.os.Bundle;
  7. importandroid.view.View;
  8. publicclassViewDemoextendsView{
  9. //用于后面生成不同颜色而定义的变量
  10. intcount=0;
  11. //重写ViewDemo的构造方法
  12. publicViewDemo(Contextcontext)
  13. {
  14. super(context);
  15. }
  16. //画图方法
  17. publicvoidonDraw(Canvascanvas)
  18. {
  19. if(count<100)
  20. {
  21. count++;
  22. }
  23. else
  24. {
  25. count=0;
  26. }
  27. Paintpaint=newPaint();
  28. switch(count%4)
  29. {
  30. case0:paint.setColor(Color.BLUE);break;
  31. case1:paint.setColor(Color.GREEN);break;
  32. case2:paint.setColor(Color.RED);break;
  33. case3:paint.setColor(Color.YELLOW);break;
  34. default:paint.setColor(Color.WHITE);break;
  35. }
  36. //画一个坐标在(100,100),半径为60的圆
  37. canvas.drawCircle(100,100,60,paint);
  38. }
  39. }

MainActivity.java

Java代码 复制代码 收藏代码
  1. packagecom.loulijun.viewdemo;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importandroid.os.Handler;
  5. importandroid.os.Message;
  6. importandroid.view.KeyEvent;
  7. importandroid.view.MotionEvent;
  8. publicclassMainActivityextendsActivity{
  9. //设置一个id
  10. publicstaticfinalintREFRESH=0X000001;
  11. //声明ViewDemo
  12. privateViewDemomv=null;
  13. publicvoidonCreate(BundlesavedInstanceState)
  14. {
  15. super.onCreate(savedInstanceState);
  16. //实例化ViewDemo对象
  17. mv=newViewDemo(this);
  18. //设置显示为我们自定义的View
  19. setContentView(mv);
  20. //开启线程
  21. newThread(newGameThread()).start();
  22. }
  23. Handlerhandler=newHandler()
  24. {
  25. //接收消息后处理
  26. publicvoidhandleMessage(Messagemsg)
  27. {
  28. switch(msg.what)
  29. {
  30. caseMainActivity.REFRESH:mv.invalidate();break;
  31. }
  32. super.handleMessage(msg);
  33. }
  34. };
  35. //内部类,需要实现一个Runnable接口
  36. classGameThreadimplementsRunnable
  37. {
  38. @Override
  39. publicvoidrun(){
  40. //如果当前线程没有中断
  41. while(!Thread.currentThread().isInterrupted())
  42. {
  43. Messagemessage=newMessage();
  44. message.what=MainActivity.REFRESH;
  45. //发送消息
  46. handler.sendMessage(message);
  47. try
  48. {
  49. Thread.sleep(500);
  50. }catch(InterruptedExceptione)
  51. {
  52. Thread.currentThread().interrupt();
  53. }
  54. }
  55. }
  56. }

分析:

这里,通过实例化一个Handler对象并重写handleMessage方法来实现一个消息接收器,然后再线程中通过sendMessage()方法发送更新界面的消息,当接收器收到更新界面的时候,便开始执行invalidate()方法更新屏幕信息。

当然,还可以直接在线程中使用postInvalidate()方法在线程中更新界面,而不用再使用Handler来接收消息了

MainActivity.java

Java代码 复制代码 收藏代码
  1. packagecom.loulijun.viewdemo;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importandroid.os.Handler;
  5. importandroid.os.Message;
  6. importandroid.view.KeyEvent;
  7. importandroid.view.MotionEvent;
  8. publicclassMainActivityextendsActivity{
  9. //设置一个id
  10. publicstaticfinalintREFRESH=0X000001;
  11. //声明ViewDemo
  12. privateViewDemomv=null;
  13. publicvoidonCreate(BundlesavedInstanceState)
  14. {
  15. super.onCreate(savedInstanceState);
  16. //实例化ViewDemo对象
  17. mv=newViewDemo(this);
  18. //设置显示为我们自定义的View
  19. setContentView(mv);
  20. //开启线程
  21. newThread(newGameThread()).start();
  22. }
  23. //内部类,需要实现一个Runnable接口
  24. classGameThreadimplementsRunnable
  25. {
  26. @Override
  27. publicvoidrun(){
  28. //如果当前线程没有中断
  29. while(!Thread.currentThread().isInterrupted())
  30. {
  31. try
  32. {
  33. Thread.sleep(500);
  34. }catch(InterruptedExceptione)
  35. {
  36. Thread.currentThread().interrupt();
  37. }
  38. //使用postInvalidate()也可以直接在线程中更新界面,这样就不再需要HandlerMessage来接收消息了
  39. mv.postInvalidate();
  40. }
  41. }
  42. }
  43. //触笔事件
  44. publicbooleanonTouchEvent(MotionEventevent)
  45. {
  46. returntrue;
  47. }
  48. //按键按下事件
  49. publicbooleanonKeyDown(intkeyCode,KeyEventevent)
  50. {
  51. returntrue;
  52. }
  53. //按键弹起事件
  54. publicbooleanonKeyUp(intkeyCode,KeyEventevent)
  55. {
  56. returnfalse;
  57. }
  58. publicbooleanonKeyMultiple(intkeyCode,intrepeatCount,KeyEventevent)
  59. {
  60. returntrue;
  61. }
  62. }

更多相关文章

  1. Android 获取手机屏幕大小两种方法
  2. android代码实现按钮自旋转
  3. android中如何利用线程循环打印
  4. Android中MAC地址获取代码
  5. Android Timer 实现方法
  6. Android 显示/隐藏 软键盘 方法
  7. Android中的一些方法-----生生不息

随机推荐

  1. (转)clipRect 介绍
  2. android 机器人
  3. Android系列教程之六:TextView小组件的使
  4. 《深入浅出Android多媒体编程》即将出版,
  5. Android技术架构演进与未来
  6. android Uri详解
  7. android 兼容各个版本 读取通讯录
  8. Android(安卓)AIDL实例
  9. Android学习06-----布局管理器
  10. Android开发之旅: Intents和Intent Filte