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

临文乍了了,彻卷兀若无。这篇文章主要讲述如何在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上移动路径()】希望这可以帮助。

    推荐阅读