文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android 属性动画:一文让你彻底了解和掌握属性动画用法

2022-06-06 14:11

关注

本文目录属性动画概述属性动画用法对象动画(ObjectAnimator)方法1:Java代码实现对象动画方法2:XML实现对象动画值动画(ValueAnimator)PropertyValueHolder动画组合(AnimatorSet)差值器(Interpolator)估值器(TypeEvaluator)

在这里插入图片描述

属性动画概述

前面给我们分析了

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 原创文章 28获赞 113访问量 1万+ 关注 私信 展开阅读全文
作者:huwei0814


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯