需求概述:
在屏幕上用手指画出一个区域,返回所圈的区域坐标。
技术实现:
自定义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);