代码之家  ›  专栏  ›  技术社区  ›  Alex

如何正确比较坐标?

  •  -1
  • Alex  · 技术社区  · 7 年前

    我有绘制文本和用户绘制线的自定义视图。

    文本有一些(x,y)坐标,直线也有它(只要用户绘制它)。我只想比较一下,直线坐标和文本坐标是一样的。

    但由于用手指很难找到精确的坐标,所以用户不可能直接比较,看起来他连接了两个文本,但坐标略有不同。

    我怎样才能正确地做呢?

    isCorrectConnection ):

    public class FingerLineView extends View {
        private final Paint mPaint;
        private final Paint mPaintText;
        private float startX, startY;
        private float endX, endY;
    
        public FingerLineView(Context context) {
            this(context, null);
        }
    
        public FingerLineView(Context context, AttributeSet attrs) {
            super(context, attrs);
            mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setColor(Color.RED);
            mPaintText = new Paint(Paint.ANTI_ALIAS_FLAG);
            mPaintText.setColor(Color.BLACK);
            mPaintText.setTextSize(30);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            canvas.drawLine(startX, startY, endX, endY, mPaint);
            canvas.drawText("TEXT", 10, 200, mPaintText);
            canvas.drawText("TEXT", 200, 200, mPaintText);
        }
    
        @Override
        public boolean onTouchEvent(@NonNull MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    startX = event.getX();
                    startY = event.getY();
                    // Set the end to prevent initial jump
                    endX = event.getX();
                    endY = event.getY();
                    invalidate();
                    break;
                case MotionEvent.ACTION_MOVE:
                    endX = event.getX();
                    endY = event.getY();
                    invalidate();
                    break;
                case MotionEvent.ACTION_UP:
                    endX = event.getX();
                    endY = event.getY();
                    isCorrectConnection(startX, startY, endX, endY, 10, 200, 200, 200);
                    invalidate();
                    break;
            }
            return true;
        }
    
        public boolean isCorrectConnection(float startX, float startY, float endX, float endY,
                                           float textX1, float textY1, float textX2, float textY2) {
            return startX == textX1 && startY == textY1 && endX == textX2 && endY == textY2;
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Azhy    7 年前

    根据我对您的问题的理解,如果您想检查用户是否单击第一个文本并移动(拖动)到第二个文本,或者反之亦然,您应该检查是否按下整个文本,而不仅仅是绘制文本的左上角,所以我有一个答案给你,这两个文本的应该是不同的,因为知道有像素大小,然后在这个文本矩形内检查触摸,而不是像我所描述的左上角点,所以让我们开始:首先你应该改变你的 isCorrectConnection 此函数instead:-

    private boolean isCorrectConnection(float startX, float startY, float endX, float endY,
                                       float x1, float y1, float x2, float y2
                                       String text1, String text2) {
        //Measuring text1's size
        Rect textBounds = new Rect();
        mPaint.getTextBounds(text1, 0, text1.length(), textBounds);
        int w1 = textBounds.width();
        int h1 = textBounds.height();
    
        //Measuring text2's size
        Rect textBounds2 = new Rect();
        mPaint.getTextBounds(text2, 0, text2.length(), textBounds2);
        int w2 = textBounds2.width();
        int h2 = textBounds2.height();
    
        //Checking for touched and moved from text1 to text2
        if(startX >= x1 && startX <= (x1 + w1) && startY >= y1 && startY <= (y1 + h1) &&
           endX >= x2 && endX <= (x2 + w2) && endY >= y2 && endY <= (y2 + h2))
            return true;
    
        //Checking for touched and moved from text2 to text1
        if(startX >= x2 && startX <= (x2 + w2) && startY >= y2 && startY <= (y2 + h2) &&
           endX >= x1 && endX <= (x1 + w1) && endY >= y1 && endY <= (y1 + h1))
            return true;
    
        return false;
    }
    

    private boolean isCorrectConnection(float startX, float startY, float endX, float endY,
                                       float x1, float y1, float x2, float y2
                                       String text) {
        //Measuring text's size
        Rect textBounds = new Rect();
        mPaint.getTextBounds(text, 0, text.length(), textBounds);
        int w1 = textBounds.width(), w2 = w1;
        int h1 = textBounds.height(), h2 = h1;
    
        //Checking for touched and moved from text1 to text2
        if(startX >= x1 && startX <= (x1 + w1) && startY >= y1 && startY <= (y1 + h1) &&
           endX >= x2 && endX <= (x2 + w2) && endY >= y2 && endY <= (y2 + h2))
            return true;
    
        //Checking for touched and moved from text2 to text1
        if(startX >= x2 && startX <= (x2 + w2) && startY >= y2 && startY <= (y2 + h2) &&
           endX >= x1 && endX <= (x1 + w1) && endY >= y1 && endY <= (y1 + h1))
            return true;
    
        return false;
    }