歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android中SurfaceView學習

Android中SurfaceView學習

日期:2017/3/1 10:08:55   编辑:Linux編程

SurfaceView和View的明顯不同在於Surface不需要通過線程來更新視圖,但在繪制之前必須使用lockCanvas方法鎖定畫布,並得 到畫布,然後繪制,完成後用unlockCanvasAndPost方法解鎖畫布。SurfaceView類的事件處理和View一樣。

首先來看一個簡單的框架。

繪制界面類:

  1. package com.example.bonusball;
  2. import Android.content.Context;
  3. import android.graphics.Canvas;
  4. import android.graphics.Color;
  5. import android.graphics.Paint;
  6. import android.graphics.RectF;
  7. import android.util.AttributeSet;
  8. import android.view.SurfaceHolder;
  9. import android.view.SurfaceView;
  10. public class CanvasView extends SurfaceView implements SurfaceHolder.Callback
  11. {
  12. private SurfaceHolder myHolder;
  13. private Paint ballPaint; // Paint used to draw the cannonball
  14. private int screenWidth; // width of the screen
  15. private int screenHeight; // height of the screen
  16. private int ballRadius;
  17. private CanvasThread myThread;
  18. //控制循環
  19. private boolean isLoop;
  20. public CanvasView(Context context) {
  21. super(context);
  22. // TODO Auto-generated constructor stub
  23. myHolder=this.getHolder();
  24. myHolder.addCallback(this);
  25. ballPaint=new Paint();
  26. ballPaint.setColor(Color.BLUE);
  27. isLoop = true;
  28. }
  29. public void fireBall(float startX,float startY)
  30. {
  31. System.out.println("Fire");
  32. }
  33. @Override
  34. public void surfaceChanged(SurfaceHolder holder, int format, int width,
  35. int height) {
  36. // TODO Auto-generated method stub
  37. }
  38. @Override
  39. protected void onSizeChanged(int w, int h, int oldw, int oldh)
  40. {
  41. super.onSizeChanged(w, h, oldw, oldh);
  42. screenWidth = w; // store the width
  43. screenHeight = h; // store the height
  44. ballRadius=w/10;
  45. }
  46. @Override
  47. public void surfaceCreated(SurfaceHolder holder) {
  48. // TODO Auto-generated method stub
  49. myThread = new CanvasThread();
  50. System.out.println("SurfaceCreated!");
  51. myThread.start();
  52. }
  53. @Override
  54. public void surfaceDestroyed(SurfaceHolder holder) {
  55. // TODO Auto-generated method stub
  56. // 停止循環
  57. isLoop = false;
  58. }
  59. public void drawGameElements(Canvas canvas)
  60. {
  61. canvas.drawCircle(100, 100,ballRadius,ballPaint);
  62. }
  63. private class CanvasThread extends Thread
  64. {
  65. @Override
  66. public void run()
  67. {
  68. while(true)
  69. {
  70. synchronized( myHolder )
  71. {
  72. Canvas canvas = myHolder.lockCanvas(null);//獲取畫布
  73. drawGameElements(canvas);
  74. myHolder.unlockCanvasAndPost(canvas);//解鎖畫布,提交畫好的圖像
  75. //System.out.println("run");
  76. }
  77. }
  78. }
  79. }
  80. }

事件處理 類:

  1. package com.example.bonusball;
  2. import android.os.Bundle;
  3. import android.app.Activity;
  4. import android.view.Menu;
  5. import android.content.Context;
  6. import android.graphics.Canvas;
  7. import android.graphics.Color;
  8. import android.graphics.Paint;
  9. import android.graphics.Rect;
  10. import android.view.GestureDetector;
  11. import android.view.GestureDetector.SimpleOnGestureListener;
  12. import android.view.MotionEvent;
  13. import android.view.SurfaceHolder;
  14. import android.view.SurfaceView;
  15. import android.widget.Toast;
  16. public class BallActivity extends Activity {
  17. private GestureDetector myGestureDetector;//監聽手勢
  18. private CanvasView myCanvas;
  19. @Override
  20. public void onCreate(Bundle savedInstanceState) {
  21. super.onCreate(savedInstanceState);
  22. myCanvas=new CanvasView(this);
  23. setContentView(myCanvas);
  24. myGestureDetector = new GestureDetector(this, new MyGestureListener());
  25. }
  26. @Override
  27. public boolean onTouchEvent(MotionEvent event)
  28. {
  29. return myGestureDetector.onTouchEvent(event);
  30. }
  31. private class MyGestureListener extends SimpleOnGestureListener
  32. {
  33. public boolean onDown(MotionEvent e1) {
  34. Toast.makeText(getApplicationContext(), "onDown", Toast.LENGTH_SHORT).show();
  35. return true;
  36. }
  37. @Override
  38. public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
  39. {
  40. System.out.println("Fling");
  41. return true;
  42. }
  43. }
  44. @Override
  45. public boolean onCreateOptionsMenu(Menu menu) {
  46. getMenuInflater().inflate(R.menu.activity_ball, menu);
  47. return true;
  48. }
  49. }
Copyright © Linux教程網 All Rights Reserved