android - 如何在点之间画线并拉动这些点?

标签 android drawing points

我想在 View 上的点之间画线,然后将这些点拉到所需的位置,即使形状会改变。

我知道如何在两点之间画线 canvas.drawLine(10, 10, 90, 10, paint); 通过使用它我可以在点之间画线。

EDIT :这里我附上图片以便清楚解释,从 Paul 回答现在我能够在点之间画线,仍然有拉点的问题......

enter image description here

最佳答案

这是它是如何完成的。假设你有你的观点,让这些成为全局性的:

PointF topLeft = new PointF(10,10);
PointF topRight = new PointF(90,10);
PointF bottomLeft = new PointF(10,90);
PointF bottomRight = new PointF(90,90);

您需要做的是围绕每个点创建一个 RectF。 RectF越大,点的触摸面积越大。

float sizeOfRect = 5f;
RectF topLeftTouchArea = new RectF(topLeft.x - sizeOfRect, topLeft.y - sizeOfRect, topLeft.x + sizeOfRect, topLeft.y + sizeOfRect);
//Do this for the other points too

定义一些全局变量来跟踪用户在 onTouch 中所做的事情。一个int是被触摸的角,另外四个是角的标识符。

private final int NONE = -1, TOUCH_TOP_LEFT = 0, TOUCH_TOP_RIGHT = 1, TOUCH_BOT_LEFT = 2, TOUCH_BOT_RIGHT = 3;
int currentTouch = NONE;

现在,在您的 onTouch 事件中,您可以像这样检查您的用户正在触摸哪个点:

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
    //The user just put their finger down.
    //We check to see which corner the user is touching
    //And set our global, currentTouch, to the appropriate constant.
    case MotionEvent.ACTION_DOWN:
        if (topLeftTouchArea.contains(event.getX(), event.getY()) {
            currentTouch = TOUCH_TOP_LEFT;
        } else if (topRightTouchArea.contains(event.getX(),event.getY()) {
            currentTouch = TOUCH_TOP_RIGHT;
        } else if (botLeftTouchArea.contains(event.getX(),event.getY()) {
            currentTouch = TOUCH_BOT_LEFT;
        } else if (botRightTouchArea.contains(event.getX(), event.getY()) {
            currentTouch = TOUCH_BOT_RIGHT;
        } else {
            return false; //Return false if user touches none of the corners
        }
        return true; //Return true if the user touches one of the corners
    //Now we know which corner the user is touching.
    //When the user moves their finger, we update the point to the user position and invalidate.
    case MotionEvent.ACTION_MOVE:
        switch (currentTouch) {
        case TOUCH_TOP_LEFT:
             topLeft.x = event.getX();
             topLeft.y = event.getY();
             //The bottom left x position has to move with the top left corner
             bottomLeft.x = topLeft.x;
             //The top right y position has to move with the top left corner
             topRight.y = topLeft.y;
             invalidate();
             return true;
        case TOUCH_TOP_RIGHT:
             topRight.x = event.getX();
             topRight.y = event.getY();
             //The top left y position has to move with the top right corner
             topLeft.y = topRight.y;
             //The bottom right x position has to move with the top right corner
             bottomRight.x = topRight.x;
             invalidate();
             return true;
        case TOUCH_BOT_LEFT:
             bottomLeft.x = event.getX();
             bottomLeft.y = event.getY();
             bottomRight.y = bottomLeft.y;
             topLeft.x = bottomLeft.x;
             invalidate();
             return true;
        case TOUCH_BOT_RIGHT:
             bottomRight.x = event.getX();
             bottomRight.y = event.getY();
             topRight.x = bottomRight.x;
             bottomLeft.y = bottomRight.y;
             invalidate();
             return true;
        }
        //We returned true for all of the above cases, because we used the event
        return false; //If currentTouch is none of the above cases, return false

    //Here the user lifts up their finger.
    //We update the points one last time, and set currentTouch to NONE.
    case MotionEvent.ACTION_UP:
        switch (currentTouch) {
        case TOUCH_TOP_LEFT:
             topLeft.x = event.getX();
             topLeft.y = event.getY();
             //The bottom left x position has to move with the top left corner
             bottomLeft.x = topLeft.x;
             //The top right y position has to move with the top left corner
             topRight.y = topLeft.y;
             invalidate();
             currentTouch = NONE;
             return true;
        case TOUCH_TOP_RIGHT:
             topRight.x = event.getX();
             topRight.y = event.getY();
             //The top left y position has to move with the top right corner
             topLeft.y = topRight.y;
             //The bottom right x position has to move with the top right corner
             bottomRight.x = topRight.x;
             invalidate();
             currentTouch = NONE;
             return true;
        case TOUCH_BOT_LEFT:
             bottomLeft.x = event.getX();
             bottomLeft.y = event.getY();
             bottomRight.y = bottomLeft.y;
             topLeft.x = bottomLeft.x;
             invalidate();
             currentTouch = NONE;
             return true;
        case TOUCH_BOT_RIGHT:
             bottomRight.x = event.getX();
             bottomRight.y = event.getY();
             topRight.x = bottomRight.x;
             bottomLeft.y = bottomRight.y;
             invalidate();
             currentTouch = NONE;
             return true;
        }
        return false;
    }
}

这样做是围绕您的点创建一个矩形。想象一下在图片中围绕您的点绘制框。这些是由 Rect 对象创建的“触摸板”。矩形的大小由 sizeOfRect 设置。在 onTouchEvent 中,它检查每个矩形对象以查看用户的触摸是否在矩形内部,并向用户发出尝试触摸该点的信号。

关于android - 如何在点之间画线并拉动这些点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10860041/

相关文章:

c# - 在 MonoMac 中绘图

php - 在问答网站上管理用户积分

javascript - 绘制点,以便它们在具有相同坐标时不会重叠

android - 当我尝试使用 Screengrab 捕获屏幕截图时,faSTLane 中的语言设置出现错误

android - 使用自定义字体的自定义 TextView

java - 有没有办法找出后栈发生了什么?

iphone - iOS:如何在两个移动的物体之间画一条线?

android - 从 Dropbox 获取最新更改

c# - GDI+ 中出现一般性错误

opencv - 如何使用 OpenCV 从点获取轮廓