展开说说:Android动画使用

动画是通过把事物变化分解成许多瞬间的动作,给视觉造成连续变化的图画。 "Animation" 一词源自于拉丁文anima,意思为"灵魂",动词animate是"赋予生命"的意思,引申为使某物活起来的意思。Android动画分为三种:帧动画、补间动画、属性动画。

依次说一下他们的使用:

1、帧动画

帧动画的本质是好多drawable依次播放。

第一步需要在res目录下drawable文件夹新建一个xml文件,我这是frameanimation .xml。

第二部将frameanimation .xml设置给ImageView组件

第三步通过ImageView组件获取AnimationDrawable

第四步使用AnimationDrawable实例去执行或者关闭动画。

这里是具体代码实现:

1.1第一步创建 frameanimation .xml

java 复制代码
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@mipmap/round_spinner_fade_00" android:duration="100"/>
    <item android:drawable="@mipmap/round_spinner_fade_01" android:duration="100"/>
    <item android:drawable="@mipmap/round_spinner_fade_02" android:duration="100"/>
    <item android:drawable="@mipmap/round_spinner_fade_03" android:duration="100"/>
    <item android:drawable="@mipmap/round_spinner_fade_04" android:duration="100"/>
    <item android:drawable="@mipmap/round_spinner_fade_05" android:duration="100"/>
    <item android:drawable="@mipmap/round_spinner_fade_06" android:duration="100"/>
    <item android:drawable="@mipmap/round_spinner_fade_07" android:duration="100"/>
</animation-list>

1.2 第二步 这里可以在xml中<ImageView标签设置也可以通过java代码设置

java 复制代码
android:background="@drawable/frameanimation"

或者

java 复制代码
animIv.setImageResource(R.drawable.frameanimation);

1.3 第三步

java 复制代码
AnimationDrawable animationDrawable = (AnimationDrawable) animIv.getDrawable();

1.4 第四步

java 复制代码
animationDrawable.start();   //执行动画
animationDrawable.stop();    //关闭动画

2、补间动画

补间动画其实徒有其表,为啥呢?因为你看着它懂了但实际他没动,能相应点击事件的位置还是老地方。

补间分为平移动画translate、缩放动画scale、旋转动画rotate、透明度动画alpha以及动画合集set,用发基本类似此处以缩放动画为例。

第一步 需要在res目录下新建anim文件夹在其中新建一个Animation Resource File文件,我这是scale_anim .xml。

java 复制代码
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:repeatMode="restart">
<scale android:pivotY="0.5" android:pivotX="0.5" android:fromXScale="1.0" android:fromYScale="1.0" android:toXScale="0.3" android:toYScale="0.3" android:repeatCount="5"/>
</set>
  • 使用AnimationUtils加载动画
java 复制代码
scaleAnimation = AnimationUtils.loadAnimation(AnimationActivity.this, R.anim.scale_anim);
  • 设置播放时长
java 复制代码
scaleAnimation.setDuration(2000);
  • 设置重复次数
java 复制代码
scaleAnimation.setRepeatCount(1); 
  • 开启动画和关闭动画
java 复制代码
animIv.startAnimation(scaleAnimation);  //开启
scaleAnimation.cancel();   //关闭
animIv.clearAnimation();  //清除动画

补充:

补间动画也可以在java代码中实现,这里其实完成了上面的第一步和第二部,有了animation对象其他的都一样了。

java 复制代码
rotateAnimation = new RotateAnimation(0.0f, 360.0f, 0.5f, 0.5f);

这里用scale的举例,translate、scale、rotate、alpha用发也是类似,只有动画合集set相对特殊他是一个集合可以放这四种任何一个或者多个,建立Animation文件时系统自动创建了set标签
(2)补间动画必须设置duration时长,否则无效不会执行的或者瞬间只闪一下。

  1. 如果xml中已经配置了repeatCount此处设置重复次数将不再生效,想要这里生效就别在xml中适配;这个属性是重复次数,因此你设置2就一共三遍设置5一共执行6遍。

3、属性动画

属性动画是通过动态改变了对象属性实现动画效果。 它不会像无补间动画那样看似变化了但View的位置不变,动画执行后响应范围也是随之改变。是真正意义上的动画,而且应用范围很广不局限用作用于view,因此使用范围也最广。

属性动画Animator是个抽象类,有三个子类ValueAnimator、AnimatorSet,而TimeAnimator和ObjectAnimator是ValueAnimator的子类、我们都是在使用他们四个实现动画

这里以属性动画的平移、缩放、透明度、旋转为例:

第一步 定义这些动画

java 复制代码
private ObjectAnimator translationXAnimation() {
    //参数第三个是一个可变参数,填写一个是想要移动的距离多个参数会在这几个参数的位置移动
    ObjectAnimator transXAnimator = ObjectAnimator.ofFloat(animIv, "translationX", -1800, 300,600,-200,80);
    transXAnimator.setDuration(2000);
    transXAnimator.setRepeatCount(0);
    return transXAnimator;
}

private ObjectAnimator translationYAnimation() {
    ObjectAnimator transYAnimator = ObjectAnimator.ofFloat(animIv, "translationY", 100, 400);
    transYAnimator.setDuration(2000);
    transYAnimator.setRepeatCount(0);
    return transYAnimator;
}

private ObjectAnimator scaleXAnimation() {
    ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(animIv, "scaleX", 0.0f, 2.0f);
    scaleXAnimator.setDuration(2000);
    scaleXAnimator.setRepeatCount(0);
    return scaleXAnimator;
}


private ObjectAnimator scaleYAnimation() {
    //参数第三个是一个可变参数,缩放渐变
    ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(animIv, "scaleY", 0.0f, 2.0f);
    scaleYAnimator.setDuration(2000);
    scaleYAnimator.setRepeatCount(0);
    return scaleYAnimator;
}

private ObjectAnimator alphaAnimation() {
    //参数第三个是一个可变参数,不管几个参数会在这几个参数之间改变透明度
    ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(animIv, "alpha", 1.0f, 0.8f, 0.6f, 0.4f, 0.3f, 0.0f);
    alphaAnimator.setDuration(2000);
    alphaAnimator.setRepeatCount(-1);//-1是一直重复
    alphaAnimator.setRepeatMode(ObjectAnimator.RESTART);//reverse表示到临界值反向恢复,1.0-0.0然后0.0-1.0周而复始;restart表示1.0-0.0然后又1.0-0.0
    return alphaAnimator;
}

private ObjectAnimator rotateAnimation() {
    //参数第三个是一个可变参数,填写一个没效果不报错,两个是想要旋转的的距离from-to,多个参数会在这几个参数的角度旋转
    ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(animIv, "rotation", 0f,360f,0f);
    objectAnimator.setDuration(2000);
    return objectAnimator;
}

第二步 执行动画 每一个都可调用start方法单独执行

java 复制代码
transXAnimator.start();
transYAnimator.start();
scaleXAnimator.start();
scaleYAnimator.start();
alphaAnimator.start();
rotateAnimator.start();
可以用上面的animator单独开启动画或者使用使用animatorset开启动画合集
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(rotateAnimator, alphaAnimator, scaleXAnimator, scaleYAnimator, transXAnimator, transYAnimator);
animatorSet.start();

第三步 停止动画

java 复制代码
animSet.cancel();
animIv.clearAnimation();

下一篇记录一下插值器和估值器以及自定义属性动画。

相关推荐
网络研究院17 分钟前
Android 安卓内存安全漏洞数量大幅下降的原因
android·安全·编程·安卓·内存·漏洞·技术
凉亭下24 分钟前
android navigation 用法详细使用
android
小比卡丘3 小时前
C语言进阶版第17课—自定义类型:联合和枚举
android·java·c语言
前行的小黑炭4 小时前
一篇搞定Android 实现扫码支付:如何对接海外的第三方支付;项目中的真实经验分享;如何高效对接,高效开发
android
落落落sss5 小时前
MybatisPlus
android·java·开发语言·spring·tomcat·rabbitmq·mybatis
代码敲上天.6 小时前
数据库语句优化
android·数据库·adb
GEEKVIP8 小时前
手机使用技巧:8 个 Android 锁屏移除工具 [解锁 Android]
android·macos·ios·智能手机·电脑·手机·iphone
model200510 小时前
android + tflite 分类APP开发-2
android·分类·tflite
彭于晏68910 小时前
Android广播
android·java·开发语言
与衫11 小时前
掌握嵌套子查询:复杂 SQL 中 * 列的准确表列关系
android·javascript·sql