前面给我们分析了
Android
中的帧动画
和补间动画
的特点和用法Android动画之补间动画用法最全详解
Android 动画之帧动画用法详解
Android
官方在Anrdoid 3.0
以后又推出了一种新的动画即属性动画
,既然前面的帧动画
和补间动画
能帮助我们实现大部分的Android动画效果,那么官方为什么还要推出这种新的属性动画
呢?
原因1:
补间动画
作用的对象是View
,也就是作用的对象是Android
中的控件,如ImageView
、Button
、TextView
等,也可以作用在布局上如LinearLayout
、ConstraintLayout
、RelativeLayout
等,但是对于一些不是View
的对象,无法对这些对象进行动画操作。比如我们要对某个控件的某个属性做进行动画操作,如其颜色,这个颜色也可以看成一个对象,但其并不是View
对象,补间动画
就无法实现,属性动画
可以对这个颜色值做动画, 能实现一些更加复杂的动画效果。
原因2:
补间动画只是改变了
View
的视觉效果,而不会真正去改变View的属性比如我们对一个图片进行
AlphaAnimation
,并在动画前后打印其值
Log.i("MainActivity","动画开始前mImageView alpha="+mImageView.getAlpha());
animation = new AlphaAnimation(0, 1);
animation.setDuration(2000);
mImageView.startAnimation(animation);
Log.i("MainActivity","动画结束后mImageView alpha="+mImageView.getAlpha());
从打印的结果可以看出,
补间动画
并没有改变View
的属性值,而属性动画
不但会帮助我们实现View
动画的一些视觉效果,而且还能改变View
的属性值。
属性动画用法
1、属性动画都是通过
ValueAnimator
类和ObjectAnimator
类来完成,其中ObjectAnimator
类是对对象做动画,ValueAnimator
类是对值做动画。2、
PropertyValueHolder类
可以同时执行多个动画,AnimatorSet
l类可以将多个动画按一定的秩序先后执行。3、
TypeEvaluator
估值器和Interpolator
差值器
我们了解了下面6个类的基本用法,就基本彻底掌握了属性动画
ObjectAnimator 对象动画 ValueAnimator 值动画 PropertyValueHolder 用于同时执行多个动画 TypeEvaluator 估值器 AnimatorSet 动画集合 Interpolator 差值器 对象动画(ObjectAnimator)ObjectAnimator
类是属性动画中非常重要的一个类,可以通过该类对View
不仅可以实现一些基本的移、旋转、缩放和透明度四种基本变换动画,还能实现一些其他属性值的变换动画。实现方式既可以通过Java代码,也可以通过XML方式来实现,下面我们来分别介绍下两种方式基本用法。 方法1:Java代码实现对象动画
首先我们先来看一下
ObjectAnimator
类最基本的方法
public static ObjectAnimator ofFloat(Object target, String propertyName, float... values) {
ObjectAnimator anim = new ObjectAnimator(target, propertyName);
anim.setFloatValues(values);
return anim;
}
方法中第一个参数
Object target
的作用对象通常是View
,也就是Android中的控件或布局。方法中第二个参数
String propertyName
通常是需要执行动画的属性,具体值如下表所示
属性 | 值的用法 |
---|---|
rotation | 以屏幕方向为轴的旋转度数 |
alpha | 透明度 |
translationX / translationY | X/Y方向的位移 |
scaleX /scaleY | X/Y方向的缩放倍数 |
rotationX / rotationY | 以X/Y轴为轴的旋转度数 |
方法中第三个参数
float... values
表示属性的变换范围,该参数可以传多个值。
添加一些代码来看一下效果
ImageView imageView = findViewById(R.id.imageView);
ObjectAnimator animator = ObjectAnimator.ofFloat(imageView, "alpha", 1f, 0f, 1f);
animator.setDuration(5000);
animator.start();
该动画效果表示控件
ImageView
的透明度在5s
内由1
变换到0
,再由0
变回 1
。效果如下:ObjectAnimator
的其他方法使用如下:
ImageView imageView = findViewById(R.id.imageView);
ObjectAnimator animator = ObjectAnimator.ofFloat(imageView, "alpha", 1f, 0f, 1f);
animator.setDuration(2000);
//动画延迟500ms执行
animator.setStartDelay(500);
//执行重复次数 +1
animator.setRepeatCount(3);
// 设置动画重复播放模式 RESTART -执行完一遍后重新执行
// REVERSE -执行完一遍后 从末位置往前执行
animator.setRepeatMode(ValueAnimator.RESTART);
//监听值变换
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Log.i("MainActivity","value:" +animation.getAnimatedValue());
}
});
animator.start();
运行效果:
onAnimationUpdate
回调方法的部分值打印如下Java代码中通过加载该xml启动动画
ImageView imageView = findViewById(R.id.imageView);
Animator animator = AnimatorInflater.loadAnimator(Main2Activity.this, R.animator.animator_alpha);
animator.setTarget(imageView);
animator.start();
值动画(ValueAnimator)
值动画通过控制值的变化,之后 手动赋值给对象的属性,从而实现动画。
ValueAnimator
的核心方法如下
ValueAnimator ofFloat(float... values) -- 浮点型数值
ValueAnimator ofInt(int... values) -- 整型数值
ValueAnimator ofObject(TypeEvaluator evaluator, Object... values) -- 自定义对象类型
下面我们来添加值动画,在值动画的监听函数里 来获取值得变化,根据值的变化对控件设置相应的属性。这里的属性可以是控件的任意属性。
final ImageView imageView = findViewById(R.id.imageView);
ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
anim.setDuration(5000);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float currentValue = (float) animation.getAnimatedValue();
Log.d("MainActivity", "cuurent value is " + currentValue);
imageView.setAlpha(currentValue);
}
});
anim.start();
效果如下
从下面的打印结果中也可以看出,值动画返回了一系列值。
将在估值器加到动画中,该动画作用在我们自定义的View上
MyView imageView = findViewById(R.id.myview);
ObjectAnimator anim = ObjectAnimator.ofObject(
imageView,"color", new MyTypeEvaluator(),
"#0000FF","#FF0000");
anim.setDuration(5000);
anim.start();
效果如下:
作者:huwei0814