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

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

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

具体示例:

Activity:

[java] view plain copy print ?
  1. publicclassActivity01extendsActivity{
  2. privatestaticfinalStringTAG="mThread";
  3. privatestaticfinalintREFRESH=0x000001;
  4. privateGameViewmGameView=null;
  5. @Override
  6. publicvoidonCreate(BundlesavedInstanceState){
  7. super.onCreate(savedInstanceState);
  8. this.mGameView=newGameView(this);
  9. mGameView.x=320.0f;
  10. mGameView.y=120.0f;
  11. setContentView(mGameView);
  12. newThread(newGameThread()).start();
  13. }
  14. HandlermyHandler=newHandler(){
  15. @Override
  16. publicvoidhandleMessage(Messagemsg){
  17. switch(msg.what){
  18. caseActivity01.REFRESH:
  19. mGameView.invalidate();//repaintView
  20. break;
  21. }
  22. super.handleMessage(msg);
  23. }
  24. };
  25. classGameThreadimplementsRunnable{
  26. @Override
  27. publicvoidrun(){
  28. while(!Thread.currentThread().isInterrupted()){
  29. Messagemessage=newMessage();
  30. message.what=Activity01.REFRESH;
  31. Activity01.this.myHandler.sendMessage(message);
  32. try{
  33. Thread.sleep(1000);
  34. }catch(InterruptedExceptione){
  35. Thread.currentThread().interrupt();
  36. }
  37. }
  38. }
  39. }
  40. @Override
  41. publicbooleanonTouchEvent(MotionEventevent){
  42. if(event.getAction()==MotionEvent.ACTION_DOWN){
  43. mGameView.x=event.getX();
  44. mGameView.y=event.getY();
  45. }
  46. returntrue;
  47. }
  48. @Override
  49. publicbooleanonKeyDown(intkeyCode,KeyEventevent){
  50. if(keyCode==KeyEvent.KEYCODE_BACK){
  51. this.finish();
  52. }
  53. returntrue;
  54. }
  55. }


gameview

[java] view plain copy print ?
  1. publicclassGameViewextendsView{
  2. intcount=0;
  3. floatx=0,y=0;
  4. publicGameView(Contextcontext){
  5. super(context);
  6. }
  7. publicvoidonDraw(Canvascanvas){
  8. if(count<100){
  9. count++;
  10. }else{
  11. count=0;
  12. }
  13. PaintmPaint=newPaint();
  14. switch(count%4){
  15. case0:
  16. mPaint.setColor(Color.BLUE);
  17. break;
  18. case1:
  19. mPaint.setColor(Color.GREEN);
  20. break;
  21. case2:
  22. mPaint.setColor(Color.RED);
  23. break;
  24. case3:
  25. mPaint.setColor(Color.YELLOW);
  26. break;
  27. default:
  28. mPaint.setColor(Color.WHITE);
  29. break;
  30. }
  31. canvas.drawRect(x-40,y-20,x+40,y+20,mPaint);
  32. }
  33. }


运行效果:

Android SurfaceView学习示例_第1张图片

更多信息请查看java进阶网http://www.javady.com

更多相关文章

  1. android系统中的多线程(一): 关于在android中启动线程以及线程间
  2. Android开发实践:基于命令模式的异步任务线程
  3. 学习Android线程模型解析(包括UI的更新)
  4. 让我们一起来做最漂亮的Android界面
  5. Android Studio——为什么说android UI操作不是线程安全的
  6. Android中Handler的使用方法——在子线程中更新界面
  7. android 使用asynctask结合fragment更新UI(另附线程池管理示例)

随机推荐

  1. 【android】仿照长按home键 恢复后台运行
  2. Android(安卓)资源文件中@、@android:typ
  3. android中系统自带主题集锦
  4. Android字母索引、Android通讯录索引、An
  5. Android(安卓)保活
  6. Android乱码
  7. Android(安卓)开发实践(一)开始你的 Hello
  8. Android常用布局
  9. Android中的android:layout_width和andro
  10. Android(安卓)SDK 下载地址