四. View的动画效果

不忘初心 砥砺前行, Tomorrow Is Another Day !

相关文章

本文概要:

  1. 基本使用方式意事项
  2. 复合型动画使用方式

前言

android动画分为View动画和属性动画,View动画又包括补间动画和逐帧动画.由于现在View动画基本上很少运用,使用也比较简单这里就不在讲述.

一. 基本使用方式

1.1 方式一: ViewPropertyAnimator

示例代码

view.animate()
                .translationX(Utils.dpToPixel(200))
                .translationY(100)
                .rotation(180)
                .alpha(0.5f)
                .setStartDelay(1000)
                .start();
复制代码

此方式只适合系统定义的属性如translationX,translationY等等来快速使用属性动画,如果需要一些自定义类型采取方式二.

1.2 方式二: ValueAnimator与ObjectAnimator

原理:

  1. ValueAnimator.ofInt()/float/object/PropertyValuesHolder(定义动画数字区间)
  2. 插值器(随着时间的流逝,返回当前动画完成度进度fraction)
  3. 估值器(返回具体数值)
  4. 回调onAnimationUpdate

  1. ObjectAnimator.ofInt()/float/object/ofPropertyValuesHolder(定义动画对象及数字区间)
  2. 插值器(返回当前动画完成度进度fraction)
  3. 估值器(返回具体数值)
  4. 拼接"set"+传入的PropertyName反射回调set方法.

  • 注意事项:
  1. 构造传入的类型要和估值器返回的类型一致。
    • 当传入类型是特殊类型时,采用ofObject,并且需要自定义TypeEvaluator估计器.
  2. ObjectAnimator中需要提供get(可选)/set(必须)方法.

示例代码

ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 400);
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                int curValue = (int) animation.getAnimatedValue();
                Log.d(TAG, "onAnimationUpdate: " + curValue);
            }
        });
        valueAnimator.setDuration(2000);
        valueAnimator.setEvaluator(new IntEvaluator());
        valueAnimator.setInterpolator(new LinearInterpolator());
        valueAnimator.start();
        
ObjectAnimator objectAnimator = ObjectAnimator.ofInt("控件对象",
                "属性名",0,400);
        objectAnimator.setDuration(2000);
        objectAnimator.setEvaluator(new IntEvaluator());
        objectAnimator.setInterpolator(new LinearInterpolator());
        objectAnimator.start();
复制代码

二. 复合型动画使用方式

2.1 PropertyValuesHolder与Keyframe

当同一控件多个属性,可以实现多个动画的播放时,也可以采取如下方式.

  • PropertyValuesHolder.ofInt()/float/object/Keyframe:
    相当于对参数属性名进行封装保存.
  • Keyframe.ofInt()/float/object:
    实现每一帧的速率(值),至少要设置两帧.
2.2 AnimatorSet与AnimatorSet.builder
  • playTogether和playSequentially.只负责定时激活控件动画.

  • play.with.after.before.自由排列动画顺序.

  • 当AnimatorSet所设置的函数与单个动画所设置冲突时,就以AnimatorSet设置为准。

    • 唯一的例外就是setStartDelay。

AnimatorSet真正激活延时=AnimatorSet.startDelay(延长AnimatorSet的激活时间)+第一个动画.startDelay

三. 布局动画相关

  • layoutAnimation与gridLayoutAnimation :在api 1引入
  • animateLayoutChanges(使用系统默认动画)与LayoutTransaction(自定义动画) :在api 11就引入

由于本人技术有限,如有错误的地方,麻烦大家给我提出来,本人不胜感激,大家一起学习进步.

参考链接:

猜你喜欢

转载自juejin.im/post/5c7259be6fb9a049d748520f
今日推荐