属性动画,就是通过控制对象中的属性值产生的动画。属性动画是目前最高级的2D动画系统。

在API Level 11中添加。Property Animation号称能控制一切对象的动画,包括可见的和不可见的。

但是,日常开发中我们一般都是对UI定制动画。

使用ObjectAnimator

ObjectAnimator是其中比较容易使用的一个动画类,它继承自ValueAnimator,

说比较容易使用是因为它在动画启动后自动监视属性值的变化并把值赋给对象属性,

而ValueAnimator则只监视属性值的变化,但不会自动在属性中应用该值,因此我们需要手动应用这些值。

代码:

//创建一个水平移动的动画对象,从位置0到300平移
final ObjectAnimator translation = ObjectAnimator.ofFloat(tv, "translationX", 0f, 300f);
translation.setDuration(1500);

只需两行就可以创建一个简单可运行的移动动画。

当然还有其他setxxx()方法可以控制动画的高级行为。

例如:添加一个插值器等

translation.setInterpolator(new AccelerateDecelerateInterpolator());

运行效果:

使用ValueAnimator

ValueAnimtor动画的创建基本上和ObjectAnimator一样,只是我们需要手动应用属性值

代码:

final ValueAnimator translation = ValueAnimator.ofFloat(0f, 300f);
translation.setDuration(1500);

有点不一样的是在创建对象的时候,ValueAnimator无需指定属性名称

只需指定动画的执行范围。

上面我们已经说了,ValueAniamtor不会自动应用属性值,因此我们需要添加一个动画监听器

translation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener()
{
@Override
public void onAnimationUpdate(ValueAnimator animation)
{
tv.setTranslationX((float) animation.getAnimatedValue());
}
});

tv是我们需要执行动画的对象,这里是一个TextView对象。

要使tv对象的动画执行,我们就要在监听器中使用对应setxxx方法更新tv的属性值,

而这些值我们可以使用animation对象的getAnimatedValue方法获得。

使用动画监听器执行不同的任务

通过监听器我们可以在动画的不同状态执行不同的任务

translation.addListener(new Animator.AnimatorListener()
{
@Override
public void onAnimationStart(Animator animation)
{ } @Override
public void onAnimationCancel(Animator animation)
{ } @Override
public void onAnimationRepeat(Animator animation)
{ } @Override
public void onAnimationEnd(Animator animation)
{ }
});

例如:我们可以在前一个动画执行完毕之后执行另一个动画

translation.addListener(new Animator.AnimatorListener()
{
@Override
public void onAnimationStart(Animator animation)
{ } @Override
public void onAnimationCancel(Animator animation)
{ } @Override
public void onAnimationRepeat(Animator animation)
{ } @Override
public void onAnimationEnd(Animator animation)
{
ObjectAnimator rotation = ObjectAnimator.ofFloat(tv, "rotation", 0f, 360f);
rotation.setDuration(1500);
rotation.start();
}
});

执行效果:

使用PropertyValuesHolder控制多个对象属性

例如我们对某个对象进行缩放控制的时候,就需要同时改变对象的x轴和y轴的值

这个时候我们就可以使用ObjectAnimator的ofPropertyValuesHolder()方法配合PropertyValuesHolder对象

//把按钮放大1.5倍
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("scaleX", 1f, 1.5f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleY", 1f, 1.5f);
final ObjectAnimator scale = ObjectAnimator.ofPropertyValuesHolder(btnStart, pvhX, pvhY); final ValueAnimator translation = ValueAnimator.ofFloat(0f, 300f);
translation.setDuration(1500);
btnStart.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v)
{
//执行放大动画
scale.start();
translation.start();
}
});

运行效果:

使用Keyframe对象控制多属性动画

Keyframe对象对多属性动画的控制更加灵活,因为我们可以更好地控制每个时间段执行的动画距离

        Keyframe keyframe0 = Keyframe.ofFloat(0f, 0);
Keyframe keyframe1 = keyframe.ofFloat(.3f, 100);
Keyframe keyframe2 = keyframe.ofFloat(.4f, 200);
Keyframe keyframe3 = keyframe.ofFloat(1f, 200);
        PropertyValuesHolder pvhM = PropertyValuesHolder.ofKeyframe("translationX", keyframe0,keyframe1, keyframe2,keyframe3);
final ObjectAnimator trans = ObjectAnimator.ofPropertyValuesHolder(tv, pvhM);
trans.setDuration(1500);
final ValueAnimator translation = ValueAnimator.ofFloat(0f, 300f);
translation.setDuration(1500);
btnStart.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v)
{
//执行放大动画
scale.start();
trans.start();
//translation.start();
}
});

代码分析:

每个keyframe变量第一个参数执行总时间0%~100%,0表示动画未执行,1代码动画执行完毕

keyframe0代表动画在0%时的位置

keyframe1代表动画在30%时所处的位置

keyframe2代表动画在最后一个时间段所处的位置

keyframe3代表在200个单位距离时动画完成已经停止,加上这一行是为了动画停止后对象不会消失

运行效果:

上面的图片虽然不是看得很清楚,但是可以看见在最后一段时间动画突然加快。

原因是我们在定义最后一个keyframe的时候是用10%的时间走100个单位距离,

即它要在最短的时间走最多的距离,所以它必须加快速度才能完成这个任务。

不加keyframe3时的运行效果:

完整代码:

package com.whathecode.propertyanimation;

import android.animation.Animator;
import android.animation.Keyframe;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.animation.ValueAnimator;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView; public class MainActivity extends ActionBarActivity
{ @Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); final TextView tv = (TextView) findViewById(R.id.tv); Button btnStart = (Button) findViewById(R.id.start);
/* //创建一个水平移动的动画对象,从位置0到300平移
final ObjectAnimator translation = ObjectAnimator.ofFloat(tv, "translationX", 0f, 300f);
translation.setDuration(1500);
*/ //把按钮放大1.5倍
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("scaleX", 1f, 1.5f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleY", 1f, 1.5f);
final ObjectAnimator scale = ObjectAnimator.ofPropertyValuesHolder(btnStart, pvhX, pvhY); Keyframe keyframe0 = Keyframe.ofFloat(0f, 0);
        Keyframe keyframe1 = keyframe.ofFloat(.3f, 100);
Keyframe keyframe2 = keyframe.ofFloat(.4f, 200);
Keyframe keyframe3 = keyframe.ofFloat(1f, 200);
PropertyValuesHolder pvhM = PropertyValuesHolder.ofKeyframe("translationX", keyframe0,keyframe1, keyframe2,keyframe3);
final ObjectAnimator trans = ObjectAnimator.ofPropertyValuesHolder(tv, pvhM);
trans.setDuration(1500);
final ValueAnimator translation = ValueAnimator.ofFloat(0f, 300f);
translation.setDuration(1500);
btnStart.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v)
{
//执行放大动画
scale.start();
trans.start();
//translation.start();
}
}); translation.addListener(new Animator.AnimatorListener()
{
@Override
public void onAnimationStart(Animator animation)
{ } @Override
public void onAnimationCancel(Animator animation)
{ } @Override
public void onAnimationRepeat(Animator animation)
{ } @Override
public void onAnimationEnd(Animator animation)
{
ObjectAnimator rotation = ObjectAnimator.ofFloat(tv, "rotation", 0f, 360f);
rotation.setDuration(1500);
rotation.start();
}
}); translation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener()
{
@Override
public void onAnimationUpdate(ValueAnimator animation)
{
tv.setTranslationX((float) animation.getAnimatedValue());
}
});
}
}

使用属性动画 — Property Animation的更多相关文章

  1. Android动画主要包含补间动画(Tween)View Animation、帧动画(Frame)Drawable Animation、以及属性动画Property Animation

    程序运行效果图: Android动画主要包含补间动画(Tween)View Animation.帧动画(Frame)Drawable Animation.以及属性动画Property Animatio ...

  2. 使用属性动画 — Property Animation

    属性动画,就是通过控制对象中的属性值产生的动画.属性动画是目前最高级的2D动画系统. 在API Level 11中添加.Property Animation号称能控制一切对象的动画,包括可见的和不可见 ...

  3. Android 动画——属性动画Property Animation

    Android在3.0之前只提供了两种动画:View Animation .Drawable Animation .也就是我们在<Android 动画——Frame Animation与Twee ...

  4. 属性动画(Property Animation)

    属性动画系统是一个强大的可以绘制任意事物.你可以定义改变物体属性的动画,不管它是不是在屏幕上.属性动画随着时间的推移去改变物体的属性.如果要让某个事物动起来,你只需指定该事物的某个属性,如物体的坐标. ...

  5. 属性动画Property Animation

    ViewPropertyAnimation 使用方式:View.animate() 后跟 translationX() 等方法,动画会自动执行. 注意translationX实现是调用对应的set方法 ...

  6. Android(java)学习笔记263:Android下的属性动画(Property Animation)

    1. 属性动画(Property Animation)引入: 在手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系统在一开始的时候就给我们提供了两种实现动画效果的方式,逐帧动画(fra ...

  7. Android(java)学习笔记207:Android下的属性动画(Property Animation)

    1. 属性动画(Property Animation)引入: 在手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系统在一开始的时候就给我们提供了两种实现动画效果的方式,逐帧动画(fra ...

  8. Android动画:模拟开关按钮点击打开动画(属性动画之平移动画)

    在Android里面,一些炫酷的动画确实是很吸引人的地方,让然看了就赏心悦目,一个好看的动画可能会提高用户对软件的使用率.另外说到动画,在Android里面支持3种动画: 逐帧动画(Frame Ani ...

  9. 【转】android 属性动画之 ObjectAnimator

    原文网址:http://blog.csdn.net/feiduclear_up/article/details/39255083 前面一篇博客讲解了 android 简单动画之 animtion,这里 ...

随机推荐

  1. iOS 证书Bug The identity used to sign the executable is no longer valid 解决方案

    现象:The identity used to sign the executable is no longer valid Please verify that your device’s cloc ...

  2. SharePoint 2013 搭建app本地开发环境

    使用SharePoint App,如果要通过应用程序目录分发 SharePoint 相关应用程序,如具有完全控制权限的 SharePoint 相关应用程序(无法部署到 Office 365 网站),则 ...

  3. SharePoint 2013 必备组件之 Windows Server AppFabric 安装错误

    1.如下图,在使用SharePoint2013产品准备工具的时候,网上下载安装Windows Server AppFabric的时候,报错,点击完成重启计算机,重新安装依然报错. 2.无奈之下,只有选 ...

  4. 『SharePoint』Content Editor Webpart不能添加引用_layouts下面的文件

    好久没写了,最近没怎么学到新东西,倒是犯了一个很常见的错误,那就是试图在content editor webpart中添加位于_layouts下面的一个txt文件,虽然这个txt中只是几行简单的htm ...

  5. iOS开发--引用计数与ARC

    以下是关于内存管理的学习笔记:引用计数与ARC. iOS5以前自动引用计数(ARC)是在MacOS X 10.7与iOS 5中引入一项新技术,用于代替之前的手工引用计数MRC(Manual Refer ...

  6. Android自定义View4——统计图View

    1.介绍 周末在逛慕课网的时候,看到了一张学习计划报告图,详细记录了自己一周的学习情况,天天都是0节课啊!正好在学习Android自定义View,于是就想着自己去写了一个,这里先给出一张慕课网的图,和 ...

  7. OC 单例模式

    OC 单例模式 概念 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约 ...

  8. 基于物理渲染的渲染器Tiberius计划

    既然决定实现一个光栅化软件渲染器,我又萌生了一个念头:实现一个基于物理渲染的渲染器.

  9. 偏移:translate ,旋转:rotate,缩放 scale,不知道什么东东:lineCap 实例

    <!DOCTYPE HTML> <head> <meta charset = "utf-8"> <title>canvas</ ...

  10. ImageView的ScaleType属性

    ImageView的ScaleType各种值代表的意义: CENTER:不进行任何缩放,将图片放在容器中间 CENTER_CROP:如果图片长宽都大于等于容器长宽,则图片不缩放,否则按固定长宽比缩放, ...