版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tongsiw/article/details/61927737
android中动画有三种
帧动画(Frame Animation)、补间动画(Tween Animation)、属性动画(Property Animation)
上一篇 是 帧动画 、补间动画,这里就不多说了,链接地址在此:
Android动画 帧动画、补间动画、属性动画 (一)
一、属性动画(Property Animation)
属性动画我们称之为 Animator,传统动画我们称之为Animation;
传统Animation动画简单来说就是系统不断调用onDraw方法,去重绘界面,来实现动画的效,其属性值并未改变,所以传统Animation动画并不适用做交互的动画的效果,只能做一些展示的动画效果;同时传统Animation动画是通过不断调用ondraw方法,所以相对来讲比较耗资源,而且动画的特效不够丰富,只有4种,所以属性动画就诞生了。
而属性动画,是操纵一个属性的get、set方法,去真实的改变一个属性
1、ObjectAnimator xml方式
这里需要注意是的属性动画文件存放目录为res/animator
(1)、透明
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:propertyName="alpha"
android:duration="500"
android:repeatCount="1"
android:repeatMode="reverse"
android:startOffset="200"
android:valueFrom="0.0"
android:valueTo="1.0"
android:valueType="floatType" />
<!--
propertyName 属性值,这里是透明度
平移:translation translationX translationY
旋转:rotation rotationX rotationY
透明度:alpha
缩放:scale scaleX scaleY
duration 表示动画执行的时间
valueFrom 表示从哪个状态值开始动画
valueTo 表示到哪个状态值结束动画
valueType 类型估值,主要用于设置动画操作属性的值
repeatMode 表示重复的模式 reverse表示
repeatCount 动画重复的计数,动画将会执行该值+1次
repeatMode 动画重复的模式,reverse为反向,当第偶次执行时,动画方向会相反。restart为重新执行,方向不变
startOffset, 动画多次执行的间隔时间,如果只执行一次,执行前会暂停这段时间,单位毫秒
interpolator 指定动画插入器
-->
加载代码
Animator animator= AnimatorInflater.loadAnimator(this, R.animator.alpha);
animator.setTarget(imageView);
animator.start();
大致的流程就如上,下面贴出平移、旋转、缩放的xml代码
(2)、缩放
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:propertyName="scaleX"//这里可以是scale或者scaleY
android:duration="800"
android:repeatCount="1"
android:repeatMode="reverse"
android:valueFrom="1.0"
android:valueTo="1.5"
android:valueType="floatType" />
(3)、旋转
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:propertyName="rotation"//这里可以是rotationX或者rotationY
android:duration="800"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:repeatCount="1"
android:repeatMode="reverse"
android:valueFrom="0"
android:valueTo="360"
android:valueType="floatType" />
(4)、平移
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
//这里可以是translationX或者translationY
android:propertyName="translation"
android:duration="800"
android:repeatCount="1"
android:repeatMode="reverse"
android:valueFrom="0"
android:valueTo="100"
android:valueType="floatType" />
2、ObjectAnimator Java代码方式
(1)、透明
ObjectAnimator alphaAnimatior = ObjectAnimator.ofFloat(imageView, "alpha", 0f, 1f);
alphaAnimatior.setDuration(800);
alphaAnimatior.setRepeatCount(0);
alphaAnimatior.setRepeatMode(ValueAnimator.REVERSE);
alphaAnimatior.setStartDelay(200);
alphaAnimatior.setInterpolator(new AccelerateDecelerateInterpolator());
alphaAnimatior.start();
(2)、缩放
ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(imageView, "scaleY", 1f, 2.5f);
scaleXAnimator.setDuration(800);
scaleXAnimator.setRepeatCount(1);
scaleXAnimator.setRepeatMode(ValueAnimator.REVERSE);
scaleXAnimator.start();
(3)、旋转
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(imageView, "rotationY", 0f, 360f);
objectAnimator.setDuration(800);
objectAnimator.setRepeatCount(1);
objectAnimator.setRepeatMode(ValueAnimator.REVERSE);
objectAnimator.start();
(4)、平移
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(imageView, “translationY”, 0f, 100f);
objectAnimator.setDuration(800);
objectAnimator.setRepeatCount(1);
objectAnimator.setRepeatMode(ValueAnimator.REVERSE);
objectAnimator.start();
(5)、AnimatorSet组合动画
ObjectAnimator anim1 = ObjectAnimator.ofFloat(imageView,"scaleX",1.0f,3.0f);
ObjectAnimator anim2 = ObjectAnimator.ofFloat(imageView, "scaleY",1.0f, 3.0f);
ObjectAnimator anim3 = ObjectAnimator.ofFloat(imageView,
"translationX",0f ,300f);
AnimatorSet animSet = new AnimatorSet();
animSet.setDuration(1000);
animSet.setInterpolator(new LinearInterpolator());
//三个动画同时执行
animSet.playTogether(anim1, anim2,anim3);
animSet.start();
/**
* 如果是anm1、anim2同时执行,anim3之后执行呢
* animSet.play(anim1).with(anim2);
* animSet.play(anim3).after(anim2);
* animSet.start();
*/