前段时间公司任务中有实现仿windows正在加载loading动画。先看看需要实现的效果:

小圆点这些自定义都是比较容易的

主要是小点的运动速度,android中提供几种运动速度,显然是不能完成我们的需求

唯一的办法就是自定义插值器,Interpolator 

public class AlertInterpolator implements Interpolator
然后,它会提示你实现一个方法
@Overridepublic float getInterpolation(float input) {// TODO Auto-generated method stubfloat result;if (input <= 0.5) {result = (float) (Math.sin(Math.PI * input)) / 2;}  else {result = (float) (2 - Math.sin(Math.PI * input)) / 2;}return result;}
上面这个就是简单的 先减速在加速的插值器,但还是满足不了我们的需求

基于三次方贝塞尔曲线的插值器

在动画开发过程中,经常需要使用到插值器来满足我们的动画设计需求。然而,官方提供的插值器并不能满足所有的需求,所以我们需要自定义插值器。

下面介绍的三次方贝塞尔曲线的插值器,主要可用于实现连续曲线的动画。

关于贝塞尔曲线的介绍,请移步百度。

工具网站: cubic-bezier.com

使用教程:

  1. 拉拽左边图像的2个点,调整出符合效果的图形
  2. 点击右上角的Save按钮,将4个参数运用到下面的代码中。



2.代码运用

new EaseCubicInterpolator(0.31f, 0.85f,0.77f, 0.14f);

如上直接调用下面的差值器类,构造方法中的4个参数,即是从第一步的网站获得的数值。

/** * 缓动三次方曲线插值器.(基于三次方贝塞尔曲线) */public class EaseCubicInterpolator implements Interpolator {  private final static int ACCURACY = 4096;  private int mLastI = 0;  private final PointF mControlPoint1 = new PointF();  private final PointF mControlPoint2 = new PointF();  /**   * 设置中间两个控制点.
* 在线工具: http://cubic-bezier.com/
* * @param x1 * @param y1 * @param x2 * @param y2 */ public EaseCubicInterpolator(float x1, float y1, float x2, float y2) { mControlPoint1.x = x1; mControlPoint1.y = y1; mControlPoint2.x = x2; mControlPoint2.y = y2; } @Override public float getInterpolation(float input) { float t = input; // 近似求解t的值[0,1] for (int i = mLastI; i < ACCURACY; i++) { t = 1.0f * i / ACCURACY; double x = cubicCurves(t, 0, mControlPoint1.x, mControlPoint2.x, 1); if (x >= input) { mLastI = i; break; } } double value = cubicCurves(t, 0, mControlPoint1.y, mControlPoint2.y, 1); if (value > 0.999d) { value = 1; mLastI = 0; } return (float) value; } /** * 求三次贝塞尔曲线(四个控制点)一个点某个维度的值.
* 参考资料: http://devmag.org.za/2011/04/05/bzier-curves-a-tutorial/ * * @param t * 取值[0, 1] * @param value0 * @param value1 * @param value2 * @param value3 * @return */ public static double cubicCurves(double t, double value0, double value1, double value2, double value3) { double value; double u = 1 - t; double tt = t * t; double uu = u * u; double uuu = uu * u; double ttt = tt * t; value = uuu * value0; value += 3 * uu * t * value1; value += 3 * u * tt * value2; value += ttt * value3; return value; }}

这是loading动画中的难点,具体的运动速度需要自己去尝试才能找到最满意的效果。




更多相关文章

  1. 腾讯Bugly的使用
  2. android Spinner setSelection无效 总显示第一项
  3. Android开源项目总结
  4. 百度Android定位API使用指南
  5. [置顶] android Activity和service深入介绍
  6. Android(安卓)MediaPlayer 框架UML图
  7. layout_weight 学习笔记.
  8. Android中TabLayout切换选项背景和修改字体大小
  9. 第八章 Libgdx输入处理(9)菜单捕获

随机推荐

  1. Android动态获取存储权限
  2. android学习日志
  3. Android之——判断当前应用程序是否是用
  4. H5中利用canvas绘制video
  5. Android(安卓)SDK tools adb.exe下文件丢
  6. Android中ps命令各字段的含义
  7. TextView内容太长怎么办?
  8. android 开发中遇到的问题及解决方法
  9. android学习笔记---59_各种图形的使用介
  10. Android Map API key 申请