Android动画

动画介绍

android3.0之前,主要包括两种动画方式: 补间动画(Tween Animation)和帧动画(Frame Animation或Drawable Animation),这两种动画统称为view动画,针对视图动画存在的不足,3.0之后google增加了属性动画(Property Animation)。之后动画就被分成了View Animation 和Property Animation。

1.View动画之补间动画

补间动画是视图动画的一种,Tween中文意思是在两者之间,中文翻译成补间还是挺贴合意思的,view从一个位置的特定状态变化到另外一个位置,中间过程我们开发者不需要自己完成,补间动画会根据我们属性的设置自己进行每一帧的补充,最后展现一个变化的过程,就叫做补间动画(自己理解)。

补间动画能完成view的位置,大小,旋转,透明度等一系列的变换,使用动画xml文件(放在res/anim/文件夹下)/代码实现

* alpha 渐变透明度动画效果
* scale 渐变尺寸伸缩动画效果
* translate 画面转换位置移动动画效果
* rotate 画面转移旋转动画效果

补间动画只能针对设计好的特定的几种属性执行动画,对于自定义的属性则不太好完成(或者说根本不支持)。

(1) xml示例

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromXScale="0.5"
    android:toXScale="0.5"
    android:pivotX="0"
    android:pivotY="0"
    android:fromYScale="1"
    android:toYScale="1"
    />

// java文件中加载:

Animation am = AnimationUtils.loadAnimation(this, R.anim.scale_animation);
iv.startAnimation(am);

(2) 代码示例

AnimationSet anims = new AnimationSet(true);

ScaleAnimation animation = new ScaleAnimation(1.0f, 4.0f, 1.0f, 2.67f,
Animation.RELATIVE_TO_SELF, 0.875f, Animation.RELATIVE_TO_SELF, 0.413f);
animation.setDuration(500);//设置动画持续时间
anims.addAnimation(animation);
xxx.startAnimation(anims); //xxx为view或继承view的控件

2.View动画之帧动画

帧动画是通过读取xml文件中设置的一系列Drawable,以类似幻听片的方式展示这些drawable,就形成了动画效果,当然也可以利用代码实现帧动画。可能大家觉着帧动画不太常用,其实类似的原理可以借鉴,类似android手机开机的很多动画效果就是类似帧动画,加载一系列图片,实现开机的动画效果。

(1) xml示例
在drawable下创建资源文件

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true">
    <item android:drawable="@drawable/g1" android:duration="200" />
    <item android:drawable="@drawable/g2" android:duration="200" />
    <item android:drawable="@drawable/g3" android:duration="200" />
    <item android:drawable="@drawable/g4" android:duration="200" />
    <item android:drawable="@drawable/g5" android:duration="200" />
    <item android:drawable="@drawable/g6" android:duration="400" />
    <item android:drawable="@drawable/g7" android:duration="400" />
    <item android:drawable="@drawable/g8" android:duration="400" />
    <item android:drawable="@drawable/g9" android:duration="400" />
</animation-list>


//代码中调用
…
private ImageView imageView;
private AnimationDrawable animation;
…
imageView.setBackgroundResource(R.drawable.frame_animation);
animation = (AnimationDrawable) imageView.getBackground();
animation.start();

3.属性动画

属性动画则是通过改变Object的属性进行动画实现。通过改变view或者object的属性实现动画是属性动画的最根本的特点。

用法:例如在控件中设置动画

ArrayList<Animator> animatorList = new ArrayList<>();
final ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(this, "Alpha", 1.0f, 0.0f);
alphaAnimator.setStartDelay(0);
alphaAnimator.setDuration(400);
animatorList.add(alphaAnimator);

PathInterpolator pathInterpolator = new PathInterpolator(0.1f, 0.2f, 0.4f, 0.8f);//插值器
final ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(this, "scaleX", 1.0f, 2.0f);
this.setPivotX(0.0f) //轴点
this.setPivotY(0.0f) //轴点
scaleXAnimator.setDuration(500);
scaleXAnimator.setInterpolator(pathInterpolator);
animatorList.add(scaleXAnimator);

final ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(this, "scaleY", 1.0f, 2.0f);
this.setPivotX(0.0f) //轴点
this.setPivotY(0.0f) //轴点
scaleYAnimator.setDuration(500);
scaleYAnimator.setInterpolator(pathInterpolator);
animatorList.add(scaleYAnimator);

AnimatorSet animatorSet = new AnimatorSet();

animatorSet.playTogether(animatorList);
animatorSet.start();

animatorSet.addListener(new Animator.AnimatorListener() {
	    @Override
	    public void onAnimationStart(Animator animator) {
            }

            @Override
            public void onAnimationEnd(Animator animator) {
            }

            @Override
            public void onAnimationCancel(Animator animator) {
            }

            @Override
            public void onAnimationRepeat(Animator animator) {
            }
        });

4.View动画和属性动画的区别

(1)属性动画比视图动画更强大,不但可以实现缩放、平移等操作,还可以自己定义动画效果,监听动画的过程,在动画过程中或完成后做响应的动作。
(2)属性动画不但可以作用于View,还能作用于Object。
(3)基于view的动画,只改变了view的绘制效果,而实际属性未变,所以动画结束后又回归原始状态;属性动画利用属性的改变实现动画,所以它的实际属性改变了,如果想要恢复属性,手动设置,例如setScaleX

参考网站
https://www.jianshu.com/p/25efc9f3a8f0
https://www.jianshu.com/p/abeca56da5e4

posted on 2020-07-20 17:14  JJ_S  阅读(156)  评论(0编辑  收藏  举报