美文网首页
判断点是否在不规则的图形中

判断点是否在不规则的图形中

作者: 墨色尘埃 | 来源:发表于2017-07-19 09:43 被阅读0次

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

    //构造一个区域对象,左闭右开的。
                    RectF r = new RectF();
                    //计算控制点的边界
                    path.computeBounds(r, true);
                    //设置区域路径和剪辑描述的区域
                    re.setPath(path, new Region((int) r.left, (int) r.top, (int) r.right, (int) r.bottom));
                    //在封闭的path内返回true 不在返回false
                    isMoving = re.contains((int) event.getX(), (int) event.getY());
                    Log.e("DrawTestView", "--判断点是否则范围内----" + isMoving);
    

    TestView

    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);
        }
    
        @Override
        protected 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 不在返回false
                    Log.e("DrawTestView", "--判断点是否则范围内----" + 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;
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:判断点是否在不规则的图形中

          本文链接:https://www.haomeiwen.com/subject/tsokkxtx.html