【问题标题】:Dragging Drawable on Canvas - works, but the position is not exact在 Canvas 上拖动 Drawable - 有效,但位置不准确
【发布时间】:2014-11-05 13:49:50
【问题描述】:

我编写了a simple test app,其中Drawable 对象(下面屏幕截图中的黄色半透明图块)可以在可滚动和可缩放(通过使用矩阵)画布上拖动:

这里是处理拖拽的代码:

private Drawable mDragged = null;
private float mPrevX;
private float mPrevY;

public boolean onTouchEvent(MotionEvent e) {
    // Convert touch coordinates to Canvas coordinates
    float[] point = new float[] {e.getX(), e.getY()};
    Matrix inverse = new Matrix();
    mMatrix.invert(inverse);
    inverse.mapPoints(point);
    float x = point[0];
    float y = point[1];

    switch (e.getAction()) {
    case MotionEvent.ACTION_DOWN:
        Drawable tile = hitTest(x, y);
        if (tile != null) {
            mDragged = tile;
            mPrevX = x;
            mPrevY = y;
            return true;
        }
    break;
    case MotionEvent.ACTION_MOVE:
        if (mDragged != null) {
            float dX = x - mPrevX;
            float dY = y - mPrevY;
            mPrevX = x;
            mPrevY = y;

            Rect rect = mDragged.copyBounds();
            rect.left += dX;
            rect.top += dY;
            rect.right = rect.left + mDragged.getIntrinsicWidth();
            rect.bottom = rect.top + mDragged.getIntrinsicHeight();
            mDragged.setBounds(rect);

            invalidate();
            return true;
        }
    break;
    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_CANCEL:
        if (mDragged != null) {
            mDragged = null;
            return true;
        }
    break;
    }
    // Handle Canvas scrolling and scaling here
}

它可以工作,但我有一个问题 - 当我触摸一个磁贴然后拖动它时 - 磁贴离开我的手指(或使用 Android 模拟器时从我的鼠标指针)。

即被拖动的Drawable 与手指(或鼠标指针 - 如上面的屏幕截图所示)之间的距离在被拖动时会增加。

这不能是a multi-touch related issue - 因为模拟器上只有单点触控。

这里的根本原因是什么?

【问题讨论】:

    标签: android canvas android-canvas drag android-drawable


    【解决方案1】:

    这里只是一种预感,但这可能是由于两件事混合在一起:

    1. 您的坐标是 float 值,但 Rect 包含 int 值,这可能会导致一些舍入问题
    2. 在每个 ACTION_MOVE 事件中,您将添加(可能)舍入值,并更改基线(mPrevXmPrevY),而不是计算距您第一次开始拖动的位置的绝对距离

    我会在拖动开始时存储图块的当前位置(包括从光标位置的偏移量),然后基于该点进行所有移动计算。

    【讨论】:

    • +1 谢谢。问题已被rect.left += Math.round(dX) 解决,但我也会执行您的第二条建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 2020-06-19
    • 2016-10-19
    相关资源
    最近更新 更多