展开说说: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();

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

相关推荐
大白要努力!2 小时前
Android opencv使用Core.hconcat 进行图像拼接
android·opencv
天空中的野鸟2 小时前
Android音频采集
android·音视频
小白也想学C4 小时前
Android 功耗分析(底层篇)
android·功耗
曙曙学编程4 小时前
初级数据结构——树
android·java·数据结构
闲暇部落6 小时前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
诸神黄昏EX8 小时前
Android 分区相关介绍
android
大白要努力!9 小时前
android 使用SQLiteOpenHelper 如何优化数据库的性能
android·数据库·oracle
Estar.Lee9 小时前
时间操作[取当前北京时间]免费API接口教程
android·网络·后端·网络协议·tcp/ip
Winston Wood9 小时前
Perfetto学习大全
android·性能优化·perfetto
Dnelic-12 小时前
【单元测试】【Android】JUnit 4 和 JUnit 5 的差异记录
android·junit·单元测试·android studio·自学笔记