Android 动画——属性动画Property Animation
Android在3.0之前只提供了两种动画:View Animation 、Drawable Animation 。也就是我们在《Android 动画——Frame Animation与Tween Animation 》讲解的逐帧动画和补间动画。android在3.0之后又增加了一种动画类型:Property Animation属性动画 。
View Animation相当简单,不过只能支持简单的缩放、平移、旋转、透明度基本的动画,且有一定的局限性。比如:你希望View有一个颜色的切换动画;你希望可以使用3D旋转动画;你希望当动画停止时,View的位置就是当前的位置;这些View Animation都无法做到。这就是Property Animation产生的原因,本篇博客详细介绍Property Animation的用法。
相关API
相关属性:
Duration:动画的持续时间,默认300ms。
Interpolation:时间差值,定义动画的变化率。
RepeatCount:重复次数,可以定义重复多少次。
RepeatMode:重复模式,重复播放时,是从头开始播还是反向播。
Animator sets: 动画集合,你可以定义一组动画,一起执行或者顺序执行。
Frame refresh delay:帧刷新延迟,动画多久刷新一次帧;默认为10ms。
相关类:
ValueAnimator 动画的执行类。
ObjectAnimator 动画的执行类,ValueAnimator的子类。
AnimatorSet 用于控制一组动画的执行:线性,一起,每个动画的先后执行等。
AnimatorInflater 用户加载属性动画的xml文件。
TypeEvaluator 类型估值,主要用于设置动画操作属性的值。
TimeInterpolator 时间插值。
Animator
Animator是动画属性的基类(父类),我们先看一下它的继承结构:
Animator有两个子类:
ValueAnimator :是属性动画的时间引擎,主要用于为属性动画计算相关属性的值。它也包含两个子类:ObjectAnimator,TimeAnimator 。
AnimatorSet:用于组合多个Animator。
ValueAnimator的使用
ValueAnimator使用代码创建和它的子类ObjectAnimator使用代码创建是有区别的。这里先声明一下,在下面讲解到ObjectAnimator我们会具体的说明。ValueAnimator使用代码创建步骤如下:
1. 首先调用ValueAnimator如下的静态方法设置相关的属性值:
这里我们调用ofFloat(float… values)属性传入动画在X轴上变化的数值。
2. ValueAnimator对象调用setTarget()方法,设置动画实现在哪个对象的身上。
3. ValueAnimator对象调用setDuration()和start()设置动画的显示时间和开始动画。
4. 调用addUpdateListener()方法,在这个监听器中添加相关的操作。
我们来看具体的代码操作:
xml布局文件:(一个按钮开始动画,一个ImageView显示动画)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"> <LinearLayout
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"> <Button
android:id="@+id/button_start"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="开始动画" /> </LinearLayout>
<ImageView
android:id="@+id/imageview_xml"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_centerInParent="true"
android:layout_gravity="center"
android:onClick="startAnimation"
android:src="@mipmap/ic_launcher" /> </RelativeLayout>
Activity代码实现:
public class XMLAnimationActivity extends Activity implements View.OnClickListener { private Button mButtonStart;
private ImageView mImageView; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_xmlanimation);
mButtonStart = (Button) findViewById(R.id.button_start);
mImageView = (ImageView) findViewById(R.id.imageview_xml);
mButtonStart.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button_start:
//在代码中创建
ValueAnimator animator = ValueAnimator.ofFloat(0.0f, 1.0f);//设置属性值
animator.setTarget(mImageView);//设置操作对象
animator.setDuration(1000).start();//动画开始
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
mImageView.setScaleY((Float) animation.getAnimatedValue());//设置Y轴上的变化
mImageView.setScaleX((Float) animation.getAnimatedValue());//设置X轴上的变化
}
});
break;
default:
break;
}
}
}
ObjectAnimator的使用
ObjectAnimator创建有两种方式,一种是在Java代码中添加,一种是使用加载xml布局添加。
java代码中创建
在Activity中添加一句话:
ObjectAnimator.ofFloat(mImageView, "ScaleX", 0.0f, 1.0f).setDuration(3000).start();
ObjectAnimator提供了ofInt、ofFloat、ofObject,这几个方法都是设置动画作用的元素、作用的属性、动画开始、结束、以及中间的任意个属性值。当对于属性值,只设置一个的时候,会认为当然对象该属性的值为开始(getPropName反射获取),然后设置的值为终点。如果设置两个,则一个为开始、一个为结束。
动画更新的过程中,会不断调用setPropName更新元素的属性,所有使用ObjectAnimator更新某个属性,必须得有getter(设置一个属性值的时候)和setter方法。
xml文件中创建
为了减轻java代码的负担,我们将对动画的设置定义在xml代码中。
1. 首先在res文件夹下创建一个animator的文件夹。
2. 在animator文件夹下创建一个animator.xml的文件。我们在该xml文件下对动画属性定义。
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:duration="3000"
android:propertyName="scaleX"
android:valueFrom="0.5f"
android:valueTo="1.0f">
</objectAnimator>
</set>
3. 在Activity中:
//使用xml文件加载属性动画方式一
Animator anim = AnimatorInflater.loadAnimator(this, R.animator.animator);//通过该方法,将xml文件导入
anim.setTarget(mImageView);//这是动画的对象
anim.start();//设置动画的开始
以下为补充:
其实在之前还有一种调用方式:在ImageView中添加android:onClick="startAnimation"
属性,然后再Activity中定义如下方法:
注意:该方法已被抛弃,因为他增加了xml布局文件与java文件的耦合性,违背了”高内聚,低耦合“的原则。
public void startAnimation(View view) {
//java代码中设置属性操作
ObjectAnimator.ofFloat(mImageView, "TranslationZ", 0.0f, 1.0f).setDuration(3000).start();
}
public void startAnimation(View view) {
//xml文件中设置属性操作
Animator anim = AnimatorInflater.loadAnimator(this, R.animator.animator);
anim.setTarget(mImageView);
anim.start();
}
ObjectAnimator与ValueAnimator的不同
我们可以先回顾一下ValueAnimator的使用:
ValueAnimator animator = ValueAnimator.ofFloat(0.0f, 1.0f);//设置属性值
animator.setTarget(mImageView);//设置操作对象
animator.setDuration(1000).start();//动画开始
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
mImageView.setScaleY((Float) animation.getAnimatedValue());//设置Y轴上的变化
mImageView.setScaleX((Float) animation.getAnimatedValue());//设置X轴上的变化
}
});
ObjectAnimator使用:
ObjectAnimator.ofFloat(mImageView, "ScaleX", 0.0f, 1.0f).setDuration(3000).start();
区别很明显,ValueAnimator调用ofFloat()方法设置了操作的值,而没有设置是何种操作,也就是没有设置操作属性。而ObjectAnimator调用ofFloat()方法设置了操作属性是ScaleX(X轴变化)。
ValueAnimator有没有设置操作的属性,也就是说我们必须在addUpdateListener()方法中定义的监听器中添加相关的属性,否则动画没有任何的操作。那么ValueAnimator这样有什么好处呢?
好处就是,我们不需要操作的对象的属性一定要有getter和setter方法,你可以自己根据当前动画的计算值,来操作任何属性。
Android 动画——属性动画Property Animation的更多相关文章
- Android动画效果之Property Animation进阶(属性动画)
前言: 前面初步认识了Android的Property Animation(属性动画)Android动画效果之初识Property Animation(属性动画)(三),并且利用属性动画简单了补间动画 ...
- Android物业动画研究(Property Animation)彻底解决具体解释
前p=1959">Android物业动画研究(Property Animation)全然解析具体解释上已经基本展示了属性动画的核心使用方法: ObjectAnimator实现动画 ...
- 【属性动画总结】Property Animation
属性动画概述 3.0以前,android仅支持两种动画模式,tweened animation 和 frame-by-frame animation,在android3.0中又引入了一个新的动画系统: ...
- android 帧动画,补间动画,属性动画的简单总结
帧动画——FrameAnimation 将一系列图片有序播放,形成动画的效果.其本质是一个Drawable,是一系列图片的集合,本身可以当做一个图片一样使用 在Drawable文件夹下,创建ani ...
- 属性动画总结(Property Animation)
一.概述 属性动画可以作用在View的属性上,对属性进行修改,而且不要求对应的属性一定是有显示效果的. 二.属性动画的实现方式 1.基础的类Animator Animator是一个抽象类,是属性动画的 ...
- 【属性动画示例】Property Animation
MainActivity 属性动画常用操作 // 可操控的属性有:alpha:x/y:scaleX/scaleY:rotation/rotationX/rotationY:transitionX/tr ...
- Android 用属性动画自定义view的渐变背景
自定义view渐变背景,同时监听手势自动生成小圆球. 宿主Activity如下: package com.edaixi.tempbak; import java.util.ArrayList; imp ...
- Android笔记(六十五) android中的动画——属性动画(propertyanimation)
补间动画只能定义起始和结束两个帧在“透明度”.“旋转”.“倾斜”.“位移”4个方面的变化,逐帧动画也只能是播放多个图片,无法满足我们日常复杂的动画需求,所以谷歌在3.0开始,推出了属性动画(prope ...
- android使用属性动画代替补间动画
本文参考Android属性动画完全解析(上),初识属性动画的基本用法 android3.0之前一共有两种动画,分别是frame动画和tween动画,关于这两种动画如果不了解可以查看我之前的文章andr ...
随机推荐
- NTP算法
网络时间协议 由特拉华大学的David L. Mills热心提供.http://www.eecis.udel.edu/~mills mills@udel.edu 由Reinhard v. Hanxle ...
- 关于真多核和加多核&线程由哪几部分组成
网上查的资料小结,没有考证. 真多核是指一个cpu多个核心,即多个内核. 假多核是指多个cpu捆绑形成的分布式计算,ARM针对服务器市场推出的处理器为多个cpu的 真多核的应用奔腾和因特尔 双核芯cp ...
- C/C++面试题目一
C/C++开发工程师面试题目(一)(附答案分析) 推荐:自己根据在面试中碰到做过的一些题目以及总结的题目,希望对面试的同学有所帮助. 一. 选择题 1. 下列类中( )不是输入输出流类iostrea ...
- 三、ansible简要使用
1.ansible服务器生成公钥与私钥 ssh-keygen -t rsa 2.拷贝ansible公钥到客户机上 ssh-copy-id -i root@192.168.1.1 3.添加主机到ansi ...
- hdu 1907(Nim博弈)
John Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submis ...
- [转载]DirectX SDK (June 2010)安装错误S1023,解决方法
导致这个错误的原因是在安装DirectX SDK (June 2010)之前.我就安装了VS2010 . 所以也就安装了: Microsoft Visual C++ 2010 x86 Redistri ...
- WordPress 用户管理插件 WP User Manager
WP User Manager 是一个较新的用户管理插件,可以在前端实现 用户注册.登录.找回密码.修改个人资料.修改密码等功能,如果你在找这方面的插件,WP User Manager 应该是一个不错 ...
- Java学习(final、static关键词)
final关键词 概念:final的意思为最终,不可变.final是个修饰符,它可以用来修饰类,类的成员,以及局部变量.不能修饰构造方法. 特点: 1.final修饰的类不可以被继承,但可以继承别的类 ...
- copy深浅拷贝
我们在很多方法里都看到copy()方法,这是对变量的复制,赋值,下面来看一下实例: 复制方法调用的是copy模块中的方法: import copy copy.copy() #前拷贝 c ...
- virtualenv python的虚拟环境
官网:https://virtualenv.pypa.io/en/stable/userguide/ virtualenv通过创建独立Python开发环境的工具, 来解决依赖.版本问题 基本使用: d ...