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

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

相关推荐
萌面小侠Plus13 分钟前
Android笔记(三十三):封装设备性能级别判断工具——低端机还是高端机
android·性能优化·kotlin·工具类·低端机
慢慢成长的码农13 分钟前
Android Profiler 内存分析
android
大风起兮云飞扬丶13 分钟前
Android——多线程、线程通信、handler机制
android
L725620 分钟前
Android的Handler
android
清风徐来辽20 分钟前
Android HandlerThread 基础
android
HerayChen1 小时前
HbuildderX运行到手机或模拟器的Android App基座识别不到设备 mac
android·macos·智能手机
顾北川_野1 小时前
Android 手机设备的OEM-unlock解锁 和 adb push文件
android·java
hairenjing11232 小时前
在 Android 手机上从SD 卡恢复数据的 6 个有效应用程序
android·人工智能·windows·macos·智能手机
小黄人软件2 小时前
android浏览器源码 可输入地址或关键词搜索 android studio 2024 可开发可改地址
android·ide·android studio
dj15402252032 小时前
group_concat配置影响程序出bug
android·bug