zoukankan      html  css  js  c++  java
  • Android 通过触摸动态地在屏幕上画矩形

      需求概述:

      在屏幕上用手指画出一个区域,返回所圈的区域坐标。

      技术实现:

      自定义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);

     效果图:

     

    本博客所有内容为原创,转载需征求作者同意。
  • 相关阅读:
    模板方法模式
    组合模式
    JS API文档
    支持 @connect写法
    PHP word导入题库
    go 复制文件和创建目录
    go文件写入
    go 文件读取
    gin连接mysql数据库
    gin多数据格式返回结果
  • 原文地址:https://www.cnblogs.com/xueyudlut/p/7162358.html
Copyright © 2011-2022 走看看