之前看到像ipad上的ibook的模拟书籍翻页的特效感觉很炫,在android上也有像laputa和ireader等应用实现有这个特效,在网上搜索了一下好像也没有现成的例子,所以自己动手实现了一个,现在将实现的过程记录下来。

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

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

假设我们已经求得了包含黄色区域和蓝色区域的Path, 假设为mPath0,那么绿色区域则可以使用Canvas.clipPath(mPath0, Region.Op.XOR)来剪裁绘制;而蓝色区域则可以通过使用(假设黄色区域的Path为mPath1)

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

对clipPath不是很熟的童鞋可以去复习下 自带apidemo的Clipping例子。

下面我们来研究如何求取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 点。

通过上述求解,绘制翻页效果的各个顶点均已得出,剩下的就是贴图,绘制阴影。这部分将在于后的文章中介绍,嘻嘻,喜欢研究的童鞋可以自己试试,懒人们,可以等等,明天整理好代码后贴出~~~

原文地址:点击打开链接

Android 实现书籍翻页效果----原理篇相关推荐

  1. Android 实现书籍翻页效果----升级篇

    自从之前发布了<Android 实现书籍翻页效果----完结篇 >之后,收到了很多朋友给我留言,前段时间由于事情较多,博客写得太匆忙很多细节地方没有描述清楚.所以不少人对其中的地方有不少不 ...

  2. Android 实现书籍翻页效果----完结篇

    By 何明桂(http://blog.csdn.net/hmg25) 转载请注明出处 之前由于种种琐事,暂停了这个翻页效果的实现,终于在这周末完成了大部分功能,但是这里只是给出了一个基本的雏形,没有添 ...

  3. Android 实现书籍翻页效果---番外篇之光影效果

    By 何明桂(http://blog.csdn.net/hmg25) 转载请注明出处 对于之前发布的翻页效果的源码,由于写得太匆忙,注释讲解的不多,且本人文笔较差,至使很多人对其中的很多部分不是很清楚 ...

  4. Android翻页效果原理实现之翻页的尝试

    炮兵镇楼 在<自定义控件其实很简单>系列的前半部分中我们用了整整六节近两万字两百多张配图讲了Android图形的绘制,虽然篇幅很巨大但仍然只是图形绘制的冰山一角,旨在领大家入门,至于修行成 ...

  5. Android翻页效果原理实现之引入折线

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 尊重原创 ...

  6. Android viewpager2实现翻页效果

    为什么要实现翻页效果?减少用户的操作 viewpager2是基于recyclerview实现的,自带懒加载功能 viewpager2是对recyclerview的封装 要实现下面这个效果 viewpa ...

  7. Android ListView 滚动翻页效果

    http://blog.csdn.net/top_code/article/details/9629259

  8. android 模拟真书翻页效果的博客

    http://topic.csdn.net/u/20110422/20/5A405A2E-09B4-4665-A601-FBF38AE16A0F.html

  9. android翻页实现原理

    Android平台中的二种翻页效果实现. 第一种翻页效果如下: 实现原理: 当前手指触摸点为a,则 a点坐标为(ax,ay), 由三角形acb与三角形cmb为对称三角形并且直线cp为am垂直平分线,则 ...

最新文章

  1. linux内核自解压,Linux的初始内核自解压分析
  2. 服务器虚拟机怎么控制,虚拟机可以控制云服务器吗
  3. layui如何获取父节点的父节点_jquery获取父元素或父节点的方法
  4. C++类模板特化全总结
  5. java引用传递关键字_Java值传递和引用传递
  6. 如何进行I/O评估、监控、定位和优化?
  7. debug idea js_IntelliJ IDEA 配置chrome插件调试js代码 - 狂奔的熊二 - 博客园
  8. Html5中新增的表单元素详解
  9. longvalue_Java Short类longValue()方法及示例
  10. java 异常总结_Java异常的十大问题总结
  11. WinCE的USB驱动开发
  12. 星巴克——最单纯的SNS应用
  13. Flink系列之流式
  14. 从终端直接下载cuDNN
  15. Libcef源码下载与编译
  16. MySQL的函数——聚合函数、数学函数、字符串函数、日期函数
  17. java选填_java-选择填空题库
  18. 借款人到期不还钱,出借人能不能既要逾期利息又要违约金?
  19. 【EtherCAT分析】三、EtherCAT从站设备描述文件设计
  20. 跑步装备品牌排行榜,跑步爱好者必备好物推荐

热门文章

  1. 羊驼alpaca php,羊驼线(alpaca)简介
  2. Xcode10打包引起iOS9系统的用户启动App随机崩溃的问题修复记录
  3. c 语言 清华大学郑莉,c 语言程序设计郑莉清华大学答案
  4. 笔记本电脑免拆清灰的诸多方法,怎么不拆机清灰
  5. IEC 61131标准系列
  6. Lind.DDD.Messaging框架通讯组件介绍
  7. 线条边框简笔画图片大全_爱牙日手抄报 手抄报作业大全 模板边框设计
  8. Unarchiver解压缩2次问题修复
  9. nacos 配置Sentinel 熔断规则
  10. 吴裕雄--天生自然 诗经:长恨歌