Android中动画效果的实现(总结)

Android中的动画分为以下三种:

(1)帧动画:本质是通过连续播放图片来实现动画效果。

(2)补间动画:设置动画开始,这是动画结束关键帧,中间过程由系统计算并补齐(针对于View组件进行四种动画改变)。

(3)属性动画:可以理解为“强化版补间动画”,可以针对于View组件的属性进行动画改变,可拓展性非常强。

接下来,分别进行说明:

一、帧动画

(1)在drawable中添加动画文件anim_progress.xml

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/loading_01" android:duration="80"/>
    <item android:drawable="@drawable/loading_02" android:duration="80"/>
    ...
</animation-list>

(2)然后在布局文件中,给一个ImageView的背景设置为该帧动画。

android:background="@drawable/anim_progress"

(3)在相应的Activity中调用该动画。

private AnimationDrawable animationDrawable;
animationDrawable = (AnimationDrawable) ivAnim.getBackground();
animationDrawable.start();
animationDrawable.stop();

二、补间动画

在res资源文件夹下,创建anim文件夹,然后创建相应的动画文件。

其中,通过设置android:interpolator可以控制动画的变化速度,它有以下几个可选值:

  • LinearInterpolator:动画以均匀的速度改变
  • AccelerateInterpolator:在动画开始的地方改变速度较慢,然后开始加速
  • AccelerateDecelerateInterpolator:在动画开始、结束的地方改变速度较慢,中间时加速
  • CycleInterpolator:动画循环播放特定次数,变化速度按正弦曲线改变: Math.sin(2 * mCycles * Math.PI * input)
  • DecelerateInterpolator:在动画开始的地方改变速度较快,然后开始减速
  • AnticipateInterpolator:反向,先向相反方向改变一段再加速播放
  • AnticipateOvershootInterpolator:开始的时候向后然后向前甩一定值后返回最后的值
  • BounceInterpolator: 跳跃,快到目的值时值会跳跃,如目的值100,后面的值可能依次为85,77,70,80,90,100
  • OvershottInterpolator:回弹,最后超出目的值然后缓慢改变到目的值

要注意的是:赋值的时候,驼峰命名法变为下划线命名法。可参考下面的例子。

(一)补间动画分为以下几种:

(1)渐变动画

<?xml version="1.0" encoding="utf-8"?>
<alpha
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:fromAlpha="0.0"
    android:toAlpha="1.0"
    android:duration="2000"/>

(2)缩放动画

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:fromXScale="0.2"
    android:toXScale="1.5"
    android:fromYScale="0.2"
    android:toYScale="1.5"
    android:pivotX="50%"
    android:pivotY="50%"
    android:duration="2000"/>

(3)平移动画

<?xml version="1.0" encoding="utf-8"?>
<translate android:fromXDelta="0"
    android:toXDelta="50"
    android:fromYDelta="0"
    android:toYDelta="0"
    android:duration="2000"
    android:interpolator="@android:anim/linear_interpolator"
    xmlns:android="http://schemas.android.com/apk/res/android" />

(4)旋转动画

<?xml version="1.0" encoding="utf-8"?>
<rotate android:fromDegrees="0"
    android:toDegrees="360"
    android:duration="3000"
    android:interpolator="@android:anim/linear_interpolator"
    android:repeatCount="-1"
    android:repeatMode="restart"
    android:pivotX="50%"
    android:pivotY="50%"
    xmlns:android="http://schemas.android.com/apk/res/android" />

(5)组合动画

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator"
    android:shareInterpolator="true">
    
    <alpha
        android:fromAlpha="1.0"
        android:toAlpha="0.1"
        android:duration="2000"/>

    <alpha
        android:fromAlpha="0.1"
        android:toAlpha="1.0"
        android:duration="2000"/>
    
</set>

(二)如何在Activity中调用?

private Animation animation;
animation = AnimationUtils.loadAnimation(mContext, R.anim.anim_alpha);
ivAnim.startAnimation(animation);

其他动画,调用方法一样。

 

三、属性动画

实现方式有两种:1、通过代码来实现;2、通过XML动画文件来实现。

1、通过代码来实现属性动画。

private ObjectAnimator objectAnimator;
objectAnimator = ObjectAnimator.ofFloat(tvContent, "alpha", 1f, 0f, 1f);
objectAnimator.setDuration(3000);
objectAnimator.setRepeatMode(ValueAnimator.RESTART);
objectAnimator.setRepeatCount(-1);
objectAnimator.start();

补充一下组合属性动画:

ObjectAnimator objectAnimator_translation = ObjectAnimator.ofFloat(tvContent, "translationY", 0, 100);
ObjectAnimator objectAnimator_alpha = ObjectAnimator.ofFloat(tvContent, "alpha", 1f, 0f, 1f);
ObjectAnimator objectAnimator_rotate = ObjectAnimator.ofFloat(tvContent, "rotation", 0f, 360f);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(objectAnimator_alpha).with(objectAnimator_rotate).after(objectAnimator_translation);
animatorSet.setDuration(5000);
animatorSet.setInterpolator(new LinearInterpolator());
animatorSet.start();

可以看出,只要是View可以设置的属性都可以进行动画变化。比如:textColor,backgroundColor之类的都可以进行变化。

2、通过XML动画来实现动画效果

在res资源文件夹下创建animator文件夹,然后创建动画文件。

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator android:propertyName="alpha"
    android:valueFrom="1f"
    android:valueTo="0f"
    android:duration="2000"
    android:repeatCount="0"
    android:repeatMode="restart"
    android:interpolator="@android:anim/linear_interpolator"
    xmlns:android="http://schemas.android.com/apk/res/android" />

在相应的Activity中调用如下:

Animator animator = AnimatorInflater.loadAnimator(mContext, R.animator.animator_alpha);
animator.setTarget(tvContent);
animator.start();

补充一下组合动画:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:ordering="sequentially">

    <objectAnimator
        android:propertyName="alpha"
        android:valueFrom="1f"
        android:valueTo="0f"
        android:duration="2000"
        android:interpolator="@android:anim/linear_interpolator" />

    <objectAnimator
        android:propertyName="alpha"
        android:valueFrom="0f"
        android:valueTo="1f"
        android:duration="2000"
        android:interpolator="@android:anim/linear_interpolator" />

</set>

最后,如何监听动画的变化过程呢?

//添加动画过程监听
animator.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
        super.onAnimationEnd(animation);
    }

    @Override
    public void onAnimationStart(Animator animation) {
        super.onAnimationStart(animation);
    }
});

以上为最常见的用法。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值