Android动画——属性动画

一、概述

  Android在API11后加入的新特性,主要通过对对象的属性动态改变实现动画效果,也因此大大扩展了作用对象,并且由于直接对属性进行变换,动画效果也更丰富。主要有ValueAnimator、ObjectAninmator、AnimatorSet等概念。

二、属性动画的分类及使用

  1、ObjectAnimator 继承自ValueAnimator,使用举例如下

ObjectAnimator.ofFloat(button,"translationY",100).setDuration(2000).start();

    传入作用对象,属性名称、变化值,并可设置相关参数,最后调用start开始动画。

  2、ValueAnimator 可以改变任意一个属性,但没有作用对象,只产生属性值的变化,使用时可以为其添加监听。属性动画的监听接口主要有两个,AnimateUpdateListener和AnimateListener。其中前者为逐帧监听,后者则是监听不同的四个状态,与View动画的监听类似。

     在使用该对象时,可以在AnimateUpdateListener的监听方法中逐帧获得Animator的属性值,由此动态的设置动画的作用对象实现动画效果。代码如下:

        ValueAnimator colorAnim = ObjectAnimator.ofInt(this,"backgroundColor",0xFFFF8080,0xFF8080FF);
        colorAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                int colorValue = (int) animation.getAnimatedValue();
                button.setBackgroundColor(colorValue);
            }
        });
        colorAnim.setDuration(3000);
        colorAnim.setEvaluator(new ArgbEvaluator());
        colorAnim.setRepeatCount(ValueAnimator.INFINITE);
        colorAnim.setRepeatMode(ValueAnimator.REVERSE);
        colorAnim.start();

    由此可对任意属性进行动画,除此之外还有两种不同的方法实现任意属性动画。

    其中getAnimatedValue是获得当前进度值,与创建对象时传入的始末值有关,除此之外还可以利用Evaluator(估算器)计算得到所需的属性值,代码如下

                float fraction = animation.getAnimatedFraction();

                target.getLayoutParams().width = intEvaluator.evaluate(fraction,start,end);
                target.requestLayout();

    通过获得getAnimatedFraction获得fraction,再利用IntEvaluator对象传入fraction、start(属性初值),end(属性末值)计算得到当前属性值,由此也可以使用自定义的Evaluator来计算属性值得到更灵活的动画效果。

    requestLayout是当View确定自身已不适合现有区域时,调用该方法重新完成measure和layout过程以刷新位置。

  3、AnimatorSet 动画集合,顾名思义,可设置多个动画效果,使用很简单,如下

 AnimatorSet set = new AnimatorSet();
        set.playTogether(ObjectAnimator.ofFloat(/*设置动画效果及对象*/),
                ObjectAnimator.ofFloat(/*设置动画效果及对象*/),
                ObjectAnimator.ofInt(/*设置动画效果及对象*/));
        set.setDuration(5000).start();

  除此之外,属性动画也可通过XML定义。简单介绍使用的标签及属性。

  属性动画定义在res/animator 目录下。

  标签<set> 属性 ordering(together/squentially)动画集合中的动画的播放顺序。

  标签<objectAnimator> 属性 propertyName 属性名称、durantion 持续时间、valueFrom、valueTo、startOffset (int)延迟时间,repeatCount 重复次数、repeatMode(repeat/reverse)重复模式、valueType(intType/floatType)颜色属性不需指定。

  标签<animator> 与<objectAnimator>类似,无propertyName属性。

  定义完成后通过以下代码使用属性动画

    AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(this,R.anim.animation_test);
        set.setTarget(mButton);
        set.start();

  在实际开发中,由于XML定义的方式无法获得属性的初始值,所以一般采用代码的方式使用属性动画。

三、插值器Interpolator和估值器Evaluator

  在属性动画中,属性随时间的变化由插值器和估算器共同决定。

  1、Interpolator 与View动画中的类似。在属性动画中,Interpolator返回的是属性的改变比例,参数为时间的变化比例。如时间流逝50%时,返回此时属性的变化比例。

  2、Evaluator 内部的evaluate方法接受三个参数,fraction、start、end,根据三者计算得到属性值,其中fraction即属性值的变化比例。

  自定义插值器实现Interpolator或者TimeInterpolator,自定义估算器则实现TypeEvaluator,如果是对其他类型(除int、float、Color外)做动画,则必须要自定义类型估算算法。

四、对任意属性做动画

  属性动画要求动画对象具有属性的get和set方法,其中get方法用于获取属性的起始值,set方法则用于动画执行过程中动态的对属性进行赋值。所以当View无法提供这两个方法或者提供的方法无法对需要的属性进行设置(如Button的setWidth方法)时,就不可以直接使用属性动画(ObjectAnimator)。

  未解决上述问题共有三种方法

  1、为对象添加get和set方法,该方法对于系统提供的View来说无法实现。

  2、用一个类包装原始对象,间接为其提供get和set方法,步骤如下    

    //包装类,为View提供自定义的get和set方法
    private static class ViewWrapper{
        private View target ;

        ViewWrapper(View target){
            this.target = target;
        }

        public int getWidth(){
            return target.getLayoutParams().width;
        }
        public void setWidth(int width){
            target.getLayoutParams().width = width;
            target.requestLayout();
        }
    }

  3、使用ValueAnimator,上文已介绍。

五、属性动画的工作原理

六、注意事项

  1、OOM问题

  2、内存泄露

    对于属性动画中无限循环的动画需在Activity退出时及时的关闭动画,否则会因Activity无法释放而造成内存泄漏

  3、兼容性问题

  4、不要使用px

  5、动画元素交互

    在API11之后,属性动画的效果是可以真实改变View的位置的,而View则只改变影响,所以事件响应会有问题。

  6、View动画的问题

    由于View动画是对View的影像进行操作,所以有时候会出现动画完成后View无法隐藏的情况,此时只要调用clearAnimation清除动画效果即可。

  7、硬件加速

    为了系统顺畅,动画效果建议开启硬件加速。

时间: 2024-09-27 17:08:22

Android动画——属性动画的相关文章

android的属性动画

原文作者:Google 原文地址:https://developer.android.com/guide/topics/graphics/prop-animation.html 原文版权:Creative Commons 2.5 Attribution License 译文作者:Jianan - [email protected] 版本信息:本文基于2016-06-17版本翻译 译文版权:CC BY-NC-ND 4.0,允许复制转载,但必须保留译文作者署名及译文链接,不得演绎和用于商业用途 前言

Android之属性动画、值动画

Android属性动画 什么是Android属性动画 同类技术对比 补间动画Tween Animation 帧动画Frame Animation 属性动画Property Animation 属性动画组成部分相关类介绍 ObjectAnimator对象动画执行类 介绍 示例 ValueAnimator 值动画执行类 介绍 示例 PropertyValuesHolder 属性存储器 介绍 示例 Keyframe 关键帧 介绍 示例 AnimatorSet 执行集合类 介绍 示例 AnimatorU

Android动画--属性动画Property Animation

简介 属性动画包含: ObjectAnimator 动画的执行类 ValueAnimator 动画的执行类 AnimatorSet 用于控制一组动画的执行:线性,一起,每个动画的先后执行等. AnimatorInflater 用户加载属性动画的xml文件 ObjectAnimator 单一属性动画 缩放X轴:ScaleX ObjectAnimator().ofFloat(imageView,"ScaleY",1.0f,0.0f).setDuration(3000).start(); 缩

android学习(属性动画扇形菜单栏)

1 public class TestActivity extends Activity implements OnClickListener{ 2 private int[] res={R.id.imageView1,R.id.imageView2,R.id.imageView3,R.id.imageView4,R.id.imageView5,R.id.imageView6}; 3 private List<ImageView> list=new ArrayList<ImageView

Android用属性动画拖动view到任意位置

直接上图: 代码: package me.waye; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.app.Activity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.widget.ImageVie

Android笔记(六十五) android中的动画——属性动画(propertyanimation)

补间动画只能定义起始和结束两个帧在“透明度”.“旋转”.“倾斜”.“位移”4个方面的变化,逐帧动画也只能是播放多个图片,无法满足我们日常复杂的动画需求,所以谷歌在3.0开始,推出了属性动画(property animation) 属性动画已经不再是针对View来设计的了,也不仅限定于只能实现移动.缩放.淡入淡出这几种动画操作,同时也不再是一种视觉上的动画效果了.它实际上是一种不断的对值进行操作的机制,并将值赋值到指定对象的指定属性上,可以是任意对象的任意属性. ValueAnimator Val

Android之属性动画(一)

一.概述 Android平台中常用的动画主要有两类,一类是View动画,一类是3.0后新增的属性动画.属性动画与View动画相比功能更加强大,主要体现在以下两个方面: 1.  属性动画不仅仅能应用到View上,还可以应用到Object对象上. 2.  属性动画将会真正改变Object对象属性的值. 如此强大的动画,我们没有理由不去学习使用,下面我们就根据API文档的介绍开始学习如何使用属性动画. 二.属性动画的学习与使用 首先我们要先了解属性动画的一些关键属性,文档中给出了这么几个: Durat

android动画——属性动画(Property Animation)

视图动画请移步:http://blog.csdn.net/u013424496/article/details/51700077 相对与视图动画 ,属性动画(android3.0提出的) 使用条件: 完全弥补了View anim System的缺陷,你可以为一个对象的任何属性添加动画,(View或者非View),同时对象自己也会被修改. 并且当属性变化的时候,property Anim系统会自动的刷新屏幕. 属性动画系统在处理动画方面也更加强劲.更高级的,你可以指定动画的属性,比如颜色,位置,大

android之属性动画和布局动画详解

1.属性动画是什么不废话,不懂的可以百度一下参考郭霖大神的动画详解篇:这里仅仅提供一个demo说说用法,抛砖引玉,代码的注释写的已经很详细,不再多说废话,一下提供的是一个基础的demo,讲解的是objectAnimator的基础用法,如平移.旋转.缩放.渐变以及动画的集合:至于objectAnimator(必须的有set get方法)和valueAnimator的详细区别也可参考郭霖大神的动画详解篇 2.除此基本用法,还有估值器和插值器 (1)插值器:动画速率的变换,有点类似物理的加速度,就是该