情诗网 >套路情话 > 正文

Android 动画套路

来源:情诗网    2021-02-08    分类:套路情话

类似于ViewPager的滑动效果

代码分析

源码地址

滑动流程

Scroller 类,处理时间和坐标点的辅助类,协助完成自行滑动时间段内滑动,加速减速效果。
它本身并不提供动画效果,只提供计算,动画效果是由View 自身的invalidate递归调用scrollBy实现的。

重点方法:
Scroller(Context context) 构造函数,默认的会初始化一个减速插值器-ViscousFluidInterpolator对象,显示加速滑动效果;
startScroll(int startX, int startY, int dx, int dy) 开始滑动计算
computeScrollOffset() 手动计算滑动偏移量,滑动位置会保存在Scroller对象中,滑动完成会返回false
getCurrX()/getCurrY() 获取计算所得的当前位置值,用于滑动
abortAnimation() ,结束计算

动画流程

View的滑动有一种特殊动画效果,那么系统本身的动画框架Animation怎么实现的呢?

原理:
如果动画没有结束,递归调用invalidate方法,不断触发页面的重绘,显示帧的切换
利用Interpolator做平滑时间流逝到非平滑时间过渡,造成加速减速效果
利用applyTransformation做矩阵变换,然后在View中canvas.concat(Matrix matrix)

以下是RotateAnimation的矩阵变化部分:


总结

Android 的动画运行在主线程中,都是通过invalidate方法循环调用触发
具体的单帧显示效果都是由View的canvas变换所得,所以说这些变动只是影响了显示效果,不影响layout和measure

热门文章