关于阅读器翻页动画的实现,有大把的开源项目可以借鉴,但基本都是基于canvas 2D动画,利用缓存bitmap来处理。绘制需要完全手动绘制。有很多优秀的ios 阅读产品,都可以在阅读页插入翻页视频,以及几大ADDSP的广告sdk顺滑接入,炫酷之余很有产品价值。反观android,目前还没找到同样优秀的产品,苦于没有借鉴思路。随不知活路,却已知死路。bitmap+canvas的手动绘制 局限性太大,展现形态未能解耦,内容无法对外扩充。这对于接入pdf,epub等格式的拓展非常困难。

反过来想想,使用缓存bitmap+canvas最主要的就是目的就是解决缓存翻页与动画的实现,而并非是要处理页面展现的。基于单个页面解耦的目的,缓存机制可以使用 RecyclerView,动画部分就借助 LayoutManager。

恶补了一波RecyclerView与LayoutManager机制与原理,这里不赘述了。

核心思路:利用LayoutManager将itemView 摆放成Z轴的ABC三层,而不是左,中,右水平摆放,再根据滑动手势处理view状态产生动画。

提前需要考虑的问题:事件穿透,滑动冲突,无缝切换动画,引入openGL实现curl仿真翻页动画的坑。

在下手之前,感觉比较费劲,但是一步步探索实现后,回头再看并不复杂,只是要注意的细节比较多。

目前效果

  • 垂直翻页

  • 覆盖滑动

  • 横向滚动

  • 仿真卷曲动画 :取消翻页时,页面会错乱

垂直翻页 和 覆盖滑动 动画实现思路:自定义LayoutManger,处理滑动及itemView显示位置,根据滑动方向将下一个或上一个itemView提前固定作为准备展示的页,利用scale 控制将进入屏幕的itemView显示状态,利用Rotation 实现翻转效果,利用viewZ轴层级准确提供页面层级,利用阴影增加上下页的立体视觉。

核心代码:

if (bookFilpMode == MODE_HORIZATIONAL_SLIDE || bookFilpMode == MODE_FILP) {//view 复用时 需要重制属性if (itemIndex + 1 <= fastVisiPos) {//计算下一个viewView nextView = recycler.getViewForPosition(itemIndex + 1);nextView.setScaleX(1f);nextView.setScaleY(1f);nextView.setTranslationX(0);nextView.setRotationY(0f);if (itemIndex <= focusPosition) {addView(nextView);} else {addView(nextView, 0);}if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {nextView.setElevation(-1);}measureChildWithMargins(nextView, 0, 0);int nl, nr;nl = 0;nr = nl + getDecoratedMeasurementHorizontal(nextView);layoutDecoratedWithMargins(nextView, nl, 0, nr, bottom);}}if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {itemView.setElevation(0);}layoutDecoratedWithMargins(itemView, left, top, right, bottom);if (bookFilpMode == MODE_HORIZATIONAL_SLIDE) {itemView.setTranslationX(dx);final int childCenterX = (right + left) / 2;final int parentCenterX = getWidth() / 2;boolean isChildLayoutLeft = childCenterX <= parentCenterX;if (isChildLayoutLeft) {itemView.setScaleX(1f);itemView.setScaleY(1f);} else {itemView.setTranslationX(0);itemView.setScaleX(0);itemView.setScaleY(0);}} else if (bookFilpMode == MODE_FILP) {final int childCenterX = (right + left) / 2;final int parentCenterX = getWidth() / 2;boolean isChildLayoutLeft = childCenterX <= parentCenterX;if (!isChildLayoutLeft) {//隐藏屏幕外的itemView.setTranslationX(0);itemView.setScaleX(0);itemView.setScaleY(0);}else {itemView.setScaleX(1F);itemView.setScaleY(1F);}float offset = (horizontalOffset * 1.0f) % (childWidth * 1.0f);float rataitonY = Math.abs(offset / childWidth * 90);itemView.setTranslationX(offset);//一边沿着Y轴旋转一边调整位置itemView.setCameraDistance(-50000);//无限拉近相机焦点itemView.setPivotX(0);itemView.setRotationY(-rataitonY);//沿着Y 反转}else {itemView.setTranslationX(dx);itemView.setScaleX(1f);itemView.setScaleY(1f);itemView.setRotationY(0f);}

仿真卷曲动画实现思路:使用开源库pagecurl的卷曲动画,在Layoutmanger中提前准备好Itemview的缓存bitmap,或者直接使用RecyclerView的缓存bitmap,并提供给curlView。

核心代码:

 @Overridepublic int getPageCount() {return adapter.getItemCount();}@Overridepublic void updatePage(CurlPage page, int width, int height, int index) {int lastIndex = curlLayoutManger.getSelectIndex();RBLog.log("updatePage index=%s lastIndex=%s", index, lastIndex);Message message = handler.obtainMessage();message.arg1 = index;handler.sendMessage(message);recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);recyclerView.setDrawingCacheEnabled(true);recyclerView.buildDrawingCache();Bitmap bitmap = recyclerView.getDrawingCache().copy(Bitmap.Config.RGB_565, false);recyclerView.setDrawingCacheEnabled(false);recyclerView.destroyDrawingCache();
//                Bitmap front = curlLayoutManger.getItemBitmap().copy(Bitmap.Config.RGB_565,false);page.setTexture(bitmap, CurlPage.SIDE_BOTH);page.setColor(Color.rgb(0xFF, 0xFF, 0xFF), CurlPage.SIDE_BACK);}}

pagecur的引入,十分尴尬。这是我个人能找到最好接入的curl opengl绘制代码。但有一个非常核心的问题,GLSuacefaceView 它不是来自ViewGroup而是View。1.不能与RecyclerView共享同一个事件传递树,2.只能播放View的bitmap 而不是view本身,导致需要提前准备好bitmap。也就是会出现上面动画中,翻页显示错乱的情况,实践了一些思路 都不理想。

如果读到此篇的你有兴趣的话,可以评论交流提供意见或者直击源码https://github.com/HarkBen/ReadAnim

作者:可米西
链接:https://www.jianshu.com/p/1992d49e5fbf

关注我获取更多知识或者投稿

LayoutManager实现翻页动画相关推荐

  1. 6个超炫酷的HTML5电子书翻页动画【转】

    6个超炫酷的HTML5电子书翻页动画 WebGL 演示网址:http://bookcase.chromeexperiments.com 相信大家一定遇到过一些电子书网站,我们可以通过像看书一样翻页来浏 ...

  2. Android开发笔记(十八)书籍翻页动画PageAnimation

    前面几节的动画都算简单,本文就介绍一个复杂点的动画--书籍翻页动画.Android有自带的翻页动画ViewPager,不过ViewPager只实现了平移效果.即便使用补间组合动画或者属性动画,也只是把 ...

  3. jQuery仿真翻书炫酷翻页动画插件

    下载地址booklet的一款jQuery仿真杂志翻页动画插件,看起来很炫酷的翻书效果. dd:

  4. html5 3d翻页,HTML5 3D书本翻页动画

    这是一款十分炫酷的HTML5 3D书本翻页动画,效果相对比较简单,拖拽鼠标模拟用手翻页,更漂亮的是翻页过程中,呈现出逼真的3D立体效果.书本中的文字和图片也会3D展示,非常酷. HTML代码 Lore ...

  5. h5制作app,处理跳转翻页动画效果及android返回键路由跳转问题

    在h5制作的app中,设计路由跳转及跳转翻页动画是最必要的.其中有很多需要注意的问题,分享下小编的处理方式~ 一.翻页效果 首先,跳转翻页动画的监控,因为小编是用vue学的,所以在app.vue中监控 ...

  6. HTML5 3D书本翻页动画

    这是一款十分炫酷的HTML5 3D书本翻页动画,效果相对比较简单,拖拽鼠标模拟用手翻页,更漂亮的是翻页过程中,呈现出逼真的3D立体效果.书本中的文字和图片也会3D展示,非常酷. HTML代码 < ...

  7. css 右上角 翻开动画_6个超炫酷的HTML5电子书翻页动画

    相信大家一定遇到过一些电子书网站,我们可以通过像看书一样翻页来浏览电子书的内容.今天我们要分享的HTML5应用跟电子书翻页有关,我们精选出来的6个电子书翻页动画都非常炫酷,而且都提供源码下载,有需要的 ...

  8. swiper-页面的翻页动画--渐变效果

    这次内容我们介绍在swiper页面的翻页动画--渐变效果 既然有翻页,那么肯定少不了翻页效果,这个功能在swiper当中也给我们进行了包装,所以我们在使用的时候变得非常的方便. 首先进行基本的布局以及 ...

  9. UE4 Material 101学习笔记——01-07 介绍/PBR基础/UV扭曲/数据类型/翻页动画/材质混合/性能优化

    UE4 Material 101学习笔记--01-07 介绍/PBR基础/UV扭曲/数据类型/翻页动画/材质混合/性能优化 Lec 01 什么是着色器 What Is A Shader? 1.1 介绍 ...

  10. android 仿真翻页动画,Android 两Activity之间动画效果(1)---------翻页效果

    用Android rotate动画实现翻页效果,效果如图: 要实现上面动画,首先搞明白rotate动画原理: (1)Degrees坐标: 0度(360度) 270度 90度  顺时针旋转 180 (2 ...

最新文章

  1. 数据结构第一次作业——抽象数据类型
  2. 贪心,POJ(2709)
  3. 发送请求_发送soap请求调用WSDL
  4. php 两个类 相互调用_如何在 PHP 和 Laravel 中使用 Traits
  5. UI设计配色专辑,设计师应用技巧
  6. 《Entity Framework 6 Recipes》中文翻译系列 (45) ------ 第八章 POCO之获取原始对象与手工同步对象图和变化跟踪器...
  7. 一张图看透办公网安全
  8. 软考/软件设计师资料真题/软件设计师教程
  9. HTC V版M7解锁刷机笔记
  10. 大三了,我真的好迷茫
  11. 苹果5越狱教程_苹果新越狱工具发布,支持iOS 13最新版,详细安装教程看这里...
  12. 联想集团:2021/22财年第一季度业绩
  13. 应用MIME将ZPT内容输出为excel文件(word文件)
  14. 这套Github上40K+star面试笔记,可以帮你搞定95%以上的Java面试
  15. 常用创建空对象创建对象方法var obj = {};其他几种方法你知道吗
  16. 怎么查找iphone测试的软件,iphone怎么测试跑分 iphone跑分软件使用教程
  17. 微信小程序getuserinfo废弃
  18. bzoj1208【HNOI2004】宠物收养所
  19. putty使用方法~SSH等
  20. Go 1.19.3 select原理简析

热门文章

  1. C语言可变参数va_list
  2. LiveNVR安防监控直播中无插件web直播方案中实现快照抓取的功能
  3. 百度地图定位到了非洲的问题
  4. 图神经网络(10)- knowledge graph(知识图谱)
  5. android朋友圈动态视频,Android实现微信朋友圈图片和视频播放
  6. 生鲜电商之百果园的未来
  7. CTGU 2021春-MySQL数据库实验2:基本查询3-4关,共7小题全代码+信息表+通关截图!
  8. Recurrent Feature Reasoning for Image Inpainting解读
  9. SkyWalking分布式系统应用程序性能监控工具-中
  10. 【重磅】Libra Credit 和Uphold 达成战略合作