`
bit6211
  • 浏览: 73233 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

  • 大小: 60.3 KB
分享到:
评论
1 楼 wangtingshuai 2011-05-30  
正好用到,非常感谢,拿走了

相关推荐

Global site tag (gtag.js) - Google Analytics