android 开发程序员android world程序员

Android动画总结

2018-02-27  本文已影响226人  奔跑吧李博

动画应该是很基础的东西了,但是由于自己的记性不太好,总是记不住那些参数和方法,只是知道怎么用而已。所以每次用的时候都去百度或者Google。属性动画的属性确实有点多,这次终于鼓足了勇气作一个总结,让动画的种种用法彻底地记在脑子里面。

动画分类:

动画分为帧动画(Frame Animation)、补间动画(Tweened Animation)和属性动画。

帧动画

帧动画就像放电影一样,连续播放一张张的图片形成动画。

  1. 在drawable文件夹下创建一个animlist.xml文件,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item android:drawable="@mipmap/mike_volume_part1" android:duration="150"></item>
    <item android:drawable="@mipmap/mike_volume_part2" android:duration="150"></item>
    <item android:drawable="@mipmap/mike_volume_part3" android:duration="150"></item>
    <item android:drawable="@mipmap/mike_volume_part4" android:duration="150"></item>
</animation-list>

动画的每一帧150毫秒,一共4帧。oneshot表示是否重复播放。

  1. 播放帧动画
        ivFrame.setImageResource(R.drawable.animlist);
        AnimationDrawable drawable = (AnimationDrawable) ivFrame.getDrawable();
        drawable.start();  //开始
        //drawable.stop();  //结束

演示效果:


giphy (1).gif

补间动画

XML配置中属性名:

alpha 透明度动画
scale 缩放动画
translate 移动动画
rotate 旋转动画

代码中动画类名:

AlphaAnimation 透明度动画
ScaleAnimation 缩放动画
TranslateAnimation 移动动画
RotateAnimation 旋转动画

Alpha属性值说明

fromAlpha 起始时透明度,范围0-1
toAlpha 结束时透明度,范围0-1

Scale属性值说明

fromXScale 起始时X轴上的缩放比例
toXScale 结束时X轴上的缩放比例
fromYScale 起始时Y轴上的缩放比例
toYScale 结束时Y轴上的缩放比例
pivotX 缩放中心点X坐标位置
pivotY 缩放中心点Y坐标位置

Translate属性值说明

fromXDelta 起始时动画在X坐标的位置
toXDelta 结束时动画在X坐标的位置
fromYDelta 起始时动画在Y坐标的位置
toYDelta 结束时动画在Y坐标的位置

Rotate属性值说明

fromDegrees 起始时控件角度
toDegrees 结束时控件角度
pivotX 旋转中心点X坐标位置

pivotY 旋转中心点Y坐标位置

属性:

fillAfter 为ture时,该动画结束后保持结束时的状态
interpolator 设置动画插值器
duration 设置动画持续时间
startOffset 动画在几秒开始执行

将以上各个动画类型办个组合来举个栗子:

在anim文件夹下创建了animset.xml文件,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha android:fromAlpha="0" android:toAlpha="1" android:duration="2000"/>

    <rotate android:fromDegrees="0" android:toDegrees="720" android:pivotX="50%" android:pivotY="50%" android:duration="2000"/>

    <scale android:fromXScale="1" android:toXScale="2" android:fromYScale="1" android:toYScale="2"
        android:pivotY="50%" android:pivotX="50%" android:duration="2000"/>

    <translate android:fromXDelta="0" android:toXDelta="300" android:fromYDelta="0" android:toYDelta="300" android:duration="2000"/>
</set>

加载该动画方式:

        Animation animation = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.animset);
        animation.setFillAfter(true);
        ivTween.startAnimation(animation);

演示效果:


giphy (2).gif

属性动画:ObjectAnimator用法

调用方法:
public static ObjectAnimator ofFloat(Object target, String propertyName, float... values)

任性一下,这么多字符串,我怎么知道有哪些属性啊?!如果写错了呢?

1、透明度:alpha  
public void setAlpha(float alpha)  

2、旋转度数:rotation、rotationX、rotationY  
public void setRotation(float rotation)  
public void setRotationX(float rotationX)  
public void setRotationY(float rotationY)  

3、平移:translationX、translationY  
public void setTranslationX(float translationX)   
public void setTranslationY(float translationY)  

4、缩放:scaleX、scaleY  
public void setScaleX(float scaleX)  
public void setScaleY(float scaleY)

多个属性动画调用:

    private void valueAnim(){
        ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(ivTween,"alpha",0,1);
        objectAnimator.setDuration(2000);
        objectAnimator.start();

        ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(ivTween,"scaleX",1,2);
        objectAnimator1.setDuration(2000);
        objectAnimator1.start();

        ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(ivTween,"scaleY",1,2);
        objectAnimator2.setDuration(2000);
        objectAnimator2.start();

        ObjectAnimator objectAnimator3 = ObjectAnimator.ofFloat(ivTween,"rotation",0,360);
        objectAnimator3.setDuration(2000);
        objectAnimator3.start();
    }

演示效果:


giphy (3).gif
动画监听器:

AnimatorListener,用于监听动画执行的过程。AnimatorUpdateListener,用于监听动画执行过程中的值变化。

        objectAnimator.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {
                //动画开始时调用
            }

            @Override
            public void onAnimationEnd(Animator animation) {
                //动画结束时调用
            }

            @Override
            public void onAnimationCancel(Animator animation) {
                //动画取消时调用
            }

            @Override
            public void onAnimationRepeat(Animator animation) {
                //动画重复执行时调用
            }
        });

        //动画执行过程中不断执行,可以获取得到当前动画执行的值
        objectAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {

            }
        });

github代码地址,demo简单,需要的可参考一下。

上一篇下一篇

猜你喜欢

热点阅读