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

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

相关推荐
一笑的小酒馆3 小时前
Android性能优化之截屏时黑屏卡顿问题
android
懒人村杂货铺5 小时前
Android BLE 扫描完整实战
android
TeleostNaCl8 小时前
如何安装 Google 通用的驱动以便使用 ADB 和 Fastboot 调试(Bootloader)设备
android·经验分享·adb·android studio·android-studio·android runtime
fatiaozhang95278 小时前
中国移动浪潮云电脑CD1000-系统全分区备份包-可瑞芯微工具刷机-可救砖
android·网络·电脑·电视盒子·刷机固件·机顶盒刷机
2501_915918419 小时前
iOS 开发全流程实战 基于 uni-app 的 iOS 应用开发、打包、测试与上架流程详解
android·ios·小程序·https·uni-app·iphone·webview
lichong9519 小时前
【混合开发】vue+Android、iPhone、鸿蒙、win、macOS、Linux之dist打包发布在Android工程asserts里
android·vue.js·iphone
Android出海9 小时前
Android 15重磅升级:16KB内存页机制详解与适配指南
android·人工智能·新媒体运营·产品运营·内容运营
一只修仙的猿9 小时前
毕业三年后,我离职了
android·面试
编程乐学10 小时前
安卓非原创--基于Android Studio 实现的新闻App
android·ide·android studio·移动端开发·安卓大作业·新闻app
雅雅姐11 小时前
Android14 init.rc中on boot阶段操作4
android