「这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战」。
前言
从这一篇开始,总算脱离ListView的部分,开始专注于实现交互效果;
对于覆盖翻页、滑动翻页,现有的ListView本身就足以支持,唯一要处理的就是仿真翻页的翻页动画;
分析
对于仿真翻页,基础的实现方式可以参考这个系列的文章:
Android自定义View——从零开始实现书籍翻页效果(一)
不过呢,由于现在使用ListView而非canvas来实现,虽说从根本上还是canvas绘制,不过对于绘制方式和步骤肯定要做一些修改;例如:
原来使用用一个canvas来绘制上下两页的内容,现在是用ListView做的一个图层叠加,所以只关心最顶层那一页的处理即可;比如说在最顶层那页上挖出需要的空白区域,就是所需效果;
结合小米阅读的实现方式,由此简单分析下要做的部分(仅列举跟上面文章中实现的旧版方式不同的部分):
- 去除原来绘制下一层内容的部分,改为使用最顶层挖空区域用于显示下一层canvas的内容;
- 区分左右两种滑动方式,采用不同的翻页计算;
- 动画优化,原来的方式中,翻页的那一角到最后都是处于同一水平线上,这次让其自动回归到拖拽角那块
实现
在前面的那篇文章中,使用暴露index的方式来处理谁来绘制的问题;后来想了下,没必要那么麻烦;
因为自定义LayoutManager的实现,提供了暴露paint方法的地方,那么只要将这个仿真翻页效果集成到LayoutManager中,由LayoutManager处理或许更好,毕竟只要改firstChild即可;
回正题:
-
第一点 在之前的文中也已经实现,通过saveLayer的方式处理挖空的问题,虽说这种方式不推荐吧,但性能上好像没啥太大问题,至少肉眼没看出啥变化;
-
第二点 源自小米阅读的翻页效果:小米阅读的从左往右,和从右往左的翻页动画其实不是一个计算;从左往右的下一页的翻页动画是普通的以触摸点为顶点的计算方式;而从右往左的翻页动画,顶点和触摸点的关系……没太看出来……容我研究研究;
-
第三点 实现方式打算采用这种方式:当收到UP事件的时候,记录当前触摸点,后续由position.pixel变化而导致的绘制改变,则通过当前position的pixel位置和上一次触摸点的比例,结合触摸点跟拖拽角的位置,等比例计算;或许也可以让其提前到拖拽角高度?小米阅读好像这样的……动画太快也看不清楚……
结尾
现在先列个大纲,简单实现部分功能,来看看效果:
现在仅仅简单处理了下跟ListView的绑定链接,以及挖空区域的功能;剩下的阴影、翻起页效果、以及上面提到的部分,就是接下来要做的事了;