博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 通过触摸动态地在屏幕上画矩形
阅读量:6577 次
发布时间:2019-06-24

本文共 2533 字,大约阅读时间需要 8 分钟。

  需求概述:

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

  技术实现:

  自定义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     @Override16     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     @Override31     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

你可能感兴趣的文章
jQuery中的.bind()、.live()和.delegate()之间区别分析
查看>>
我的友情链接
查看>>
ELK—>logstash—>ruby·plugin—>实现精彩的功能(term模板抽取)
查看>>
关于系统TCP连接的过多问题。
查看>>
我的友情链接
查看>>
BaseRecyclerViewAdapterHelper开源项目之BaseQuickAdapter源码学习上拉加载的实现代码(三)...
查看>>
雷军:做互联网需7字诀
查看>>
jQuery.extend 函数详解
查看>>
kendoUI 简单增删改查
查看>>
张斌:详解论坛推广技巧
查看>>
【BZOJ3262】 陌上花开
查看>>
Java基础学习总结(26)——JNDI入门简介
查看>>
【BZOJ 1563】 [NOI2009]诗人小G
查看>>
JAVASCRIPT学习体验
查看>>
HyperLeger Fabric开发(十)——资产交易平台实战
查看>>
iOS开发中遇到的一些问题以及解决办法总结
查看>>
JavaScript学习总结(5)——Javascript面向(基于)对象编程
查看>>
程序员必须知道的10大基础实用算法及其讲解
查看>>
大型网站技术架构(六)网站的伸缩性架构
查看>>
BZOJ3091城市旅行——LCT区间信息合并
查看>>