Android 判断一个点是否在封闭的Path内或不规则的图形内
最近在写画板程序,要判断一个点在一个闭合的path内或者是一个不规则的图形内,这个可不好解决网上查了一堆有算法云云的,直到看到一个大神的帖子 其实可以相当的简单几句话的是 核心代码:
//------关键部分 判断点是否在 一个闭合的path内--------//if(event.getAction()==MotionEvent.ACTION_DOWN){//构造一个区域对象,左闭右开的。 RectF r=new RectF(); //计算控制点的边界 mPath.computeBounds(r, true); //设置区域路径和剪辑描述的区域 re.setPath(mPath, new Region((int)r.left,(int)r.top,(int)r.right,(int)r.bottom)); //判断触摸点是否在封闭的path内 在返回true 不在返回falseLog.e("","--判断点是否则范围内----"+re.contains((int)event.getX(), (int)event.getY()));}
主要是用了 mPath.computeBounds(r, true);来计算边界 产生Region来判断
全部示例代码:
package com.example.touchtest;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.graphics.Region;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View; public class TestView extends View{ //----绘制轨迹----private float mX; private float mY; private final Paint mGesturePaint = new Paint(); private final Path mPath = new Path(); //------检测点是否在path内private boolean isDraw=false;Region re=new Region();public TestView(Context context, AttributeSet attrs) {super(context, attrs);mGesturePaint.setColor(context.getResources().getColor(android.R.color.holo_green_dark));mGesturePaint.setStyle(Paint.Style.STROKE); mGesturePaint.setStrokeWidth(4.0f);} public TestView(Context context) {super(context);mGesturePaint.setColor(context.getResources().getColor(android.R.color.holo_green_dark));mGesturePaint.setStyle(Paint.Style.STROKE); mGesturePaint.setStrokeWidth(4.0f);}@Overrideprotected void onDraw(Canvas canvas) {canvas.drawPath(mPath, mGesturePaint); } @Override public boolean onTouchEvent(MotionEvent event) {if(isDraw){//------关键部分 判断点是否在 一个闭合的path内--------//if(event.getAction()==MotionEvent.ACTION_DOWN){//构造一个区域对象,左闭右开的。 RectF r=new RectF(); //计算控制点的边界 mPath.computeBounds(r, true); //设置区域路径和剪辑描述的区域 re.setPath(mPath, new Region((int)r.left,(int)r.top,(int)r.right,(int)r.bottom)); //在封闭的path内返回true 不在返回falseLog.e("","--判断点是否则范围内----"+re.contains((int)event.getX(), (int)event.getY()));} return true;} switch (event.getAction()) { case MotionEvent.ACTION_DOWN: touchDown(event);break; case MotionEvent.ACTION_MOVE: touchMove(event); break;case MotionEvent.ACTION_UP: mPath.close(); isDraw=true; break;} //更新绘制 invalidate(); return true; } //---------------下边是划线部分----------------------------// //手指点下屏幕时调用 private void touchDown(MotionEvent event) { //重置绘制路线,即隐藏之前绘制的轨迹 mPath.reset(); float x = event.getX(); float y = event.getY(); mX = x; mY = y; mPath.moveTo(x, y); } //手指在屏幕上滑动时调用 private void touchMove(MotionEvent event) { final float x = event.getX(); final float y = event.getY(); final float previousX = mX; final float previousY = mY; final float dx = Math.abs(x - previousX); final float dy = Math.abs(y - previousY); //两点之间的距离大于等于3时,连接连接两点形成直线 if (dx >= 3 || dy >= 3) { //两点连成直线 mPath.lineTo(x, y); //第二次执行时,第一次结束调用的坐标值将作为第二次调用的初始坐标值 mX = x; mY = y; } }
}
运行
经测试可以很准确的判断 touch触摸点是否在上边绘制的不规则图形内,搞绘图的小伙伴们赶紧拿去开心的玩耍吧!哈哈
总结:技术是个不断积累的过程,对一个平台的熟悉程度决定了你的实现能力和快速解决问题的能力。万能的百度当然可以 但是也要有人去摸索分享出来 大家才能收益,感谢大神的分享精神 原文地址:http://blog.csdn.net/havakey/article/details/6649553
不断学习不断积累,苦逼IT男的必由之路。
Android 判断一个点是否在封闭的Path内或不规则的图形内相关推荐
- Android判断一个点在不在多边形中
有人问我,怎么判断一个点是不是在多边形内,本来想着把这个多边形分成一个又一个三角形,如图, 然后判断这个点是不是在某个三角形中,如果在,那就肯定在这个多边形中,那问题接下来就转化成判断这个点是不是在三 ...
- java 坐标系运算 判断一个地理坐标是否在电子围栏 圆、矩形、多边形区域内
测试没问题,我用的是原始坐标:要注意的是坐标转换问题,要看当前是属于什么坐标系 经纬度与GCS(Geographic Coordinate System, 地理坐标系统) 平面坐标与PCS(Proje ...
- android判断一个控件是否获得光标,Android View获取焦点
做项目的时候遇到一个bug,在一个Activity中打开DrawerLayout,这样就会遇到一个问题,在Activity中的EditText的焦点还在,这样根据项目中的代码逻辑数据就会同步不过来,这 ...
- Android判断一个Service是否运行
来自陈显的博客http://www.cnblogs.com/chenxian/ /*** 判断给定名称的服务时候已经运行* @param context* @param serviceName* @r ...
- Android判断系统前后台应用和服务之ActivityManager
在一个应用中,或一个Service .Receiver中判断一个应用是否正在运行,以便进行一些相关的处理. 这个时候我们需要得到一个ActivityManager,这个Manager顾名思意就是管理A ...
- android 经纬度的范围内,在Android里如何判断一个指定的经纬度点是否落在一个多边形区域内...
在lbs开发中,可能要碰到这样的问题,如何判断一个指定的经纬度点是否落在一个多边形区域内,比如我在地图上画了一个多边形区域,然后给出一个经纬度点,怎样判断这个点是否在这个多边形范围之内,由于我用的是a ...
- android检测代码是否执行,Android如何判断一个应用在运行
在一个应用中,或一个Service .Receiver中判断一个应用是否正在运行,以便进行一些相关的处理. 这个时候我们需要得到一个ActivityManager,这个Manager顾名思意就是管理A ...
- Android 如何判断一个应用在运行(转)
Android 如何判断一个应用在运行 在一个应用中,或一个Service .Receiver中判断一个应用是否正在运行,以便进行一些相关的处理. 这个时候我们需要得到一个ActivityManag ...
- Android 如何判断一个应用在运行
在一个应用中,或一个Service .Receiver中判断一个应用是否正在运行,以便进行一些相关的处理. 这个时候我们需要得到一个ActivityManager,这个Manager顾名思意就是管理A ...
最新文章
- verilog hdl数字集成电路设计原理与应用_数字IC设计经典书籍推荐
- 内存数据库MemSQL ——基于内存,MVCC+哈希表、跳表
- Silverlight 游戏开发小技巧:轨迹跟随效果
- SQL 语句快速参考
- html和css制作动漫岛,CSS动画
- 用C语言编写的简历,一份用C语言写的简历
- 浅谈 HTTPS 和 SSL/TLS 协议的背景与基础
- 一个请求在Struts2框架中的处理的步骤
- java中的DES,AES,BASE64,MD5和Cipher类\MessageDigest类
- 【react】 使用react 脚手架 创建项目
- python_open3d_Error: The DISPLAY environment variable is missing
- NumPy库---二元函数
- 柒微自动发卡系统源码
- 尚硅谷Vue2.0+Vue3.0全套教程视频笔记 + 代码 [P101-135]
- masm编译.asm文件报错fatal errorA1000: cannot open file
- 手机电脑浏览器抓取京东Cookies教程
- python调用gpu amd_TensorFlow通过AMD GPU加速(ROCm/Ubuntu 18.04)
- 华硕a550jk4200公版显卡驱动适配教程
- 嵌入式Linux--MYS-6ULX-IOT--总目录
- 超简洁WIN10桌面分享