android画随便曲线时,去除移动过程中出现莫名直线的方法
在android的ApiDemos中,画任意曲线(在FingerPaint这个例子中)的主要代码如下:
private float mX, mY;
private static final float TOUCH_TOLERANCE = 1;//这里我改为1
private void touch_start(float x, float y) {
mPath.reset();
mPath.moveTo(x, y);
mX = x;
mY = y;
}
private void touch_move(float x, float y) {
float dx = Math.abs(x - mX);
float dy = Math.abs(y - mY);
if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
mX = x;
mY = y;
}
}
private void touch_up() {
mPath.lineTo(mX, mY);
// commit the path to our offscreen
mCanvas.drawPath(mPath, mPaint);
// kill this so we don't double draw
mPath.reset();
}
当你迅速的点击鼠标、移动鼠标、松开鼠标, 大概200-300次会出现2-3次,在移动鼠标的过程中,从点(0,0)到鼠标移动位置的坐标,的直线。如附件所示。究其原因是,在touch_move函数中的quadTo语句(If no moveTo() call has been made for this contour, the first point is automatically set to (0,0).),如果在调用quadTo没有调用moveTo函数,则自动设置起始点为(0,0)。我的想法是,在每调用一次quadTo之前,人为调用moveTo一次,并且只有调用moveTo成功的情况下,才调用quadTo,如下代码所示:
private float mX, mY;
private static final float TOUCH_TOLERANCE = 1;//这里我改为1
/**是否设置moveTo函数的标志位*/
private boolean isSetMoveTo = false;
/**是否可以调用quadTo*/
private boolean isQuadTo = false;
/**quadTo语句的上一个结束点的X坐标*/
private float lastPointXBefore = 0.0f;
/**quadTo语句的上一个结束点的Y坐标*/
private float lastPointYBefore = 0.0f;
private void touch_start(float x, float y) {
mPath.reset();
mPath.moveTo(x, y);
mX = x;
mY = y;
isSetMoveTo = false;
}
private void touch_move(float x, float y) {
float dx = Math.abs(x - mX);
float dy = Math.abs(y - mY);
if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
if(isSetMoveTo)
{
mPath.moveTo(lastPointXBefore, lastPointYBefore);
isQuadTo = true;
}
if(isQuadTo)
{
mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
isQuadTo = false;
}
isSetMoveTo = true;
lastPointXBefore = (x + mX) / 2;
lastPointYBefore = (y + mY) / 2;
mX = x;
mY = y;
}
}
private void touch_up() {
mPath.lineTo(mX, mY);
// commit the path to our offscreen
mCanvas.drawPath(mPath, mPaint);
// kill this so we don't double draw
mPath.reset();
}
在增加了以上代码后,我又测试了300次,没有出现附件中的情况,特此记录。