需求概述:

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

  技术实现:

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

效果图:

转载于:https://www.cnblogs.com/xueyudlut/p/7162358.html

Android 通过触摸动态地在屏幕上画矩形相关推荐

  1. android 前后同时预览_用上这些官方动态壁纸,让你的 Android 主屏简洁又优雅

    近年来,越来越多的 Android 厂商都选择通过定制动态壁纸的方式,来为自家手机打造独特的使用体验.一些 OEM 厂商甚至能跳出常规框架.赋予其与众不同的视觉效果和交互方式,只是一张动态壁纸,就足以 ...

  2. Android开发——用户在屏幕上的手势识别

    0. 前言   转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52462493 Android开发中,我们常常需要获取用户的手势操作事 ...

  3. Android运行时动态全屏以及旋转屏幕时不重新装载

    Android运行时动态全屏以及旋转屏幕时不重新装载 最近要做一视频播放器,在横屏时需要用到全屏播放,在网络上搜索"android 全屏",查到的文章全是如何设置全屏,通过them ...

  4. android设备登录是什么手机_手机玩游戏屏幕太小,教你怎么一分钟把手机游戏画面投到大屏幕上...

    把手机投屏到电脑上会带来很多便捷之处,尽管市面上部分手机屏幕的尺寸够大,但还是有很多手机屏幕不能满足我们的日常需求,例如玩一些大型游戏,屏幕小玩得不尽兴,相信很多人都会思考,有没有一些方法,可以将我们 ...

  5. ABAP 屏幕上动态修改按钮的图标

    对于屏幕上画出来的按钮,有时候需要根据用户动作修改图标.这个功能可以通过设置多个按钮,然后根据需要显示只想要看到的按钮,也可以只画一个按钮,通过修改图标码动态修改 第一种比较直接,但是比较麻烦,这里介 ...

  6. Android Animation实现元素在屏幕上按照指定轨迹运动,以及出现NullPointerException的解决方案

    因项目需要,在Android中实现了一个动画,当在Activity中点击特定按钮时,会在屏幕上添加一个ImageView,并按照指定的起点.终点,沿着特定的轨迹运动(例如直线). 实现方法 实现思路是 ...

  7. 如何在Android主屏幕上添加热点快捷方式

    Portable Wi-Fi hotspots on your Android phone are great, because hotel Wi-Fi usually isn't, but togg ...

  8. android广播内容显示在屏幕上,在Android本机来电屏幕上弹出窗口,例如真正的来电者Android应用...

    我也在努力(在这里理解你可能是错误的).您想要实现的是在Android 4.2(Jelly Bean)中显示该活动.我只是延迟显示活动.我在其他类中使用过PhoneStateListener.我可以在 ...

  9. android开发屏幕投射到电视6,用电视吃鸡!将手机上的内容投射到电视机的屏幕上!...

    原标题:用电视吃鸡!将手机上的内容投射到电视机的屏幕上! 很多人可能不知道,无论是安卓手机还是iPhone,都可以通过投屏的方式将手机的画面投射到电视上,以此来和亲友分享自己手机里的照片/视频内容.今 ...

最新文章

  1. 5、修改视图(ALTER VIEW)
  2. Nginx服务的信号控制
  3. 在cmd命令行下编译运行C/C++源文件
  4. 前端学习(1705):前端系列javascript之原型中的this
  5. linux用命令行进行无线连接,linux以命令行下配置连接wlan无线网卡
  6. Spring Cloud构建微服务架构:服务网关(过滤器)【Dalston版】
  7. LINQ to SQL之Step by Step及新手问题小结
  8. JAVA 一个或多个空格分割字符串
  9. 今晚直播丨管中窥豹 - PostgreSQL、openGauss、达梦和OceanBase的初步介绍
  10. mysql+installer+community+5.7.9_win10系统,mysql-installer-community-5.7.19.0.msi安装
  11. [转]Yii Framework: 从 model 中生成 select option
  12. 动画特效九:下拉刷新
  13. python和按键精灵哪个做脚本好_[按键精灵教程]学了这个你也能做出稳定的脚本...
  14. 酒店管理系统程序设计
  15. JPG/PNG转真SVG,非base64
  16. 经纬度坐标和投影坐标的转换
  17. vivos9e防抖功能设置教程
  18. LaTex关于数学公式的使用(11)--- 箭头,集合
  19. STM32 keyboard USB键盘功能的实现
  20. Excel如何根据数据生成条形码图片?

热门文章

  1. Python获取照片信息
  2. 暗淡蓝点-爱护我们的家园-地球
  3. 在使用SVN,下载文件到本地时,一定要把全目录下载下来!
  4. Java框架之SpringMVC 05-拦截器-异常映射-Spring工作流程
  5. Vue报错:Uncaught TypeError: Cannot assign to read only property ‘exports‘ of object 的解决方法
  6. 如何优雅处理前端异常?
  7. 3元购买微信小程序解决方案一个月
  8. 解决MybatisPlus修改时空字段不修改问题
  9. VS2012 无法启动IIS Express Web服务器的解决方案
  10. 解决 HomeBrew 下载缓慢的问题