前言
动画有多么重要,相信大家都清楚。它可以让一个枯燥乏味的静态界面变成一个充满动力的动画世界,提高用户体验。反正现在都是用户体验至上。android也是前端。苦逼的大前端。想想之前刚毕业的时候搞javaWeb,那个时候感觉前端好low。。现在不这么认为了。
废话不多少。直接上效果图
主要就是中间那部分的动画效果。
理解Android中动画实现的本质
在理解Android中动画实现的本质之前,首先要理解动画实现的原理,估计这个大家都清楚。
如果要在Android中实现动画展示,那么就必须要有一个“动画驱动”每隔1/24秒去调用View的draw()方法,同时改变每一帧中View需要变化的元素,让这个View不断的绘制,这样一来,所有变化就是组合成一个流畅的动画。
上面就是“Android中动画实现的本质”,其关键就是要有一个“动画驱动”。回想下我们平时最常用的动画类Animation或者Animator,其实它们内部实现也是一个“动画驱动”,驱动View不断绘制。所以,我们完全可以不用Animation或者Animator去做动画,只要有一个“驱动”即可,例如Scroller是个不错的选择,甚至我们可以写一个我们自己实现的“动画驱动”。
常用的“动画驱动”
View 本身
view本身的onDraw()马上会触发下一次绘制。
class MyView extends View { public void onDraw(Canvas canvas) { super.onDraw(canvas); invalidate(); } }
View动画,属性动画(Animation/Animator)
上面的部分就是使用属性动画.
Scroller
这个在刚开始的时候滑动主要就靠这个类。郭神的。医生的,还有爱哥的这些书中都有讲到。博客也有很多。它需要结合View的computeScroll()方法实现。
自己实现一个简易的“动画驱动”
既然有些需求用原有的方法难以实现或者实现起来不太合适,这个时候我们就需要自己动手了。因此,我也写了一个简易的“动画驱动”
自定义动画驱动
其实就是自己把 path 的那些 moveTo ,lineTo 这些方法封装了下。勿喷。
PathPoint类
/** * des:具体的路径集合 * author: marc * date: 2017/2/8 11:31 * email:aliali_ha@yeah.net */ public class PathPoint { //移动指令 public static final int MOVE = 0; //直线运动 public static final int LINE = 1; //贝塞尔曲线 public static final int CURVE = 2; //当前指令 int mOperation; float mX; float mY; float mControl0X, mControl1X;//2个拐点 float mControl0Y, mControl1Y; private PathPoint(int operation, float x, float y) { mOperation = operation; mX = x; mY = y; } private PathPoint(float c0x, float c0y, float c1x, float c1y, float x, float y) { mOperation = CURVE; //终点 mX = x; mY = y; mControl0X = c0x; mControl0Y = c0y; mControl1X = c1x; mControl1Y = c1y; } /** * 移动 * * @param x * @param y * @return */ public static PathPoint moveTo(floa