Android 动画:补间动画、属性动画、帧动画

理解Android动画:补间、属性与帧动画
本文深入探讨Android的三种动画机制:补间动画、属性动画和帧动画。补间动画仅实现视觉效果,不改变View属性;属性动画能真实改变对象属性;帧动画则通过快速切换图片实现动画。文章通过示例和属性说明帮助读者掌握这三种动画的使用。

 #.动画的本质

    无论手机还是电视,都以一定频率在不停刷新屏幕画面,当前一般为60Hz。

    手机屏幕一般1s刷新了60次屏幕画面,如果这些画面连在一起呈现出了一个“动画”的效果,用户就认为看到了动画。

    无论这个效果是用什么方式来实现的,其实用户只是需要在屏幕中看到这个效果。它可以通过很多种方式来实现,例如:覆写View的onDraw()、通过SurfaceView、通过估值器不停回调更新、通过Handler不停发送延迟消息更新。

    而Android本身提供了三种机制来供开发者更便捷地实现动画,这也就是我们开发者口中经常说到的Android三种动画:补间动画、属性动画、帧动画

#.Android三类动画简介:

1.补间动画:

    通过渐进操作View的影像,实现动画。注意它仅仅实现一个动画效果,未真正改变View任何属性。

    例如View用补间动画移动后,位置并未变化,若设置了点击事件,点击原来位置有反应,点击最后动画停止位置无反应。

    能进行4种效果的变化:平移、放缩、旋转、透明度。

2.属性动画:     

    通过渐进改变View对象的属性值,实现动画。(这里的属性可以是该对象java类中任意已实现set/get方法的属性)

    会真实改变属性值,但要注意位置变化时View的getLeft()/getRight()/getTop()/getBottom()等四个边界的原始偏移坐标不会变化,改变的是View左上角当前的坐标值getX()/getY()。

3.帧动画:

    设置了一组图片,通过快速切换这些图片的显示,实现动画效果

#.三种动画示例及属性说明

1.补间动画

在src/anim下定义anim_set.xml

​
<?xml version="1.0" encoding="utf-8"?>
<!--  可以定义一个个单独的动画,也可以将这些动画组合起来定义在一个xml中  -->
<!--  组合的方式更常见一些  -->
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <!--透明度变化-->
    <alpha
        android:duration="1000"
        android:fromAlpha="0"
        android:toAlpha="1"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        />
    <!--平移-->
    <translate
        android:duration="2000"
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:startOffset="3000"
        android:toXDelta="500"
        android:toYDelta="0"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        />
    <!--旋转-->
    <rotate
        android:duration="3000"
        android:fromDegrees="0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:repeatCount="infinite"
        android:repeatMode="restart"
        android:toDegrees="360"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        />
    <!--缩放-->
    <scale
        android:duration="3000"
        android:fromXScale="1"
        android:fromYScale="1"
        android:pivotX="50%"
        android:pivotY="50%"
        android:startOffset="4000"
        android:toXScale="0.5"
        android:toYScale="0.5"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        />
</set>
​

java代码中的调用:

Animation anim = AnimationUtils.loadAnimation(this, R.anim.anim_set);
view.startAnimation(anim);

状态监听接口:

public static interface AnimationListener {
    //开始
    void onAnimationStart(Animation animation);
    //结束
    void onAnimationEnd(Animation animation);
    //重复
    void onAnimationRepeat(Animation animation);
}
//添加方法
public void setAnimationListener(Animation.AnimationListener listener)

##.Animation属性详解:

以下内容摘自Android - 动画(帧动画,补间动画,属性动画,以及插值器) - 简书

(通用属性)

属性名称

作用

备注

duration

动画执行的时间

以毫秒为单位

fillEnabled

动画结束时,是否还原到开始动画前的状态

true或者false

fillBefore

与fillEnabled相同

fillAfter

动画结束时,是否将保持动画最后时的状态

true或者false

repeatMode

重复类型

reverse:表示倒序回访,restart:表示重新放一遍,这个属性必须与repeatCount联合使用,因为牵扯到重复,即重复播放时的播放类型。

repeatCount

动画重复的次数

infinite:表示无限循环

interpolator

设定的插值器,它主要用来为动画设置一些特殊的效果,比方说:加速运动、减速运动、动画结束的时候弹起等等。

下面会详细介绍

alpha属性详解

属性名称

作用

备注

fromAlpha

动画开始时的透明度

变化范围为0.0-1.0,0.0表示完全透明,1.0表示完全不透明

toAlpha

动画结束时的透明度

同上

rotate属性详解

属性名称

作用

备注

fromDegrees

动画开始时旋转的角度位置

float类型;正值代表顺时针方向度数,负值代码逆时针方向度数

toDegrees

动画结束时旋转到的角度位置

同上

pivotX

旋转点X轴坐标

请看下面的备注

pivotY

旋转点Y轴坐标

同上

pivotX:float类型,可以是数值、百分数、百分数p三种样式,比如50、50%、50%p; 当为数值时,表示在当前View的左上角,即原点处加上50px,做为旋转点X坐标,如果是50%;表示在当前控件的左上角加上自己宽度的50%做为旋转点X坐标;如果是50%p,那么就是表示在当前控件的左上角加上父控件宽度的50%做为旋转点X坐标

canle属性详解

属性名称

作用

备注

fromXScale

起始的X方向上相对自身的缩放比例

型float,比如1.0代表自身无变化,0.5代表起始时缩小一倍,2.0代表放大一倍

toXScale

结尾的X方向上相对自身的缩放比例

类型float

fromYScale

起始的Y方向上相对自身的缩放比例

类型float

toYScale

结尾的Y方向上相对自身的缩放比例

类型float

pivotX

缩放起点X轴坐标

可以是数值、百分数、百分数p

pivotY

缩放起点Y轴坐标

取值及意义与pivotX一样

Translate属性详解

属性名称

作用

备注

fromXDelta

起始点X轴坐标

可以是数值、百分数、百分数p 三种样式

fromYDelta

起始点Y坐标

同上

toXDelta

结束点X坐标

toYDelta

结束点Y坐标

2.属性动画

一般直接用java来实现:

//指定要操作的View、要操作的属性、初始值、结束值
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mRvFl, "rotation", 0f, 360f);
objectAnimator.setDuration(2000);
objectAnimator.start();

状态监听接口:

public static interface AnimatorListener {
    //开始
    void onAnimationStart(Animator animation);
    //结束
    void onAnimationEnd(Animator animation);
    //取消
    void onAnimationCancel(Animator animation);
    //重复
    void onAnimationRepeat(Animator animation);
}

//添加方法
public void addListener(AnimatorListener listener);

3.帧动画

(虽然不是Drawable,但其实使用起来,就像是在使用Drawable)

在src/drawable下定义帧动画frame_anim.xml文件:

​
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <!--  oneshot属性定义是否只播放一次,false表示循环播放 -->
    <!-- duration 延时时间 单位毫秒 -->
    <item
        android:drawable="@drawable/pic_01"
        android:duration="200" />
    <item
        android:drawable="@drawable/pic_02"
        android:duration="200" />
    <item
        android:drawable="@drawable/pic_03"
        android:duration="200" />
    <item
        android:drawable="@drawable/pic_04"
        android:duration="200" />
    <item
        android:drawable="@drawable/pic_05"
        android:duration="200" />
    <item
        android:drawable="@drawable/pic_06"
        android:duration="200" />
    <item
        android:drawable="@drawable/pic_07"
        android:duration="200" />
</animation-list>
​

java代码中的调用:

AnimationDrawable anim = (AnimationDrawable) getResources().getDrawable(R.drawable.frame_anim);
imageView.setImageDrawable(anim);

//开始播放
anim.start();

..........

//停止播放
anim.stop();

相关参考:

《Android开发艺术探索》

Android - 动画(帧动画,补间动画,属性动画,以及插值器) - 简书

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值