`
rayln
  • 浏览: 431337 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

android翻书效果实现原理( 贝塞尔曲线绘制原理/点坐标计算)

 
阅读更多
转载: http://www.open-open.com/lib/view/open1326265166952.html

实现真实的翻页效果,为了能在翻页的过程中看到下一页的内容,在翻页之前必须准备两张页面,一张是当前页,另一张是下一页。翻页的过程就是对这两张页面的剪切,组合过程。

用户看到的可以分为3部分:当前页的可见部分(下图绿色部分),把书页翻起来后看到的背面区域(下图黄色部分),把书页翻起来后看到的下一页的一角(下图绿色部分)。



假设我们已经求得了包含黄色区域和蓝色区域的Path, 假设为mPath0,那么绿色区域则可以使用

Canvas.clipPath(mPath0, Region.Op.XOR)来剪裁绘制;

而蓝色区域则可以通过使用(假设黄色区域的Path为mPath1)

Canvas.clipPath(mPath0);  

Canvas.clipPath(mPath1, Region.Op.DIFFERENCE); //绘制第一次不同于第二次的区域

下面我们来研究如何求取mPath0:

上图黄色和蓝色区域的mPath0,可以通过以下获取:

mPath0.moveTo(jx, jy);  

mPath0.quadTo(hx, hy, kx, ky);  

mPath0.lineTo(ax, ay);  

mPath0.lineTo(bx, by);  

mPath0.quadTo(ex, ey, cx,cy);     

mPath0.lineTo(fx, fy);  

mPath0.close(); 

接着就是要求出绘制path0所需的各个顶点。


我们已知的条件是:a点坐标(触摸点),f点坐标(显示界面的大小),直线eh是af的垂直平分线。

剩下的就变成数学问题啦~~

先来求出g点坐标因为g为af中点:

显然gx=(ax+fx)/2; gy=(ay+fy)/2;

e点坐标:

添加补助线gm,m点坐标为(gx, mHeight);

由相似垂直三角形egm和gmf可知:

em=gm*gm/mf;

这样e点坐标为:(gx-em, mHeight)

同理可以求出h点坐标。

C点坐标:

为简化计算,我们令n点为ag中点,这样有三角形cjf和ehf得:

cx=ex- ef/2 ;

c点坐标为:(ex- ef/2, mHeight)

同理求得j点坐标。

以下推导需要较多的数学知识,不记得的童鞋,自觉复习去~~

一条直线的函数为:

Y=ax+b;

通过已知两点求直线:  a = (y2-y1)/(x2-x1);

b = (x2*y1-y2*x1)/(x2-x1);

两条相交直线交点的坐标为:x= (b2-b1)/(a1-a2);

y=a1x+b1或者y=a2x+b2

综上,4点相交的直线的交点为:

x=( (x4*y3-y4*x3)/(x4-x3)-(x2*y1-y2*x1)/(x2-x1)) /

((y2-y1)/(x2-x1)- (y4-y3)/(x4-x3) )

= ( (x4*y3-y4*x3) (x2-x1)- (x2*y1-y2*x1) (x4-x3) ) /

( (y2-y1) (x4-x3)- (y4-y3) (x2-x1) )

将之前求得的 a,e,c,j四个点带入上式则可以求出 b. 同理可求k点。

d点坐标:

d为pe的中点,所以:

dx=((cx+bx)/2+ex)/2

dy=((cy+by)/2+ey)/2

同理 可求 i 点。
  • 大小: 30.3 KB
  • 大小: 31.6 KB
分享到:
评论
2 楼 Rubicon__ 2013-02-27  
你好,我在运用PageWidget这个类时,出现
第一页翻到第二页,动画过程没错。
翻完之后当前页回到第一页,大概是哪里的逻辑出错了?请教一下。
1 楼 yanjunhui2011 2012-07-24  
http://download.csdn.net/detail/yanjunhui2011/4405851
这里是DEMO下载地址。

相关推荐

    Android利用贝塞尔曲线实现翻书效果(适配AndroidX)

    综上所述,利用贝塞尔曲线实现Android翻书效果需要掌握曲线的绘制原理、Android绘图机制、动画系统以及版本适配知识。通过合理的设计和优化,我们可以创建出既美观又流畅的翻书动画,提升应用的用户体验。

    vc++实现贝塞尔曲线的绘制

    2. **坐标计算**:贝塞尔曲线的每个点可以通过贝塞尔公式计算得出,公式如下(对于三次贝塞尔曲线): ``` B(t) = (1 - t)^3 * P0 + 3 * (1 - t)^2 * t * P1 + 3 * (1 - t) * t^2 * P2 + t^3 * P3 ``` 其中,t...

    最简单的贝塞尔曲线绘制

    贝塞尔曲线(Bezier Curve)是计算机图形学中广泛使用的参数曲线,它在UI...通过深入理解贝塞尔曲线的数学原理和Android的图形绘制API,开发者可以进一步扩展这个示例,创建更复杂的图形效果,提升应用程序的用户体验。

    Qt 中实现任意阶贝塞尔曲线绘制 & 动态调节

    Qt 中有相当方便的绘制接口 ( 由 QPainter 提供 ) 。 例如贝塞尔曲线的 API: QPainterPath 的 quadTo() 和 ...因此,我想到利用贝塞尔的公式生成曲线点,然后用直线来连接,即可实现「 N阶贝塞尔曲线绘制 」。

    MFC实现贝塞尔曲线的绘制.zip

    在程序中,可以使用递归的De Casteljau算法来高效地计算曲线点。 7. **刷新画布**:当控制点改变时,需要调用Invalidate或InvalidateRect函数来标记需要重绘的区域,然后由Windows系统自动调用OnPaint更新图形。 8...

    Android贝塞尔曲线绘制心形

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

    swift-iOS贝塞尔曲线绘制图表

    Swift中的UIBezierPath是iOS应用开发中用于图形绘制的核心类,尤其在自定义视图或者进行动画效果时,贝塞尔曲线(Bezier Curve)是经常被用到的一种技术。贝塞尔曲线是一种数学上定义的平滑曲线,常用于图形设计、...

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

    在Android中,我们可以利用贝塞尔曲线来实现动态、流畅的动画效果,为用户界面增添视觉吸引力。 贝塞尔曲线由控制点定义,分为一阶、二阶、三阶乃至更高阶。在一阶贝塞尔曲线中,只有一个控制点;二阶贝塞尔曲线有...

    java android 贝塞尔曲线计算

    在给定的描述中提到,这个实现不限制曲线绘制的控制点数量,这意味着可能支持更高次的贝塞尔曲线或者使用了多个贝塞尔曲线段组合来模拟更多控制点的效果。 多线程计算在这里的作用是为了提高性能,避免因为复杂的...

    Android实现贝塞尔曲线

    贝塞尔曲线在计算机图形学中扮演着至关重要的角色,尤其在Android应用开发中,它可以用于创建平滑的动画效果、绘制复杂的图形以及设计用户界面。本文将深入探讨如何在Android平台上实现二阶和三阶贝塞尔曲线。 首先...

    Android贝塞尔曲线实现粘性动画

    "Android贝塞尔曲线实现粘性动画"这个主题就是关于如何利用贝塞尔曲线来制作具有粘性效果的动画,通常这种动画效果常见于如QQ未读消息提示等应用场景。下面将详细介绍贝塞尔曲线及其在Android中的应用。 **贝塞尔...

    BezierDemo_绘制贝塞尔曲线的工具_bezierdemo_

    2. **计算过程**:实现计算贝塞尔曲线的函数,接受四个控制点坐标和一个参数t,返回对应的曲线点坐标。 3. **图形渲染**:利用C#的图形库,如GDI+或DirectX,将计算出的各个t值对应的点连接起来,形成平滑的曲线。 4...

    visualization7_三次贝塞尔曲线的绘制_

    三次贝塞尔曲线是一种在计算机图形学中广泛应用的数学模型,常用于曲线的平滑插值和形状设计。本文将深入探讨三次贝塞尔曲线的...通过实践和调整控制点,开发者可以创建出各种复杂的曲线形状,从而实现丰富的视觉效果。

    QT绘制贝塞尔曲线及控制点

    为了绘制N阶贝塞尔曲线,我们需要处理多个控制点,并通过递归或者矩阵乘法的方法来计算出每个子曲线的参数。在QT中,这通常涉及对`QPainterPath`对象的多次操作,每次增加一个新的贝塞尔曲线段,直到最终形成完整的N...

    贝塞尔曲线/图片处理/动画

    贝塞尔曲线是计算机图形学中的一个重要概念,常用于...掌握贝塞尔曲线的绘制、图片的3D旋转、按钮触控范围的优化、进度表的实现以及富文本显示技术,将使开发者在创建高质量应用程序时拥有更多的设计自由度和创新空间。

    Android代码-通过贝塞尔曲线绘制出的魔炫背景

    这里采用的一种贝塞尔计算方法:WiKi:Bézier-求贝塞尔曲线控制点 具体相关 效果图 轮廓样式(contour_style) 效果(这里只是轮廓的样式,默认效果都是白色,这里显示的颜色是自己设置的) Sand(默认) ...

    C++三次贝塞尔曲线绘制源代码

    C++实现的三次贝塞尔曲线绘制,可拖动控制点修改曲线形状,包含源代码和可执行文件,VS2008的工程。 C++实现的三次贝塞尔曲线绘制,可拖动控制点修改曲线形状,包含源代码和可执行文件,VS2008的工程。

    Android贝塞尔曲线水纹波动效果、车辆监控效果

    本示例探讨了如何利用Android贝塞尔曲线来实现水纹波动效果和车辆监控效果,这两个功能通常用于增强应用程序的视觉体验和交互性。 首先,我们要理解贝塞尔曲线(Bezier Curve),这是一种在计算机图形学中广泛使用...

    应用QT和贝塞尔曲线绘制复杂曲线

    要绘制贝塞尔曲线,我们首先需要创建一个QPainterPath实例,然后调用其addBezierTo()方法,传入控制点和结束点的坐标。贝塞尔曲线有多种类型,包括线性贝塞尔(仅有一个控制点)、二次贝塞尔(两个控制点)和三次...

    贝塞尔曲线实现直播点赞效果

    例如,预计算一部分曲线点,减少运行时的计算量;或者使用缓存来避免重复计算。此外,如果设备性能有限,可以考虑降低帧率或简化图形细节。 总结来说,贝塞尔曲线在直播点赞效果的实现中起到关键作用,它提供了一种...

Global site tag (gtag.js) - Google Analytics