Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
社区首页 >专栏 >动画必须有(一): 属性动画浅谈

动画必须有(一): 属性动画浅谈

作者头像
sean_yang
发布于 2018-09-04 03:25:45
发布于 2018-09-04 03:25:45
73000
代码可运行
举报
文章被收录于专栏:Sorrower的专栏Sorrower的专栏
运行总次数:0
代码可运行

前言

官方文档传送门

属性动画是非常非常好用的, 谷歌自己都说这是一个强大的框架. 那今天就来了解一下它.

ObjectAnimator的初步使用

属性动画最大的特点就是可以让任何Object动起来, 我先给个小栗子, 大家感受一下.

代码语言:javascript
代码运行次数:0
复制
TextView tvTest = (TextView) findViewById(R.id.tv_test);
float curTranslationY = tvTest.getTranslationY();
ObjectAnimator animator
        = ObjectAnimator.ofFloat(tvTest, "translationY",
        curTranslationY, curTranslationY + 100f);
animator.setDuration(2000);
animator.start();

栗子

属性动画有个很重要的点就是说, 动画过后, 控件本身真的就变换了, 而不单单是绘制出了效果.

然后这里ofFloat()函数的第一个参数自然是控件了, 第二个参数是可以填入很多的, 比如"alpha", "rotation", 到底有多少, 大家可以移步官方文档. 然后后面的参数根据第二个参数来, 可多个, 这里可能说的不太清晰, 所以我们再来一个小栗子.

代码语言:javascript
代码运行次数:0
复制
TextView tvTest = (TextView) findViewById(R.id.tv_test);
ObjectAnimator animator
        = ObjectAnimator.ofFloat(tvTest, "alpha",
        1f, 0f, 1f, 0f, 1f, 0f, 1f);
animator.setDuration(2000);
animator.start();

又见栗子


用AnimatorSet进行动画混合

一般来说, 让人感觉舒服的动画都不会是单一变换的动画, 肯定要各种动画混合一起, 来达到某种效果. 我这里进行一些混合的尝试, 顺便再展示几种动画.

代码语言:javascript
代码运行次数:0
复制
// 垂直移动
float curTranslationY = tvTest.getTranslationY();
ObjectAnimator translationY
        = ObjectAnimator.ofFloat(tvTest, "translationY",
        curTranslationY, curTranslationY + 500f);

ObjectAnimator scaleY = ObjectAnimator.ofFloat(tvTest, "scaleY", 1f, 5f, 1f);
ObjectAnimator scaleX = ObjectAnimator.ofFloat(tvTest, "scaleX", 1f, 5f, 1f);

AnimatorSet animSet = new AnimatorSet();
animSet.play(scaleY).with(scaleX).after(translationY);
animSet.setDuration(2000);
animSet.start();

混合动画

这里就是将垂直移动动画, 水平缩放垂直缩放混合在一起, 大家肯定发现了, play(), with(), after()这几个函数.

  • after(Animator anim) after中的动画先执行, 之后才是play中的动画.
  • after(long delay) after中设置时间, 那么play中的动画会根据时间延迟执行.
  • before(Animator anim) before中的动画后执行, play中的先执行.
  • with(Animator anim) play中的动画和with中的一同执行.
  • playTogether() 中间可以放入要一起执行的全部动画, 之后不可接after(), before()这些函数. 来个小栗子.
代码语言:javascript
代码运行次数:0
复制
AnimatorSet animSet = new AnimatorSet();
animSet.playTogether(translationY, scaleX, scaleY);
animSet.setDuration(2000);
animSet.start();

动画混合


将动画写在xml中

写在xml中的好处不言而喻了, 复用性极强. 直接贴代码了, 很好理解的.

代码语言:javascript
代码运行次数:0
复制
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially">

    <objectAnimator
        android:duration="1000"
        android:propertyName="translationY"
        android:valueFrom="0"
        android:valueTo="500"
        android:valueType="floatType" />

    <set android:ordering="sequentially">
        <objectAnimator
            android:duration="1000"
            android:propertyName="rotation"
            android:valueFrom="0"
            android:valueTo="360"
            android:valueType="floatType" />

        <set android:ordering="together">
            <objectAnimator
                android:duration="1000"
                android:propertyName="scaleX"
                android:valueFrom="1"
                android:valueTo="5"
                android:valueType="floatType" />
            <objectAnimator
                android:duration="1000"
                android:propertyName="scaleY"
                android:valueFrom="1"
                android:valueTo="5"
                android:valueType="floatType" />
        </set>
    </set>
</set>

然后使用如下代码调用xml动画.

代码语言:javascript
代码运行次数:0
复制
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(getApplicationContext(), R.animator.anim_set);
set.setTarget(tvTest);
set.start();

动画监听

动画监听是很有必要知道的, 我们是在做软件, 不是在做电影, 不能让它一个劲播下去. 先看一个比较全面的监听.

代码语言:javascript
代码运行次数:0
复制
translationY.addListener(new Animator.AnimatorListener() {
    @Override
    public void onAnimationStart(Animator animation) {
        
    }

    @Override
    public void onAnimationEnd(Animator animation) {

    }

    @Override
    public void onAnimationCancel(Animator animation) {

    }

    @Override
    public void onAnimationRepeat(Animator animation) {

    }
});

这个很麻烦啦, 所以有适配版本的监听. 如果你用Android Studio它会弹出框让你选择.

选择复写的函数

代码语言:javascript
代码运行次数:0
复制
translationY.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
        super.onAnimationEnd(animation);
    }
});

ViewPropertyAnimator上手

属性动画是谷歌在android3.0引入的, 而ViewPropertyAnimator则是3.1引入的, 这个ViewPropertyAnimator绝对可以说是个磨人的小妖精, 它绝对会让你爱上属性动画的, 看个栗子:

代码语言:javascript
代码运行次数:0
复制
tvTest.animate().translationY(curTranslationY + 500)
        .scaleX(5).scaleY(5)
        .setDuration(1000);

ViewPropertyAnimator栗子

用ViewPropertyAnimator的目的就是精简代码以及快速实现, 想要处理一些复杂的动画, 还是要用上一篇说的内容慢慢来的(滑稽脸). 我们稍微修改一点代码, 看看新效果.

代码语言:javascript
代码运行次数:0
复制
tvTest.animate().translationYBy(250)
        .scaleX(5).scaleY(5)
        .setDuration(1000);

By不By

其实可以看函数就看得出来意思了, 不加By代表直接移动某个值, 加了By代表在原有基础上移动某个值. 好, 我们再来看一个及其经典的代码, 可以完美展现出ViewPropertyAnimator的精简好用:

代码语言:javascript
代码运行次数:0
复制
view.animate()// 获取ViewPropertyAnimator对象
        // 动画持续时间
        .setDuration(5000)

        // 透明度
        .alpha(0)
        .alphaBy(0)

        // 旋转
        .rotation(360)
        .rotationBy(360)
        .rotationX(360)
        .rotationXBy(360)
        .rotationY(360)
        .rotationYBy(360)

        // 缩放
        .scaleX(1)
        .scaleXBy(1)
        .scaleY(1)
        .scaleYBy(1)

        // 平移
        .translationX(100)
        .translationXBy(100)
        .translationY(100)
        .translationYBy(100)
        .translationZ(100)
        .translationZBy(100)

        // 更改在屏幕上的坐标
        .x(10)
        .xBy(10)
        .y(10)
        .yBy(10)
        .z(10)
        .zBy(10)

        // 插值器
        .setInterpolator(new BounceInterpolator())//回弹
        .setInterpolator(new AccelerateDecelerateInterpolator())//加速再减速
        .setInterpolator(new AccelerateInterpolator())//加速
        .setInterpolator(new DecelerateInterpolator())//减速
        .setInterpolator(new LinearInterpolator())//线性

        // 动画延迟
        .setStartDelay(1000)

        //是否开启硬件加速
        .withLayer()

        // 监听
        .setListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {
            }

            @Override
            public void onAnimationEnd(Animator animation) {
            }

            @Override
            public void onAnimationCancel(Animator animation) {
            }

            @Override
            public void onAnimationRepeat(Animator animation) {
            }
        })

        .setUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
            }
        })

        .withEndAction(new Runnable() {
            @Override
            public void run() {
            }
        })
        .withStartAction(new Runnable() {
            @Override
            public void run() {
            }
        });

所以日常动画用它就足够了.


最后

有了属性动画, 界面就不会很死板了. 而且由于属性动画的特性, 让它可以完成动画部分的事, 甚至可以完成很多界面交互上的事. 喜欢记得点赞或者关注我哦.


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.04.05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android 动画总结(5) - 属性动画
属性动画改变属性值,所以几乎可以对任何对象执行动画,而不仅仅是 View,比起补间动画,适用范围更广。
三流之路
2018/09/11
9360
【Android】属性动画(基本用法)
1、前言 在我们体验一款APP时,炫酷的动画往往能让用户体验大幅度提升。想当年我刚学Android的时候,无意中看到蘑菇街购物车的动画效果,把我给激动得,非要在自己的APP中加入那动画,记得当时用费了好大的劲...不提了,说多了都是泪... 先了解下,目前可以实现动画的方式有: 帧动画(Frame) :将一个完整的动画拆分成一张张单独的图片,然后再将它们连贯起来进行播放 特点:帧动画 由于是一帧一帧的,所以需要图片多。会增大apk的大小,但是这种动画可以实现一些比较难的效果 比如说等待的环形进度 补
Gavin-ZYX
2018/05/18
1.5K0
Android十八章:属性动画Android属性动画(第一话)
Android动画能给界面带来很炫的效果,如果我们要实现这些效果,在android3.0版本前实现动画主要有2种方式,帧动画和补间动画。
ppjun
2018/09/05
1.1K0
Android属性动画完全解析(上),初识属性动画的基本用法
用户1158055
2018/01/05
1.7K0
Android属性动画完全解析(上),初识属性动画的基本用法
android属性动画
1、概述 Android提供了几种动画类型:View Animation 、Drawable Animation 、Property Animation 。View Animation相当简单,不过只能支持简单的缩放、平移、旋转、透明度基本的动画,且有一定的局限性。比如:你希望View有一个颜色的切换动画;你希望可以使用3D旋转动画;你希望当动画停止时,View的位置就是当前的位置;这些View Animation都无法做到。这就是Property Animation产生的原因,本篇博客详细介绍Prope
xiangzhihong
2018/01/30
8670
android属性动画
Android 属性动画:这是一篇很详细的 属性动画 总结&攻略
实现动画效果在Android开发中非常常见,因此Android系统一开始就提供了两种实现动画的方式:
Carson.Ho
2019/02/22
4K0
android动画解析(初级)
ObjectAnimator继承自ValueAnimator的,底层的动画实现机制也是基于ValueAnimator来完成的,因此ValueAnimator仍然是整个属性动画当中最核心的一个类。那么既然是继承关系,说明ValueAnimator中可以使用的方法在ObjectAnimator中也是可以正常使用的,它们的用法也非常类似.
方志朋
2022/11/30
4970
从零开始学Android自定义View之动画系列——属性动画(2)
独立的动画能够实现的视觉效果毕竟是相当有限的,因此将多个动画组合到一起播放就显得尤为重要。幸运的是,Android团队在设计属性动画的时候也充分考虑到了组合动画的功能,因此提供了一套非常丰富的API来让我们将多个动画组合到一起。 实现组合动画功能主要需要借助AnimatorSet这个类,这个类提供了一个play()方法,如果我们向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包括以下四个方法:
老马的编程之旅
2022/06/22
5180
从零开始学Android自定义View之动画系列——属性动画(2)
自定义View(六)-动画- AnimatorSet与XML设置属性动画
AnimatorSet是组合动画,前面在ObjectAnimator.ofPropertyValuesHolder(),时也可以做到控制多个属性做动画,但是.ofPropertyValuesHolder(),仅仅是将多个属性同时做动画却无法灵活控制每个属性的播放顺序,针对的是一个控件,而AnimatorSet是组合动画。更侧重的是在多个动画播放时对动画的控制(可以控制动画的顺序,延时,同时可以控制多个控件的动画等等)。
g小志
2018/09/11
1.5K0
自定义View(六)-动画- AnimatorSet与XML设置属性动画
Android 动画笔记
属性动画几乎可以实现任何想要的动画效果,非常具有可扩展性并且非常稳健。属性动画可供设定的选项包括了:
zhiruili
2023/10/20
2370
Android 动画笔记
Android--属性动画基础
安卓中动画分成两类 一种是传统动画,如:补间动画,帧动画,其本质是canvas的矩阵变换 另一种是属性动画,由谷歌从Android3.0以后推出 传统动画仅仅是视觉效果,并不会实际改变view的属性,比如:平移动画不会改变view的原来坐标,如果需要点击view还是要点击原来的位置。而属性动画不同,它是真正的改变view的属性(成员变量)。 我们使用属性动画,需要掌握5个类 ObjectAnimator ValueAnimator PropertyValueHolder TypeEvaluator Inte
aruba
2020/07/03
5200
Android--属性动画基础
android-属性动画2
http://blog.csdn.net/yegongheng/article/details/38435553 #######ObjectAnimator ofFloat 对象 ,属性名(对象存在get set的属性) ,变化的范围
tea9
2022/07/16
2660
android-属性动画2
札记:Property动画
该文介绍了Android动画体系以及View动画、Property动画、Animator动画和ObjectAnimator动画的用法。
用户1172465
2018/01/08
1K0
札记:Property动画
Android 中的属性动画 --- 1(基本用法)
动画在提高用户体验里面起了巨大的作用,可以说是提高用用户体验的“主力军”。在 Android 3.0 之前,视图动画几乎承担了所有的动画效果,但是视图动画有一个很大的局限性:它改变的只是某个 View 的外观。但是响应事件位置并没有随着 View 的改变而改变。举个 case 来说,现在有一个按钮通过视图动画在 x 轴方向上向右移动了 200 px(像素) 的距离,按钮显示的位置虽然改变了,但是点击移动后的按钮并不能相应点击事件,只有点击这个按钮没有移动之前的位置才能响应这个按钮的点击事件。由于这个巨大的局限性,Google 在 Android 3.0 以上添加了一个新的动画框架:属性动画。下面来一起看一下属性动画的用法:
指点
2019/01/18
1.2K0
Android 中的属性动画 --- 1(基本用法)
Android 属性动画框架 ObjectAnimator、ValueAnimator ,这一篇就够了
我们都知道 Android 自带了 Roate Scale Translate Alpha 多种框架动画,我们可以通过她们实现丰富的动画效果,但是这些宽家动画却有一个致命的弱点,它们只是改变了 View 显示的大小,而没有改变 View 的响应区域。这时以 ObjectAnimator、ValueAnimator 为代表的属性动画也就应运而生了。
圆号本昊
2021/09/24
3.4K0
Android 属性动画框架 ObjectAnimator、ValueAnimator ,这一篇就够了
初识属性动画——使用Animator创建动画
ViewAnimation只支持几种动画:scale、transition、rotate、alpha四种类型。并且缺陷是只是改变了显示位置,实际位置并没有改变。 一个demo解释一切,如下图:
用户1108631
2019/08/17
7310
Android动画-Property Animation
Property Animation故名思议就是通过动画的方式改变对象的属性了,所以他也是功能最为强大的,可以这样说前面的帧动画和视图动画能做到的,他都能做到,并且更为强大
码客说
2019/10/22
3930
Android入门之动画
Android动画 AlphaAnimation RelativeLayout rl_splash = (RelativeLayout) findViewById(R.id.rl_splash); //播放动画效果 AlphaAnimation animation = new AlphaAnimation(1.0f, 0.0f); //设置Alpha动画的持续时间 animation.setDuration(2000); //播放Alpha动画 rl_splash.setAnimation(animati
xiangzhihong
2018/01/26
7990
Android开发之属性动画
Android动画主要分为3种 View动画(Android开发之View动画) 帧动画(Android开发之帧动画) 属性动画 何为属性动画? 通过改变对象的属性以达到动画的效果,API 11以上可以用,如果想兼容旧版本请使用 https://github.com/JakeWharton/NineOldAndroids 。属性动画的默认的时间为300ms,它可以在时间间隔内完成对象从一个属性值到另外一个属性值的改变。比较常用的属性动画对象有: ValueAnimator,ObjectAnimator,
YungFan
2018/04/24
8310
Android开发之属性动画
让View跟随状态动起来——StateListAnimator
StateListAnimator定义了一组动画,可以根据View drawable的状态进行不同的切换。所谓状态指的是statepressed、stateenabled等这些状态。 Android提供的drawable中,其中有一种就是selector,只不过那种是指定的图片,而StateListAnimator指定的动画。 不说废话,先看下效果:
用户1108631
2019/08/17
1.9K0
相关推荐
Android 动画总结(5) - 属性动画
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验