需求概述: 在屏幕上用手指畫出一個區域,返回所圈的區域坐標。 技術實現: 自定義View,設置畫筆及對應參數,在onTouchEvent()回調函數里,對觸摸事件進行判斷。畫出矩形圖形。 代碼: 自定義View: 調用時,只需要在onCreate()函數里,直接添加就可以: 根據需要可以在自定義類中 ...
需求概述:
在屏幕上用手指畫出一個區域,返回所圈的區域坐標。
技術實現:
自定義View,設置畫筆及對應參數,在onTouchEvent()回調函數里,對觸摸事件進行判斷。畫出矩形圖形。
代碼:
自定義View:
1 public class GameView extends View { 2 // 聲明Paint對象 3 private Paint mPaint = null; 4 private int StrokeWidth = 5; 5 private Rect rect = new Rect(0,0,0,0);//手動繪製矩形 6 7 public GameView(Context context){ 8 super(context); 9 //構建對象 10 mPaint = new Paint(); 11 mPaint.setColor(Color.RED); 12 //開啟線程 13 // new Thread(this).start(); 14 } 15 @Override 16 protected void onDraw(Canvas canvas) { 17 super.onDraw(canvas); 18 //設置無鋸齒 19 mPaint.setAntiAlias(true); 20 canvas.drawARGB(50,255,227,0); 21 mPaint.setStyle(Paint.Style.STROKE); 22 mPaint.setStrokeWidth(StrokeWidth); 23 mPaint.setColor(Color.GREEN); 24 mPaint.setAlpha(100); 25 // 繪製綠色實心矩形 26 canvas.drawRect(100, 200, 400, 200 + 400, mPaint); 27 mPaint.setColor(Color.RED); 28 canvas.drawRect(rect,mPaint); 29 } 30 @Override 31 public boolean onTouchEvent(MotionEvent event) { 32 int x = (int)event.getX(); 33 int y = (int)event.getY(); 34 switch (event.getAction()){ 35 case MotionEvent.ACTION_DOWN: 36 rect.right+=StrokeWidth; 37 rect.bottom+=StrokeWidth; 38 invalidate(rect); 39 rect.left = x; 40 rect.top = y; 41 rect.right =rect.left; 42 rect.bottom = rect.top; 43 44 case MotionEvent.ACTION_MOVE: 45 Rect old = 46 new Rect(rect.left,rect.top,rect.right+StrokeWidth,rect.bottom+StrokeWidth); 47 rect.right = x; 48 rect.bottom = y; 49 old.union(x,y); 50 invalidate(old); 51 break; 52 53 case MotionEvent.ACTION_UP: 54 break; 55 default: 56 break; 57 } 58 return true;//處理了觸摸信息,消息不再傳遞 59 } 60 61 }
調用時,只需要在onCreate()函數里,直接添加就可以:
1 super.onCreate(savedInstanceState); 2 setContentView(R.layout.activity_main); 3 4 gameView = new GameView(this); 5 addContentView(gameView);
根據需要可以在自定義類中,加入返迴圈定範圍的函數。
ps:需要註意的是,在手指移動的時候,屏幕需要更新矩形時,原理上刪除原來矩形,畫上新矩形。但是由於空心矩形邊厚度的存在,
會出現遺留的情況,此時要減去border厚度,可以解決上述問題。
Rect old = new Rect(rect.left,rect.top,rect.right+StrokeWidth,rect.bottom+StrokeWidth);