失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Android 判断一个点是否在封闭的Path内或不规则的图形内

Android 判断一个点是否在封闭的Path内或不规则的图形内

时间:2023-04-05 15:36:35

相关推荐

Android 判断一个点是否在封闭的Path内或不规则的图形内

最近在写画板程序,要判断一个点在一个闭合的path内或者是一个不规则的图形内,这个可不好解决网上查了一堆有算法云云的,直到看到一个大神的帖子 其实可以相当的简单几句话的是 核心代码:

//------关键部分 判断点是否在 一个闭合的path内--------//if(event.getAction()==MotionEvent.ACTION_DOWN){//构造一个区域对象,左闭右开的。 RectF r=new RectF(); //计算控制点的边界 puteBounds(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()));}

主要是用了puteBounds(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(); //计算控制点的边界 puteBounds(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触摸点是否在上边绘制的不规则图形内,搞绘图的小伙伴们赶紧拿去开心的玩耍吧!哈哈

总结:技术是个不断积累的过程,对一个平台的熟悉程度决定了你的实现能力和快速解决问题的能力。万能的百度当然可以 但是也要有人去摸索分享出来 大家才能收益,感谢大神的分享精神 原文地址:/havakey/article/details/6649553

不断学习不断积累,苦逼IT男的必由之路。

如果觉得《Android 判断一个点是否在封闭的Path内或不规则的图形内》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。