?????? ?在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次,没有出现附件中的情况,特此记录。