当前位置: 代码迷 >> Android >> android画随便曲线时,去除移动过程中出现莫名直线的方法
  详细解决方案

android画随便曲线时,去除移动过程中出现莫名直线的方法

热度:7   发布时间:2016-05-01 16:25:02.0
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次,没有出现附件中的情况,特此记录。

1 楼 wangtingshuai 2011-05-30  
正好用到,非常感谢,拿走了
  相关解决方案