Flutter手势&绘制模拟纸质书籍翻页今天继续探索绘制与手势的组合实践,之前在看电子书切换页面时会有一个模拟手翻页

大家可以找本书翻页到一半看下效果,从右下角翻到一半时,我们可以将可视区域分为下图A、B、C三部分区域。

a点和f已知,连接af,我们令g点为af的中点,过g点连接eh垂直af,为af中垂线,可得g=Point((a.x+f.x)/2,(a.y+f.y)/2);

并且知道△egf、△emg、△mfg为三个直角三角形,由直角三角形相似原理可知这三个三角型两两相似,所以,△emg相似△mfg,可知:em/gm=gm/mf;em=gm*gm/mf;因为:gm=f.y-g.y;mf=f.x-g.x;可得e=Point(g.x-(pow(f.y-g.y,2)/(f.x-g.x)),f.y);

同理过g点做fh垂直线可得h点坐标。略...

从上方理论图可知,cdb是一条二阶贝塞尔曲线,控制点为e点,ab和ak为直线线段,接下来我们令n为ag的中点,同理过n点垂直于af连接cj,可知ce等于ef的一半;(可以画辅助线过gf中点垂直af得出)。所以可得c=Point(e.x-(f.x-e.x)/2,f.y);j点坐标同理。略...

接下来我们看下b点,目前我们已知a、e、c、j点坐标,现在b点就是ae和cj的相交点。

那么问题来了:用我们九年义务教育学的数学知识解决以下两个问题。

1、在坐标系中,已知两点(x1,y1)、(x2,y2)坐标,求过这两点直线函数?

2、已知两条直线函数求两条直线的相交点?

我们知道直线函数表达式为:y=kx+b;,假设k为正常值,我们可求得k和b的值,

k相同b不同:平行无交点。k相同b相同:重合。k不同无论b相不相同,相交必有一交点。

那么就可得出b点坐标:(假设k永不相等)

b=Point((b2-b1)/(k1-k2),(b2-b1)/(k1-k2)*k1+b1);k点坐标同理。略...

以上AB区域的关键点已经全部得到了,我们将辅助线去掉将这些点连接起来看下效果。

得到AB区域的同时,我们间接的就得到了C区域,

//mPath为书籍矩形区域PathmPathC=Path.combine(PathOperation.reverseDifference,mPathAB,mPath);接下来将AB区域进行区分,再回到上方,坐标图黄色线条部分,我们可以看到d点和i点坐标。通过原理解析我们可知d点为pe的中点,而p点为cb的中点,那么就可以得出:p.x=(c.x+b.x)/2;,d.x=(p.x+e.x)/2;p.y=(c.y+b.y)/2;,d.y=(p.y+e.y)/2;

同理通过路径联合我们就可以将AB区域进行分开,

PathmPath1=Path();mPath1.moveTo(p.value.d.x,p.value.d.y);mPath1.lineTo(p.value.a.x,p.value.a.y);mPath1.lineTo(p.value.i.x,p.value.i.y);mPath1.close();PathmPathB=Path.combine(PathOperation.intersect,mPathAB,mPath1);得到以下图形,

到这里梳理一下,目前我们A、B、C三个path路径区域已经全部得到,剩下的就是填充书籍颜色,接下来我们将画笔设置为填充不同颜色,通过手势不断变化a点坐标看下效果。

是不是有点翻书的意思了,这里有一个问题,书籍的左下角也就是c点坐标在我们翻页的过程中会跑到页面之外,一般书籍都是左侧装订,这里我们希望达到一个真实的翻页效果就需要将c点的x轴最小值设置为书籍最左侧0。

从而得到,fb1=fb*fc1/fc;,

已知:fb=f.x-a.x;fc1=size.width;fc=f.x-c.x;

同理fd1/fd=fb1/fb;得到,fd1=fb1*fd/fb;即可得到a1点坐标。

计算代码:

doublefc=f.x-cx;doublefa=f.x-a.x;doublebb1=size.width*fa/fc;doublefd1=f.y-a.y;doublefd=bb1*fd1/fa;a1=Point(f.x-bb1,f.y-fd);这时候我们再来看下效果,

c点坐标被我们设定最小值为书籍最左侧,所以左侧不会被翻出区域,看起来更像真实的翻页效果。

我们可以在灯光下找本书翻页看下阴影效果,差不多是这个样子,这里我将阴影分为三个部分,A区域两个和C区域一个。

我们先添加A左区域的阴影,A左区域的阴影可以认为是从ha方向由h向a进行色值渐变,所以这里我们需要得到A左阴影区域左上角坐标点,也就是ha直线向外延伸固定数值的坐标。

已知ha直线方程式和a点坐标,以a为圆心,画半径为r(r>0)的圆,

求:此圆和ha直线的相交的坐标。

设交点为坐标xy,可得x2+y2=r2;y=kx+b;(k、b、r)已知,最终我们得到一个一元二次方程。会解出两个坐标点,这里我们只需要往外延伸的坐标点就行,具体可以跟a点坐标判断得出,之后我们令doublem1=a.x-p1.x;doublen1=a.y-p1.y;

那么阴影外部曲线就可以用下方代码表示。

这里我设置了由black26,向透明渐变。延伸长度为10的效果,这里可以根据半径和色值调整影深。

A右同理,略...

接下来我们绘制C区域的阴影,C区域可以看到他是跟eh是平行的,那么我们连接c、j、h、e点,

继续与AB区域进行路径联合,

Pathp1=Path.combine(PathOperation.intersect,pr,mPathAB);得到下面效果:

继续与B区域再次联合,

Pathp2=Path.combine(PathOperation.difference,p1,mPathB);最终得到我们想要的阴影区域。

接下来就是跟A区域操作一样了,设置线性渐变色和渐变方向,这里渐变方向的坐标点我们为u点和g点,g点已知,主要求u点坐标,u点坐标为af和di直线的相交点。

通过两条直线方程求相交点,得到u点以后,设置渐变色和渐变方向。

核心代码:

//右下Pathpc=Path();pc.moveTo(p.value.c.x,p.value.c.y);pc.lineTo(p.value.j.x,p.value.j.y);pc.lineTo(p.value.h.x,p.value.h.y);pc.lineTo(p.value.e.x,p.value.e.y);pc.close();Pathp1=Path.combine(PathOperation.intersect,pc,mPathA);Pathp2=Path.combine(PathOperation.difference,p1,mPathB);Offsetu=Offset(PaperPoint.toTwoPoint(p.value.a,p.value.f,p.value.d,p.value.i).x,PaperPoint.toTwoPoint(p.value.a,p.value.f,p.value.d,p.value.i).y);canvas.drawPath(p2,paint..style=PaintingStyle.fill..shader=ui.Gradient.linear(u,Offset(p.value.g.x,p.value.g.y),[Colors.black26,Colors.transparent]));最后得到我们最终的效果。

目的:我们希望可以滑动过程中页码可以自动翻过去,并且误触的情况下不要翻页。

这里我简单的判断当翻过去书籍宽度的3/1就理解为用户想翻页,当手势松开时自动翻过去;当翻过去书籍宽度小于1/3,理解为用户误触并不想翻页,当手势松开自动回弹回去。

初始化动画

回弹动画,我们希望松开手指时,a点坐标回到和f点重合,这里我们需要在点击或移动的过程中保存当前手指触摸的坐标a,

最后一步,填充内容,模拟书籍嘛,当然不能是这些纯色翻页了,上面我们有了ABC三个路径的区域,接下来就需要对书籍内容Widget进行裁剪,这里我们需要路径裁剪类ClipPath类,

ok,有了方法,接下来我们开始实现,首先我们将之前A区域的Path路径拿出来,裁剪当前页,通过Stack帧布局加载当前页和下一页内容,下一页内容永远在第一页内容下面,当翻过去动画结束时将下方页置位当前页,刷新第二页数据。

翻页动画结束当前页index+1;

if(status==AnimationStatus.completed){if(!isNext){setState((){currentIndex++;});}}填充内容布局代码:

上面只有翻页,没有返回上一页,其实返回上一页也很简单,上面我们实现了回弹动画,这里只需要修改当前a点坐标为为书籍左侧外面,之后调用回弹动画,当前页面-1即可。非常简单。

ElevatedButton(onPressed:(){setState((){//表示从页面左侧外面开始回弹currentA=Point(-100,size.height-100);currentIndex--;//回弹动画isNext=false;});//_p.value=PaperPoint(currentA,size);_controller.forward(from:0,);},child:Text("上一页"))下面再看下最终效果:

这里示例只是简单的填充了一个Text文本,更多内容也是可以的,毕竟裁剪的是个Widget。

THE END
1.电子书与纸质书当下,电子信息技术、互联网技术发展迅猛,随之而来的电子书也走进寻常百姓家,逐步得到了人们的认可,电子书和纸质书孰优孰劣也成为大家讨论的热点话题。 随着电子技术的发展,电子书成为阅读市场的新宠儿,与纸质书相比,电子书具有诸多优势:内容更新速度快、信息量大、易搜索; 载体通常小巧轻便,易于携带和保存; 信息传递http://journal.crnews.net/nmwz/2017n/d10q/shgj/920009_20171010032750.html
2.浅谈读者读书及电子书和纸质书(但是还有书籍第二季)剧评浅谈读者、读书及电子书和纸质书 这篇剧评可能有剧透 最近看了伍尔夫的《普通读者》,里面约翰逊博士的一句话“能与普通读者的意见不谋而合,在我是高兴的事;因为,在决定诗歌荣誉的权利时,尽管高雅的敏感和学术的教条也起着作用,但一般来说应该根据那未受文学偏见污损的普通读者的尝识。”这句话把普通读者的素质https://movie.douban.com/review/14336761/
3.纸质书与电子书:取代还是并存?—新闻—科学网因选修课老师要求,奚砚昆在美国买过艺术类书籍,“很贵”。所以他的同学会买二手书或者借阅,还有通过各种渠道找电子书打印出来。 小马也说到价格问题,她的一位同学正在读《二十四史》的电子版,因为纸质书价格太高。 知乎上一位“95后”媒体人提到另一个问题,电子书阅读偶尔会分心,被切断成平均少于15分钟时间碎https://news.sciencenet.cn/htmlnews/2017/4/374898.shtm
4.你觉着阅读电子书和纸质书效果一样吗?但是我以前一直试图证明纸质书最好,最适合阅读,无论读什么书都应该看纸质版…https://wen.woshipm.com/question/detail/5ktfq8.html
5.信息视图:纸质书与电子书对比互联网数据资讯网信息视图:纸质书与电子书对比 前不久,有一场关于传统书籍与电子书的火热讨论,自然,二者不可相互替代。本幅信息图总结了传统纸质书籍与电子书的优缺点。随着电子书的发展,它逐渐进入教育、科研、金融等领域。你更喜欢电子书还是传统纸质书籍呢? via:图说https://www.199it.com/archives/45619.html
6.电子书与纸质书议论文800字高一问:纸书阅读与电子书作文800字 答:乎每一页都有自己的心得笔记,一看就能够立马活生生的再现。两者一比较,才发现还是选择纸质书,才真正说得上开卷有益。不知大家是否也有同感,用互联网我们确实可以汲取很多的信息,但是正因为信息过多,而杂乱的扭在一起,就像是扭面条一样,一团乱麻,理不出个头绪,等到要用时反倒https://www.igaichong.com/article/a7ea0dafdc0eb8f41b3853e3.html
7.纸质书电子书有声并驾齐驱:2020年中国图书市场研究2020年电子书畅销榜TOP10中,投资管理及励志占3席,小说类书籍占3席,计算机类占2席。 其中《价值:我对投资的思考》荣登电子书畅销榜榜首;热播剧《沉默的真相》和《庆余年》则带火了原著电子书的销售,《长夜难明》位列第6,《庆余年》位列第10。 纸质书出版机构TOP10 https://36kr.com/p/1188567175244929
8.雅思大作文范文:纸质书和电子书,哪个更好出国留学简而言之,印刷书籍的成本相对较高,而环保、便携、双位的电子书无疑会阻碍印刷书籍的作用和功能。 以上就是“雅思大作文范文:纸质书和电子书,哪个更好”的详细介绍,如果还有其他相关问题需要了解,欢迎各位小伙伴热情咨询咱们中国教育在线的老师,预祝各位同学早日取得好成绩!https://www.eol.cn/waiyu/news/20230531144490.html
9.纸质书与电子书的优劣对比电子书能否取代纸质书→MAIGOO知识纸质书与电子书的优劣对比 电子书能否取代纸质书 摘要:书籍是人类进步的阶梯。阅读对于人们来说除了可以学习知识以外,还能够从中收获快乐,也是一种娱乐放松的方式。不过,随着人们的时间变得碎片化,安静下来阅读一本书似乎成为了一种奢望。年轻人的阅读更是从书本转移到了电子屏幕上。甚至有人预测,纸质书终将消亡。不过https://www.maigoo.com/goomai/98353.html
10.纸质书与电子书:哪一种在保护森林和碳减排方面更出色–书伴但是如果读者同时使用两种方式消费文学作品会怎样?“很多人仍想要读纸质书,即便他们读了一些电子书”,Amasawa 说。约 33% 的美国读者属于此类。 虽然电子书阅读器对普通读者具有环保意义,Amasawa 还是建议实体书狂热爱好者“购买你真正需要阅读的书籍”。并且当读完后回收它们。 https://bookfere.com/post/1091.html
11.“我们不一样”:纸质书和电子书画风迥异的畅销榜过去,我们仅凭内容就可以把纸质书和电子书稍作区分,纸质书偏重传统题材,电子书偏重网络文学等网上常见的题材,画风区别本就很大。而现在,越来越多的纸质书电子化,且有不少传统题材的书籍直接使用电子出版,电子书市场有了变化。随着读者对电子书的需求增多,加之传统出版社对数字出版的重视,未来会有更多图书选择电子书https://m.thepaper.cn/uc.jsp?contid=1966006
12.国内纸质双书号与电子书号之差异探析双书号是什么意思纸质书号:直接关联于传统的纸质出版物,即我们通常所说的书籍,它们以纸张为载体,通过印刷工艺制成,便于携带、阅读与保存。这种出版形式因其直观性、可触性而深受读者喜爱,尤其适合需要广泛传播、长期保存或作为正式文献资料的出版物。 电子书号:则主要依托电子媒介,特别是以光碟为主要载体形式。电子书号项下的出版物必https://blog.csdn.net/lunwen859036895/article/details/141423577
13.纸质书不可替代,电子书渐成潮流要闻首都之窗此外,从阅读心理上来说,电子书模仿纸质书,但不可能在形态上做到完全一致,这给人一种陌生、疏离和不真实的感觉,导致读者不自觉地缺乏读纸质书时的严肃和投入,影响深度阅读效果。阅读长难文本或重要书籍,需要调动人的深入理解与思考能力,纸质书或许是更好的选择。 https://www.beijing.gov.cn/renwen/zt/ydbj/yw/202007/t20200729_1964548.html
14.关于电子书和纸质书的调查报告.doc(二) 纸质书与电子书的选择情况 统计发现,有56%的同学选择经常电子书,偶尔选择纸质书的阅读方式。我们可以看出,纸质书作为传承人类文化的重要载体,其作用和地位在大学生生活和学习当中仍然占据着重要的地位。而作为后起之秀的电子书阅读方式所占的比例也不容小觑。我们还发现,同学们选择书籍的途径各不相同。其中中https://max.book118.com/html/2016/1225/77014358.shtm
15.纸质书籍和电子书谁更受消费者青睐随着信息时代的到来,越来越依赖于网络,渐渐忽视了实体,纸质书籍和电子书也成了读者的二选一。 *1. 您的性别: 男 女 *2. 您的年龄段: 18岁以下 18~25 26~30 31~40 41~50 51~60 60以上 *3. 您目前从事的行业: 请选择 *4. 您目前从事的职业: https://www.wjx.cn/jq/46407061.aspx
16.电子书会彻底取代纸质图书,让图书馆成为书籍博物馆吗?肯定不会的,作为一个重度阅读爱好者的我来说,我对纸质书籍有着特殊的情感,相信和我一样的伙伴也不少吧。曾经有一段时间,我在我们的一个作者群里聊天时就讨论过类似的问题,说的是大家看书时是喜欢电子书,还是纸质书,最终得到的回答是纸质书。尽管现在电子书有各类高科技产品、平台号、APP加持,想要看书时也确实https://weibo.com/p/2313474352322699440999/wenda_home
17.纸质书电子书作文(通用15篇)纸质书电子书作文(通用15篇) 在学习、工作或生活中,大家都经常接触到作文吧,借助作文可以宣泄心中的情感,调节自己的心情。那么你知道一篇好的作文该怎么写吗?以下是小编整理的纸质书电子书作文(通用15篇),欢迎大家借鉴与参考,希望对大家有所帮助。 纸质书电子书作文 1 https://mip.cnfla.com/zuowen/1523270.html
18.电子书与传统书籍作文(精选38篇)无论是身处学校还是步入社会,许多人都有过写作文的经历,对作文都不陌生吧,作文根据写作时限的不同可以分为限时作文和非限时作文。那么你有了解过作文吗?以下是小编为大家整理的电子书与传统书籍作文,欢迎阅读,希望大家能够喜欢。 电子书与传统书籍作文 篇1 教育https://www.ruiwen.com/zuowen/chuantong/1870715.html