Android动画(三)——属性动画

目录

介绍

 属性动画的实现类

对象动画(ObjectAnimator)

方法1:Java代码实现对象动画

 其它使用方法

方法2:XML实现对象动画

效果

 ​编辑

 值动画(ValueAnimator)

PropertyValueHolder

效果图

动画组合(AnimatorSet)

效果图


介绍

        Android属性动画是一种强大的动画系统,它可以用于在Android应用程序中创建平滑的动画效果。属性动画的作用效果就是:在一个指定的时间段内将对象的一个属性的属性值动态地变化到另一个属性值。

        属性动画的核心概念是值动画器(ValueAnimator)和对象动画器(ObjectAnimator)。值动画器可以通过指定起始值和结束值来创建动画,然后可以通过监听动画的更新事件来更新视图的属性。对象动画器则更加灵活,可以直接对对象的属性进行动画处理。

Android属性动画的使用步骤如下:

  1. 创建一个值动画器或对象动画器,并指定要操作的属性。
  2. 设置动画的起始值和结束值。
  3. 可选:设置动画的时长、重复次数、插值器(控制动画的变化速率)等属性。
  4. 可选:添加监听器以便在动画过程中监听动画的状态变化。
  5. 启动动画。

 属性动画的实现类

  1. ValueAnimator:值动画器,用于对一个属性的值进行动画处理。它可以通过指定起始值和结束值,以及动画的时长、插值器等属性来创建动画。

  2. ObjectAnimator:对象动画器,用于对一个对象的属性进行动画处理。与值动画器不同,对象动画器可以直接对对象的属性进行动画操作,而不需要通过监听器手动更新属性值。

  3. AnimatorSet:动画集合,用于组合多个动画,并设置动画之间的顺序、延迟和并发等。通过AnimatorSet,可以实现复杂的动画效果,例如同时播放多个动画、按顺序播放动画或者设置动画的循环等。

  4. ObjectAnimator.PropertyValuesHolder:属性值持有者,用于同时对多个属性进行动画处理。可以通过PropertyValuesHolder同时对多个属性指定起始值和结束值,并将它们传递给ObjectAnimator来创建动画。

        这些类都属于Android动画框架的一部分,我们可以通过它们来创建各种动画效果,并提供丰富的方法和属性来控制动画的行为和特性。

对象动画(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,"rotationY",0f,360f)
                .setDuration(2000);
 animator.star();

 其它使用方法

 //动画延迟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();

方法2:XML实现对象动画

XML实现对象动画
1、在res目录下新建animator文件夹
2、animator文件夹下创建动画XML文件,如rotatey_property.xml
往该xml文件中输入如下代码 

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:propertyName="rotationY"
    android:valueFrom="0"
    android:valueTo="360"
    android:valueType="floatType"
    >
</objectAnimator>

Java代码中通过加载该xml启动动画

animator11 = AnimatorInflater.loadAnimator(getApplicationContext(),R.animator.rotatey_property);
animation11.setTarget(imageView);
animator11.start();

效果

 

 值动画(ValueAnimator)

        值动画通过控制值的变化,之后 手动赋值给对象的属性,从而实现动画。

   ValueAnimator的核心方法如下:

ValueAnimator ofFloat(float... values) -- 浮点型数值
ValueAnimator  ofInt(int... values) -- 整型数值
ValueAnimator  ofObject(TypeEvaluator evaluator, Object... values) -- 自定义对象类型

        下面我们来添加值动画,在值动画的监听函数里 来获取值得变化,根据值的变化对控件设置相应的属性。这里的属性可以是控件的任意属性

 ImageView imageView = findViewById(R.id.imageView);
 ValueAnimator anim = ValueAnimator.ofInInt0, 360);
 anim.setDuration(5000);
 anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
     @Override
     public void onAnimationUpdate(ValueAnimator animation) {
         int currentValue = (int) animation.getAnimatedValue();
         Log.d("MainActivity", "cuurent value is " + currentValue);
         imageView.setRotationY(currentValue);
     }
 });
 anim.start();

效果如上图,这里就不再展示

PropertyValueHolder

PropertyValueHolder 可以让前面的一些动画同时执行。

        PropertyValuesHolder alpha1 = PropertyValuesHolder.ofFloat("alpha",0.5f,1f);
        PropertyValuesHolder scaleX1 = PropertyValuesHolder.ofFloat("scaleX", 0f, 1f);
        PropertyValuesHolder scaleY1 = PropertyValuesHolder.ofFloat("scaleY", 0f, 1f);
        PropertyValuesHolder translateX1 = PropertyValuesHolder.ofFloat("alpha",0.5f,1f);
        PropertyValuesHolder translateY1 = PropertyValuesHolder.ofFloat("alpha",0.5f,1f);
        PropertyValuesHolder rotate1 = PropertyValuesHolder.ofFloat("rotation", 0, 360);

        ValueAnimator animator = ObjectAnimator.ofPropertyValuesHolder(imageView, alpha1,
                scaleX1, scaleY1,translateX1,translateY1,rotate1);

        animator.setDuration(2000);
        animator.start();

效果图

动画组合(AnimatorSet)

        前面的PropertyValueHolder 类能实现将多个动画同时执行,AnimatorSet类不仅能让多个动画同时执行,还能让多个动画按一定的顺序执行,同时也能穿插多个动画同时执行。
主要的方法如下:

after(Animator anim) 将现有动画插入到传入的动画之后执行
after(long delay) 将现有动画延迟指定毫秒后执行
before(Animator anim) 将现有动画插入到传入的动画之前执行
with(Animator anim) 将现有动画和传入的动画同时执行

        ObjectAnimator rotate2 = ObjectAnimator.ofFloat(imageView, "rotation", 0f, 360f);
        ObjectAnimator translateX2 = ObjectAnimator.ofFloat(imageView, "translationX", -100, 100f);
        ObjectAnimator translateY2 = ObjectAnimator.ofFloat(imageView, "translationY", -100, 100f);
        ObjectAnimator scaleX2 = ObjectAnimator.ofFloat(imageView, "scaleX", 0, 1f);
        ObjectAnimator scaleY2 = ObjectAnimator.ofFloat(imageView, "scaleY", 0, 1f);
        ObjectAnimator alpha2 = ObjectAnimator.ofFloat(imageView, "alpha", 1f, 0f, 1f);
        AnimatorSet animSet = new AnimatorSet();
        animSet.play(rotate2)        // 首先播放 rotate2 动画
                .with(alpha2)         // 与 rotate2 动画同时播放 alpha2 动画
                .after(scaleX2)       // 在 rotate2 动画之后播放 scaleX2 动画
                .before(translateX2)  // 在 scaleX2 动画之前播放 translateX2 动画
                .after(1000)           // 在 translateX2 动画之后延迟1000毫秒
                .before(translateY2)  // 在延迟后播放 translateY2 动画
                .with(scaleY2);       // 与 translateY2 动画同时播放 scaleY2 动画
        animSet.setDuration(5000);
        animSet.start();

效果图

上一篇:Android动画(二)——补间动画-CSDN博客

下一篇 :Android动画(四)——属性动画ValueAnimator的妙用-CSDN博客

 本文参考【Android 】属性动画最全解析_android 属性动画-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/252153.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android动画(四)——属性动画ValueAnimator的妙用

目录 介绍 效果图 代码实现 xml文件 介绍 ValueAnimator是ObjectAnimator的父类&#xff0c;它继承自Animator。ValueAnimaotor同样提供了ofInt、ofFloat、ofObject等静态方法&#xff0c;传入的参数是动画过程的开始值、中间值、结束值来构造动画对象。可以将ValueAnimator看…

11.1.0iPortal之新增【增强其他服务注册能力】

作者&#xff1a;yx 文章目录 前言 一、使用场景二、功能说明三、举例说明 前言 11.1.0版本以前&#xff0c;注册服务的地址必须是可以访问的&#xff0c;否则会注册失败&#xff0c;如下图所示&#xff1a; 11.1.0版本开始新增“服务在线检测”功能&#xff0c;即可以实现注…

QT QWidget - 跑马灯

简介 关于前面画了个圆&#xff0c;怎么样也得跑个灯, 只是基于布局创建LED Widget而非 QTableView/QTableWidget;实现步骤 实现LED Widget LEDWidget.cpp LEDWidget::LEDWidget(QWidget *parent): QWidget(parent), m_on(false) {}void LEDWidget::paintEvent(QPaintEvent …

THEMIS---Beta Sprint Summary Essay Blog

Which course does this assignment belong to2301-MUSE社区-CSDN社区云What are the requirements for this assignmentbeta SprintThe goal of this assignmentTo summarize the beta task progress and the teams sprintsTeam NameThemisTop-of-the-line collection of essa…

单变量、双变量、多变量分析(基于iris数据集)

目录 一、数据处理 二、单变量分析 三、双变量分析 四、多变量分析 利用padas、numpy、matplotlib、seaborn库&#xff0c;对数据进行分析。 Iris数据集是非常著名的机器学习数据集之一&#xff0c;在统计学和机器学习领域被广泛应用。该数据集包含了150个样本&#xff0c;分…

如何查看PHP信息

创建一个 PHP 文件&#xff0c;比如 info.php&#xff0c;在其中添加以下代码&#xff1a; <?php phpinfo(); ?>访问这个文件&#xff08;例如&#xff0c;在浏览器中输入 http://localhost/info.php&#xff09;&#xff0c;它会显示 PHP 的所有配置信息。在这个页面…

华为配置基本QinQ示例

组网需求 如图1所示&#xff0c;网络中有两个企业&#xff0c;企业1有两个分支&#xff0c;企业2有两个分支。这两个企业的各办公地的企业网都分别和运营商网络中的SwitchA和SwitchB相连&#xff0c;且公网中存在其它厂商设备&#xff0c;其外层VLAN Tag的TPID值为0x9100。 现…

java_web_电商项目

java_web_电商项目 1.登录界面2.注册界面3. 主界面4.分页界面5.商品详情界面6. 购物车界面7.确认订单界面8.个人中心界面9.收货地址界面10.用户信息界面11.用户余额充值界面12.后台首页13.后台商品增加14.后台用户增加15.用户管理16.源码分享1.登录页面的源码2.我们的主界面 1.…

Scrapy爬虫学习

Scrapy爬虫学习一 1 scrapy框架1.1 scrapy 是什么1.2 安装scrapy 2 scrapy的使用2.1创建scrapy项目2.2 创建爬虫文件2.3爬虫文件的介绍2.4 运行爬虫文件 3 爬取当当网前十页数据3.1 dang.py&#xff1a;爬虫的主文件3.2 items.py 定义数据结构3.3 pipelines.py 管道3.4 执行命令…

万兆网络之屏蔽线序接法(中)

在介绍优质网线选购之前&#xff0c;先简单介绍一下水晶头 1毛钱一颗跟1元一颗的水晶头&#xff0c;往往是金手指厚度差别&#xff0c;你可以想象压制的时候可能会有什么情况 另外&#xff0c;一些3元一颗的镀金水晶头会有15U、30U之类的是电镀厚度单位&#xff0c;数值越大镀…

Maui blazor与sqlite开发一个增删改查

在android端增删改不能运行。也看不出来是什么&#xff0c;但运行到windows可以运行。 引入sqlite-net-pcl 开发Model using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.T…

工具在手,创作无忧:一键下载安装Auto CAD工具,让艺术创作更加轻松愉悦!

不要再浪费时间在网上寻找Auto CAD的安装包了&#xff01;因为你所需的一切都可以在这里找到&#xff01;作为全球领先的设计和绘图软件&#xff0c;Auto CAD为艺术家、设计师和工程师们提供了无限的创作潜力。不论是建筑设计、工业设计还是室内装饰&#xff0c;Auto CAD都能助…

HYDRA爆破之王(服务多)(用法简单)

#江南的江 #每日鸡汤&#xff1a;如果你向神求助&#xff0c;说明你相信神的能力。如果神没有帮助你&#xff0c;说明神相信你的能力。 #初心和目标&#xff1a;善用网络安全。。。 HYDRA 1.Hydra的简介 --------------------------------------------------------------------…

写递归函数的一些思考

当编写递归函数时&#xff0c;有几个关键的思考点可以帮助你设计和实现递归算法&#xff1a; 定义递归的基本情况&#xff1a;确定递归函数应该在何时终止&#xff0c;即递归的基本情况。这是一个递归的出口条件&#xff0c;确保递归不会无限进行下去。基本情况应该是可以直接求…

RabbitMq交换机详解

目录 1.交换机类型2.Fanout交换机2.1.声明队列和交换机2.2.消息发送2.3.消息接收2.4.总结 3.Direct交换机3.1.声明队列和交换机3.2.消息接收3.3.消息发送3.4.总结 4.Topic交换机4.1.说明4.2.消息发送4.3.消息接收4.4.总结 5.Headers交换机5.1.说明5.2.消息发送5.3.消息接收5.4.…

Ubuntu 常用命令之 ln 命令用法介绍

ln命令在Ubuntu系统中用于创建硬链接或符号链接。硬链接是指向文件的物理地址&#xff0c;而符号链接&#xff08;也称为软链接&#xff09;是指向文件路径的引用。 命令格式&#xff1a;ln [选项]... [-T] 目标&#xff08;源文件&#xff09; 链接&#xff08;目标文件&…

12.16_黑马数据结构与算法笔记Java

目录 167 B树 remove 168 B树 remove 搭架子 169 B树 remove case1-4 170 B树 remove case5-6分析 171 B树 remove case5 旋转 172 B树 remove case5 合并 173 B树 remove case6 174 B树 remove 演示1 175 B树 remove 演示2 176 哈希表 概述 177 哈希表 hash码映射索…

将html的radio单选框自定义样式为正方形和对号

将html的radio单选框自定义样式为正方形和对号 背景&#xff1a; 如何能把html的<input type"radio" name"option">改成自定义的样式呢&#xff1f;比如想要把他变成正方形&#xff0c;选中的时候是对号。默认的样式太丑了 默认样式&#xff1a; 自…

LCR 146. 螺旋遍历二维数组

解题思路&#xff1a; class Solution {public int[] spiralArray(int[][] array) {if(array.length 0) return new int[0];int l 0, r array[0].length - 1;int t 0, b array.length - 1;int x 0;int[] res new int[(r 1) * (b 1)];while(true) {for(int i l; i <…

Linux(23):Linux 核心编译与管理

编译前的任务&#xff1a;认识核心与取得核心原始码 Linux 其实指的是核心。这个【核心(kernel)】是整个操作系统的最底层&#xff0c;他负责了整个硬件的驱动&#xff0c;以及提供各种系统所需的核心功能&#xff0c;包括防火墙机制、是否支持 LVM 或 Quota 等文件系统等等&a…
最新文章