`
bit6211
  • 浏览: 74293 次
  • 性别: 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  
正好用到,非常感谢,拿走了

相关推荐

    Android 贝塞尔曲线动画 拿去直接用

    在Android开发中,贝塞尔曲线(Bézier Curve)是一种常用的技术,用于创建平滑、连续的曲线路径。贝塞尔曲线是由法国工程师皮埃尔·贝塞尔(Pierre Bézier)在1962年提出的,它在图形设计、计算机图形学以及动画...

    Android 自定义 直线箭头和曲线箭头

    本文将深入探讨如何在Android中创建自定义的直线箭头和曲线箭头,包括如何设置颜色,以及利用赛贝尔曲线和正切余弦函数计算箭头的方向。 首先,让我们了解Android自定义视图的基本步骤。创建一个新的Java类,继承自...

    android canvas 画曲线图 画三角形(多边形)

    本篇文章将详细讲解如何利用Canvas在Android中画曲线图和三角形(多边形),并结合示例代码帮助理解。 首先,我们要明白Canvas的基本用法。Canvas是Android中的一个类,它提供了在Bitmap上绘制图形的方法。通常,...

    Android模仿贝尔塞曲线路径动画demo

    通过分析这个应用的源代码,我们可以深入理解如何在Android平台上利用贝塞尔曲线实现动态路径动画,这对于制作复杂的UI过渡效果或游戏中的角色移动路径非常有用。 总的来说,这个demo展示了如何在Android中利用...

    Android 属性动画使控件沿贝塞尔曲线移动

    本项目"Android 属性动画使控件沿贝塞尔曲线移动"就利用了这一特性,实现了让控件沿着自定义的贝塞尔曲线轨迹平滑移动,并且允许开发者自定义动画的时长和运动幅度,同时还支持对移动的控件添加点击事件。...

    android曲线动画

    总结来说,Android中的曲线动画是通过属性动画系统实现的,利用Path和ObjectAnimator可以创建出沿着预定义轨迹移动的动画效果。通过实践PathAnimationDemo,开发者可以掌握这一高级动画技术,从而为应用程序增添更多...

    android画直线、箭头、折线(平移、定义点击事件)源码

    使用`Path`类画直线非常简单,通常通过`moveTo()`和`lineTo()`方法完成。`moveTo()`方法将路径移动到指定的坐标,而`lineTo()`方法则从当前点绘制一条直线到指定的坐标。 3. **画箭头**: 绘制箭头稍微复杂一些,...

    android动画循环移动

    在Android开发中,动画是提升用户体验的关键因素之一。"android动画循环移动"是一个关于如何在Android平台上实现元素连续、循环移动的示例。这个demo展示了如何利用Android的动画框架来创建平移效果,并让动画无缝地...

    Android贝塞尔曲线绘制心形

    在Android中,`Path`类提供了`quadTo()`(二次贝塞尔曲线)和`cubicTo()`(三次贝塞尔曲线)方法来绘制这些曲线。 心形通常由两个相互连接的二次或三次贝塞尔曲线构成,每个曲线代表心形的一半。为了构建这样的心形...

    Android过若干点绘制平滑曲线.zip

    在Android开发中,有时我们需要在屏幕上绘制出平滑的曲线,比如在绘制图表、游戏轨迹或者UI动画时。本教程将聚焦于如何使用贝塞尔曲线(Bezier Curve)通过若干个控制点来实现这一目标。贝塞尔曲线是一种在图形设计...

    android曲线图的绘制

    在Android开发中,有时我们需要创建动态的、可定制的曲线图来展示数据,这通常涉及到自定义View的绘制。这个“android曲线图的绘制”是一个关于如何在Android平台上实现曲线图表的小型示例项目。该项目可能包含了一...

    Android应用源码之安卓画曲线图代码.zip

    在Android开发中,绘制曲线图是一项常见的任务,特别是在制作数据可视化应用、游戏或者任何需要图形表示的场景。这个"Android应用源码之安卓画曲线图代码.zip"压缩包很可能是包含了一个示例项目,用于展示如何在...

    Android自定义View-画直线、折线拖动点可移动demo

    Android自定义View,实现画直线、折现,拖动点可以随意移动位置。实现横竖屏切换时,坐标根据分辨率进行转换。

    Android动态绘制曲线.rar

    在Android开发中,动态绘制曲线是一项常见的需求,例如在健康监测、数据分析或者游戏中的路径追踪等场景。"Android动态绘制曲线.rar"这个压缩包提供的资源是关于如何在Android应用中实现动态、实时更新的曲线图的...

    android自定义折线图曲线图

    在Android开发中,自定义视图是实现特定图形或交互效果的重要手段,而自定义折线图和曲线图则是数据可视化中的常见需求。本篇将深入探讨如何在Android环境中实现这两种图表。 首先,我们需要理解折线图和曲线图的...

    Android-贝塞尔曲线窗帘效果

    贝塞尔曲线窗帘效果(BezierCurtainEffect)模仿了现实中窗帘拉开或合上的动态过程,通过平滑的曲线轨迹展示窗帘的移动。在Android中,这个效果可以通过自定义视图(Custom View)实现,具体来说,我们可以创建一个...

    Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)

    9. **曲线(Curve)**:在Android中,曲线通常通过Path对象配合`canvas.drawPath()`来实现,Path可以添加各种曲线命令,如bezier曲线、quadratic曲线等。 10. **圆角矩形(Rounded Rectangle)**:`canvas....

    Android实时动态曲线实例

    在Android开发中,实时动态曲线的实现是一项常见且重要的任务,尤其在数据分析、监控系统或者游戏性能测试等场景中。本实例"Android实时动态曲线"着重于如何在Android应用中展示随着时间变化的数据,并以动态曲线的...

    Android利用贝塞尔曲线实现点赞效果

    首先,我们需要计算出贝塞尔曲线的各个点,可以借助数学公式或者Android提供的Path类中的quadTo()或cubicTo()方法。quadTo()用于绘制二阶贝塞尔曲线,cubicTo()用于绘制三阶贝塞尔曲线。 接下来,我们创建一个...

Global site tag (gtag.js) - Google Analytics