在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
分享到:
相关推荐
在Android开发中,贝塞尔曲线(Bézier Curve)是一种常用的技术,用于创建平滑、连续的曲线路径。贝塞尔曲线是由法国工程师皮埃尔·贝塞尔(Pierre Bézier)在1962年提出的,它在图形设计、计算机图形学以及动画...
本文将深入探讨如何在Android中创建自定义的直线箭头和曲线箭头,包括如何设置颜色,以及利用赛贝尔曲线和正切余弦函数计算箭头的方向。 首先,让我们了解Android自定义视图的基本步骤。创建一个新的Java类,继承自...
本篇文章将详细讲解如何利用Canvas在Android中画曲线图和三角形(多边形),并结合示例代码帮助理解。 首先,我们要明白Canvas的基本用法。Canvas是Android中的一个类,它提供了在Bitmap上绘制图形的方法。通常,...
通过分析这个应用的源代码,我们可以深入理解如何在Android平台上利用贝塞尔曲线实现动态路径动画,这对于制作复杂的UI过渡效果或游戏中的角色移动路径非常有用。 总的来说,这个demo展示了如何在Android中利用...
本项目"Android 属性动画使控件沿贝塞尔曲线移动"就利用了这一特性,实现了让控件沿着自定义的贝塞尔曲线轨迹平滑移动,并且允许开发者自定义动画的时长和运动幅度,同时还支持对移动的控件添加点击事件。...
总结来说,Android中的曲线动画是通过属性动画系统实现的,利用Path和ObjectAnimator可以创建出沿着预定义轨迹移动的动画效果。通过实践PathAnimationDemo,开发者可以掌握这一高级动画技术,从而为应用程序增添更多...
使用`Path`类画直线非常简单,通常通过`moveTo()`和`lineTo()`方法完成。`moveTo()`方法将路径移动到指定的坐标,而`lineTo()`方法则从当前点绘制一条直线到指定的坐标。 3. **画箭头**: 绘制箭头稍微复杂一些,...
在Android开发中,动画是提升用户体验的关键因素之一。"android动画循环移动"是一个关于如何在Android平台上实现元素连续、循环移动的示例。这个demo展示了如何利用Android的动画框架来创建平移效果,并让动画无缝地...
在Android中,`Path`类提供了`quadTo()`(二次贝塞尔曲线)和`cubicTo()`(三次贝塞尔曲线)方法来绘制这些曲线。 心形通常由两个相互连接的二次或三次贝塞尔曲线构成,每个曲线代表心形的一半。为了构建这样的心形...
在Android开发中,有时我们需要在屏幕上绘制出平滑的曲线,比如在绘制图表、游戏轨迹或者UI动画时。本教程将聚焦于如何使用贝塞尔曲线(Bezier Curve)通过若干个控制点来实现这一目标。贝塞尔曲线是一种在图形设计...
在Android开发中,有时我们需要创建动态的、可定制的曲线图来展示数据,这通常涉及到自定义View的绘制。这个“android曲线图的绘制”是一个关于如何在Android平台上实现曲线图表的小型示例项目。该项目可能包含了一...
在Android开发中,绘制曲线图是一项常见的任务,特别是在制作数据可视化应用、游戏或者任何需要图形表示的场景。这个"Android应用源码之安卓画曲线图代码.zip"压缩包很可能是包含了一个示例项目,用于展示如何在...
Android自定义View,实现画直线、折现,拖动点可以随意移动位置。实现横竖屏切换时,坐标根据分辨率进行转换。
在Android开发中,动态绘制曲线是一项常见的需求,例如在健康监测、数据分析或者游戏中的路径追踪等场景。"Android动态绘制曲线.rar"这个压缩包提供的资源是关于如何在Android应用中实现动态、实时更新的曲线图的...
在Android开发中,自定义视图是实现特定图形或交互效果的重要手段,而自定义折线图和曲线图则是数据可视化中的常见需求。本篇将深入探讨如何在Android环境中实现这两种图表。 首先,我们需要理解折线图和曲线图的...
贝塞尔曲线窗帘效果(BezierCurtainEffect)模仿了现实中窗帘拉开或合上的动态过程,通过平滑的曲线轨迹展示窗帘的移动。在Android中,这个效果可以通过自定义视图(Custom View)实现,具体来说,我们可以创建一个...
9. **曲线(Curve)**:在Android中,曲线通常通过Path对象配合`canvas.drawPath()`来实现,Path可以添加各种曲线命令,如bezier曲线、quadratic曲线等。 10. **圆角矩形(Rounded Rectangle)**:`canvas....
在Android开发中,实时动态曲线的实现是一项常见且重要的任务,尤其在数据分析、监控系统或者游戏性能测试等场景中。本实例"Android实时动态曲线"着重于如何在Android应用中展示随着时间变化的数据,并以动态曲线的...
首先,我们需要计算出贝塞尔曲线的各个点,可以借助数学公式或者Android提供的Path类中的quadTo()或cubicTo()方法。quadTo()用于绘制二阶贝塞尔曲线,cubicTo()用于绘制三阶贝塞尔曲线。 接下来,我们创建一个...