如何在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上移动路径?的主要内容,如果未能解决你的问题,请参考以下文章