Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 562|回复: 0

Android 实现书籍翻页效果----原理篇-  Android学习

[复制链接]

该用户从未签到

发表于 2011-10-24 14:28:48 | 显示全部楼层 |阅读模式
之前看到像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)/2dy=((cy+by)/2+ey)/2同理 可求 i 点。     通过上述求解,绘制翻页效果的各个顶点均已得出,剩下的就是贴图,绘制阴影。这部分将在于后的文章中介绍,嘻嘻,喜欢研究的童鞋可以自己试试,懒人们,可以等等,明天整理好代码后贴出~~~
回复

使用道具 举报

该用户从未签到

发表于 2011-10-24 14:28:52 | 显示全部楼层

Re:Android

学习了。。老师
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-24 14:28:55 | 显示全部楼层

Re:Android

学习了!感谢共享~~~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 10:57 , Processed in 0.464567 second(s), 33 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表