运行效果图:

先看布局文件吧,activity_main.xml:

 <?xml version="1.0" encoding="utf-8"?>
<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="com.example.administrator.animatordemo.MainActivity"> <ImageView
android:id="@+id/iv_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:scaleType="centerCrop"
android:src="@mipmap/ic_launcher_round" /> <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:orientation="vertical"> <Button
android:id="@+id/btn_click1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_gravity="center"
android:text="startAnimator1" /> <Button
android:id="@+id/btn_click2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_gravity="center"
android:text="startAnimator2" /> <Button
android:id="@+id/btn_click3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_gravity="center"
android:text="startAnimator3" /> </LinearLayout> </RelativeLayout>

然后看JAVA代码,MainActivity.java:

 package com.example.administrator.animatordemo;

 import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button btn_click1;
private Button btn_click2;
private Button btn_click3;
private ImageView iv_icon; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
} private void initView() {
iv_icon = (ImageView) findViewById(R.id.iv_icon);
btn_click1 = (Button) findViewById(R.id.btn_click1);
btn_click1.setOnClickListener(this);
btn_click2 = (Button) findViewById(R.id.btn_click2);
btn_click2.setOnClickListener(this);
btn_click3 = (Button) findViewById(R.id.btn_click3);
btn_click3.setOnClickListener(this);
} @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_click1:
startAnimator1();//这样写,三个动画会同时执行
break;
case R.id.btn_click2:
startAnimator2();//效果同startAnimator1()一致,要是和第一种相比较,更推荐此方法
break;
case R.id.btn_click3:
startAnimator3();
break;
}
} /**
* 旋转动画:rotation
* 水平动画:translationX
* 垂直动画:translationY
*/
private void startAnimator1() {
ObjectAnimator.ofFloat(iv_icon, "rotation", 0F, 200F).setDuration(1000).start();
ObjectAnimator.ofFloat(iv_icon, "translationX", 0F, 200F).setDuration(1000).start();
ObjectAnimator.ofFloat(iv_icon, "translationY", 0F, 200F).setDuration(1000).start();
} private void startAnimator2() {
PropertyValuesHolder p1 = PropertyValuesHolder.ofFloat("rotation", 0F, 200F);
PropertyValuesHolder p2 = PropertyValuesHolder.ofFloat("translationX", 0F, 200F);
PropertyValuesHolder p3 = PropertyValuesHolder.ofFloat("translationY", 0F, 200F);
ObjectAnimator.ofPropertyValuesHolder(iv_icon, p1, p2, p3).setDuration(1000).start();//第一个参数是控件对象,后面参数是可变长数组
} private void startAnimator3() {
ObjectAnimator animator1 = ObjectAnimator.ofFloat(iv_icon, "rotation", 0F, 200F);
ObjectAnimator animator2 = ObjectAnimator.ofFloat(iv_icon, "translationX", 0F, 200F);
ObjectAnimator animator3 = ObjectAnimator.ofFloat(iv_icon, "translationY", 0F, 200F);
AnimatorSet set = new AnimatorSet();
// set.playTogether(animator1, animator2, animator3);//三个动画同时执行
set.playSequentially(animator1, animator2, animator3);//三个动画按顺序执行
set.setDuration(1000);
set.start();
}
}

说明一下,在startAnimator3()这个方法当中,AnimatorSet集合除了playTogether和playSequentially两个方法外,还有play方法。比如它可以这样使用:

set.paly(animator2).with(animator3);
set.play(animator1).after(animator2);

这种效果的话,则是会先进行“水平动画和垂直动画”同时执行,然后再执行旋转动画。通过with(),after(),甚至还有before()方法这样一些方法,我们就可以做到这样一个属性集合详细的顺序处理。

是不是强大的功能呢?这种方式,也是属性动画里面使用最多的一种方式。

Android属性动画简单剖析的更多相关文章

  1. Android属性动画-简单实例

    1.ValueAnimator //在2000毫秒内,将值从0过渡到1的动画 ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f); anim.setD ...

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

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

  3. Android属性动画之ValueAnimation

    ValueAnimation是ObjectAnimation类的父类,经过前几天的介绍,相信大家对ObjectAnimation有了 一定的认识,今天就为大家最后介绍一下ValueAnimation, ...

  4. Android属性动画完全解析(下)

    转载:http://blog.csdn.net/guolin_blog/article/details/44171115 大家好,欢迎继续回到Android属性动画完全解析.在上一篇文章当中我们学习了 ...

  5. Android属性动画完全解析(上),初识属性动画的基本用法

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/43536355 在手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系 ...

  6. Android属性动画完全解析(中)

    转载:http://blog.csdn.net/guolin_blog/article/details/43536355 大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法,当然也是 ...

  7. Android属性动画完全解析(上)

    Android属性动画完全解析(上) 转载:http://blog.csdn.net/guolin_blog/article/details/43536355 在手机上去实现一些动画效果算是件比较炫酷 ...

  8. Android 属性动画(Property Animation) 全然解析 (下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38092093 上一篇Android 属性动画(Property Animatio ...

  9. Android 属性动画 源码解析 深入了解其内部实现

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/42056859,本文出自:[张鸿洋的博客] 我参加了博客之星评选,如果你喜欢我的博 ...

随机推荐

  1. js实现仿华为手机计算器,兼容电脑和手机屏幕

    效果图: 电脑端: 手机端: 源码: <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  2. Spark之Scala学习

    1. Scala集合学习: http://blog.csdn.net/lyrebing/article/details/20362227 2. scala实现kmeans算法 http://www.t ...

  3. (转)pt-online-schema-change在线修改表结构

    原文:http://www.ywnds.com/?p=4442 一.背景 MySQL大字段的DDL操作:加减字段.索引.修改字段属性等,在5.1之前都是非常耗时耗力的,特别是会对MySQL服务产生影响 ...

  4. Failed to create prime the NuGet cache

    在centos 7上使用dotnet core时: dotnet core 安装环境在root下完成,并成功运行“hello world”程序.切换到其他账户使用dotnet命令时,报“Failed ...

  5. Centos 7 安装 Visual stdio Code

    最近微软正式发布了.net code 和asp.net code.尝试了下在linux下.net code和asp.net code使用. 具体怎么使用.net code 和asp.net code ...

  6. python中使用eval() 和 ast.literal_eval()的区别 分类: Python 2015-05-11 15:21 1216人阅读 评论(0) 收藏

    eval函数在python中做数据类型的转换还是很有用的.它的作用就是把数据还原成它本身或者是能够转化成的数据类型. 那么eval和ast.literal_val()的区别是什么呢? eval在做计算 ...

  7. switch开关

    1.开关按钮 效果如下图 2.css代码 .form-switch{ display: inline-block; } .form-switch input[type="checkbox&q ...

  8. WPF中List的Add()与Insert()方法的区别

    先来看看定义: // Summary: // Adds an object to the end of the System.Collections.Generic.List<T>. // ...

  9. 生成类似于MongoDB产生的ObjectId

    package com.jt.boot.utils; import com.google.common.base.Objects; import java.net.NetworkInterface; ...

  10. Mycat常见错误

    Mycat常见错误 1.  问题: schema myinvoice didn't config tables,so you must set dataNode property! 解决:在schem ...