如何在Android中的Canvas上移动路径?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Android中的Canvas上移动路径?相关的知识,希望对你有一定的参考价值。

我正在尝试制作一个用于手指画的android绘画应用程序,我在移动我绘制的线条时遇到了麻烦。

我试图做的是在ACTION_MOVE期间将初始指压按钮与OnTouchEvent中当前坐标之间的差异偏移当前所选行的路径。

case MotionEvent.ACTION_MOVE:
selectline.getLine().offset(x - otherx, y - othery);

在ACTION_MOVE期间将otherx和othery设置为x和y坐标,x和y是当前光标坐标。我的行存储为一个单独的类,包含路径,颜色,厚度和边界框。

我得到的是从手指方向飞出屏幕的形状,没有停止在最轻微的运动。我尝试使用矩阵移动路径,但结果是一样的。

当我试图插入一个“do while”来检查当前坐标是否与路径的.computeBounds()矩形中心匹配,但是一旦我移动手指,程序就会崩溃。

任何帮助将不胜感激,谢谢。

答案

很可能你没有使用正确的比例坐标。

资料来源:Get Canvas coordinates after scaling up/down or dragging in android

float px = ev.getX() / mScaleFactor + rect.left;
float py = ev.getY() / mScaleFactor + rect.top;
// where mScaleFactor is the scale use in canvas and rect.left and rect.top is the coordinate of top and left boundary of canvas respectively
另一答案

它有点晚,但它可以解决其他问题。我这样解决了这个问题,在onLongPress上得到了初始的X,Y位置

public void onLongPress(MotionEvent motionEvent) {

        try {
            shapeDrag = true;
            SmEventX = getReletiveX(motionEvent);
            SmEventY = getReletiveY(motionEvent);
        } catch (Exception e) {
            e.printStackTrace();
        }

然后在onToucn上(MotionEvent事件)

case MotionEvent.ACTION_MOVE: {
                    actionMoveEvent(motionEvent);
                    try {

                        if (shapeDrag) {
                            StylePath sp = alStylePaths
                                    .get(alStylePaths.size() - 1);
                            Path mpath = sp.getPath();


                            float tempX = getReletiveX(motionEvent) - SmEventX;
                            float tempY = getReletiveY(motionEvent) - SmEventY;

                            mpath.offset(tempX, tempY);
                            SmEventX = getReletiveX(motionEvent);
                            SmEventY = getReletiveY(motionEvent);


                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    break;
                }
    }
另一答案

我遇到了同样的麻烦,在我的情况下,这是一个非常天真的错误。由于“症状”的描述完全匹配(在最轻微的动作中,手指方向飞离屏幕的形状,形状在ACTION_UP事件中正确移动),我认为背后的原因可能是相同的。

基本上问题在于更新ACTION_MOVE事件中的触摸位置坐标。如果您不更新最后一个触摸位置,计算出的距离将始终位于当前触摸位置和ACTION_DOWN事件中存储的第一个触摸位置之间:如果您将此偏移连续应用于路径,则转换将总结并因此形状会从屏幕上迅速“飞”出来。

解决方案非常简单:只需更新ACTION_MOVE事件结束时的最后一个触摸位置:

float mLastTouchX, mLastTouchY;

@Override
public boolean onTouchEvent(MotionEvent ev) {

    final int action = ev.getAction();

    switch (action) {
        case MotionEvent.ACTION_DOWN: {
            // get touch position
            final float x = ev.getX();
            final float y = ev.getY();

            // save the initial touch position
            mLastTouchX = x;
            mLastTouchY = y;

            break;
        }

        case MotionEvent.ACTION_MOVE: {
            // get touch position
            final float x = ev.getX();
            final float y = ev.getY();

            // calculate the distance moved
            final float dx = x - mLastTouchX;
            final float dy = y - mLastTouchY;

            // here apply translation to the path

            // update touch position for the next move event
            mLastTouchX = x;
            mLastTouchY = y;

            break;
        }
    }
    return true;
}

希望这可以帮助。

以上是关于如何在Android中的Canvas上移动路径?的主要内容,如果未能解决你的问题,请参考以下文章

canvas刮刮效果实现

android怎么移动canvas

Qt 和 Android - 从图库中的图像获取路径

Android Canvas之Path操作

WPF中的动画——路径动画

canvas钟表