Android中动画与属性动画

1、动画(Animation)

传统动画中,有位移、旋转、缩放、透明度变化等动画,如以下代码移动一个图片控件

TranslateAnimation animation = new TranslateAnimation(0, 200, 0, 0);animation.setDuration(1000);animation.setFillAfter(true);//使控件停留到动画结束的位置,若不设置则返回原来位置iv.startAnimation(animation);

但iv的属性却留在了原地。iv的事件响应只在原来位置生效。而属性动画这可以实现属性随控件移动,如下句:

ObjectAnimator.ofFloat(iv, "translationX", 0, 200).setDuration(1000).start();

这句与以上代码会有相同的动画效果,且iv的响应事件也会跟随控件移动。

translationX或者translationY都是指控件的偏移量,也可以使用X,Y 指的是控件位置变化,如下句:

ObjectAnimator.ofFloat(iv, "Y", 0, 200).setDuration(1000).start();

这个方法的第二个参数是指控件中有get,set方法的属性名。只要有get与set方法就可以使用这种方法操作。如下句:

ObjectAnimator.ofFloat(iv, "rotation", 0, 360).setDuration(1000).start();

翻转360度

而若这三个动画放到一起,如下:

ObjectAnimator.ofFloat(iv, "rotation", 0, 360).setDuration(1000).start();ObjectAnimator.ofFloat(iv, "Y", 0, 200).setDuration(1000).start();ObjectAnimator.ofFloat(iv, "translationX", 0, 200).setDuration(1000).start();

则图片将会同时执行这三个动画,而不会执行一个后在执行另一个。这种效果也可以用以下方式;

PropertyValuesHolder p1=PropertyValuesHolder.ofFloat("rotation", 0, 360);PropertyValuesHolder p2=PropertyValuesHolder.ofFloat( "Y", 0, 200);PropertyValuesHolder p3=PropertyValuesHolder.ofFloat("translationX", 0, 200);

ObjectAnimator.ofPropertyValuesHolder(iv,p1,p2,p3).setDuration(1000).start();

以下也同样可以做到

ObjectAnimator a1 = ObjectAnimator.ofFloat(iv, "rotation", 0, 360);ObjectAnimator a2 = ObjectAnimator.ofFloat(iv, "Y", 0, 200);ObjectAnimator a3 = ObjectAnimator.ofFloat(iv, "translationX", 0, 200);

AnimatorSet set = new AnimatorSet();set.playTogether(a1,a2,a3);set.setDuration(1000);set.start();

以上三种方法都是三个动画同时执行,若要按照顺序执行,这应该为:

ObjectAnimator a1 = ObjectAnimator.ofFloat(iv, "rotation", 0, 360);ObjectAnimator a2 = ObjectAnimator.ofFloat(iv, "Y", 0, 200);ObjectAnimator a3 = ObjectAnimator.ofFloat(iv, "translationX", 0, 200);

AnimatorSet set = new AnimatorSet();set.playSequentially(a1,a2,a3);set.setDuration(1000);set.start();

当然也可以指定动画配合,设置几个同时执行,或者执行一个后在执行另外两个,如以下:

ObjectAnimator a1 = ObjectAnimator.ofFloat(iv, "rotation", 0, 360);ObjectAnimator a2 = ObjectAnimator.ofFloat(iv, "Y", 0, 200);ObjectAnimator a3 = ObjectAnimator.ofFloat(iv, "translationX", 0, 200);AnimatorSet set = new AnimatorSet();set.play(a1).with(a2).before(a3);set.setDuration(1000);set.start();

导致的效果就是,先旋转并向下,之后在向右移动

添加属性动画的监听事件:

ObjectAnimator a4 = ObjectAnimator.ofFloat(iv, "alpha", 0, 1);

a4.addListener(new Animator.AnimatorListener() {    @Override    public void onAnimationStart(Animator animation) {        LLogUtils.log();    }

@Override    public void onAnimationEnd(Animator animation) {        LLogUtils.log();        ToastUtil.show("结束了!!");    }

@Override    public void onAnimationCancel(Animator animation) {        LLogUtils.log();    }

@Override    public void onAnimationRepeat(Animator animation) {        LLogUtils.log();    }});

a4.setDuration(1000);a4.start();

或者使用另一种无需全部实现的listener

ObjectAnimator a4 = ObjectAnimator.ofFloat(iv, "alpha", 0, 1);

a4.addListener(new AnimatorListenerAdapter() {    @Override    public void onAnimationEnd(Animator animation) {        ToastUtil.show("结束了");        LLogUtils.log();    }});

a4.setDuration(1000);a4.start();

这样,可以自己选择要处理的事件并重写指定的方法,一般是结束时的事件。

下面,是一个实例,展示多个如元优酷APP的菜单的展开和回收,先看效果图。

就是这样一个效果。

布局文件:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:padding="20dp"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent">
  6. <ImageView
  7. android:src="@drawable/h"
  8. android:id="@+id/iv1"
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"/>
  11. <ImageView
  12. android:src="@drawable/g"
  13. android:id="@+id/iv2"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"/>
  16. <ImageView
  17. android:id="@+id/iv3"
  18. android:src="@drawable/f"
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"/>
  21. <ImageView
  22. android:src="@drawable/e"
  23. android:id="@+id/iv4"
  24. android:layout_width="wrap_content"
  25. android:layout_height="wrap_content"/>
  26. <ImageView
  27. android:src="@drawable/d"
  28. android:id="@+id/iv5"
  29. android:layout_width="wrap_content"
  30. android:layout_height="wrap_content"/>
  31. <ImageView
  32. android:src="@drawable/c"
  33. android:id="@+id/iv6"
  34. android:layout_width="wrap_content"
  35. android:layout_height="wrap_content"/>
  36. <ImageView
  37. android:src="@drawable/b"
  38. android:id="@+id/iv7"
  39. android:layout_width="wrap_content"
  40. android:layout_height="wrap_content"/>
  41. <ImageView
  42. android:src="@drawable/a"
  43. android:id="@+id/iv8"
  44. android:layout_width="wrap_content"
  45. android:layout_height="wrap_content"/>
  46. </FrameLayout>

代码文件:

package com.linwoain.test;

import android.animation.ObjectAnimator;import android.os.Bundle;import android.view.View;import android.view.animation.AccelerateInterpolator;import android.view.animation.BounceInterpolator;import android.widget.ImageView;import com.linwoain.ui.LinActivity;import com.linwoain.util.LLogUtils;import com.linwoain.util.ToastUtil;

import java.util.ArrayList;import java.util.List;

public class MainActivity extends LinActivity implements View.OnClickListener {

private int[] res = {R.id.iv8, R.id.iv1, R.id.iv2, R.id.iv3, R.id.iv4, R.id.iv5, R.id.iv6, R.id.iv7};    private List<ImageView> imageViews = new ArrayList<ImageView>();    private boolean flag=true;

/**     * Called when the activity is first created.     */    @Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);        setContentView(R.layout.main);        LLogUtils.log();

for (int i = 0; i < res.length; i++) {            ImageView iv = (ImageView) findViewById(res[i]);            iv.setOnClickListener(this);            imageViews.add(iv);        }

}

@Override    public void onClick(View v) {

switch (v.getId()) {

case R.id.iv8:                if (flag) {                    startAnim();                } else {                    closeAnim();                }                break;            default:                ToastUtil.show(v.hashCode()+"");                break;        }

}

private void closeAnim() {

for (int i = 1; i < res.length; i++) {            ObjectAnimator animator = ObjectAnimator.ofFloat(imageViews.get(i), "translationY", 110 * i, 0);            animator.setDuration(500);            animator.setStartDelay(i * 300);            animator.start();            animator.setInterpolator(new AccelerateInterpolator());        }        flag = true;

}

private void startAnim() {

for (int i = 1; i < res.length; i++) {            ObjectAnimator animator = ObjectAnimator.ofFloat(imageViews.get(i), "translationY", 0, 110 * i);            animator.setDuration(500);            animator.setStartDelay(i * 300);            animator.setInterpolator(new BounceInterpolator());//插值器            animator.start();        }        flag=false;    }}

注意,动画中可以设置插值器,以实现特殊的效果,如动画运行中加速,减速,回弹等。可以参考apidemos中animation中的Interpolator

来自为知笔记(Wiz)

时间: 2024-10-29 00:21:09

Android中动画与属性动画的相关文章

Android开发实战之补间动画和属性动画

说起动画,其实一点也不陌生,在使用一款app的时候为了优化用户体验,多多少少的,都会加入动画. 安卓中的动画,分为两大类:补间动画和属性动画.本篇博文会详细介绍总结这两大动画,希望本篇博文对你的学习和生活有所帮助. **补间动画** 补间动画分为四类:平移动画,旋转动画,缩放动画和渐变动画.这几类动画用法都差不多,只是对象参数不同这里我统一展示出来.以下是效果图: 实现代码很简单: btn1.setOnClickListener(new View.OnClickListener() { @Ove

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

在Android里面,一些炫酷的动画确实是很吸引人的地方,让然看了就赏心悦目,一个好看的动画可能会提高用户对软件的使用率.另外说到动画,在Android里面支持两种动画:补间动画和属性动画,至于这两种动画的区别这里不再介绍,希望开发者都能在使用的过程中体会两者的不同. 本文使用属性动画完成,说到属性动画,肯定要提到 JakeWharton大神写的NineOldAndroids动画库,如果你的app需要在android3.0以下使用属性动画,那么这个库就很有作用了,如果只需要在高版本使用,那么直接

Android图文详解属性动画

Android中的动画分为视图动画(View Animation).属性动画(Property Animation)以及Drawable动画.从Android 3.0(API Level 11)开始,Android开始支持属性动画,本文主要讲解如何使用属性动画.关于视图动画可以参见博文<Android四大视图动画图文详解>. 概述 视图动画局限比较大,如下所述: 视图动画只能使用在View上面. 视图动画并没有真正改变View相应的属性值,这导致了UI效果与实际View状态存在差异,并导致了一

Android动画学习(缓动动画与属性动画的区别)

前言: 在 Android动画学习(概述)中,如果你看过这篇帖子,你应该会对缓动动画和属性动画之间的区别产生疑问,因为在它们的应用中,你会感觉这两种动画有着一些相似的地方,为此,我打算把这两种动画之间的区别做一下说明 区别: 在这里先附上官方文档对于这两种动画的区别说明(我所说的缓动动画对应在下文中的英文为:View Animation,属性动画对应在下文中的英文为:Property Animation): How Property Animation Differs from View Ani

Android图文具体解释属性动画

Android中的动画分为视图动画(View Animation).属性动画(Property Animation)以及Drawable动画.从Android 3.0(API Level 11)開始.Android開始支持属性动画,本文主要解说怎样使用属性动画. 关于视图动画能够參见博文<Android四大视图动绘图文具体解释>. 概述 视图动画局限比較大.例如以下所述: 视图动画仅仅能使用在View上面. 视图动画并没有真正改变View相应的属性值,这导致了UI效果与实际View状态存在差异

安卓中的动画之属性动画(1)

属性动画(Property Aniamtion)是在谷歌新推出的一种动画. 1.什么是属性动画? 属性动画,顾名思义,就是操作属性的动画.在这里可能有人要问什么是操作的属性?想想以前我们学习的动画--变换动画,可以更改动画显示的各种形态,看上去非常炫酷:布局动画,可以更改activity跳转你的动画:帧动画,就是flash动画一样.我们在使用这些动画时,特别是变换动画时,有没有想过,假如一个imageview有一个监听事件,而我们使用变换动画更换了imageview的位置时,此时我们想要实现这个

Android动画之属性动画

当我们看到别人的APP里面或者写的Demo里面的一些很牛逼得动画效果的时候,是否会有那么一种冲动我要看看它的源代码到底是怎么写的,为毛我就是写不出这样的动画效果呢,为毛我只能做哪些简单的平移,缩放,旋转,透明度改变的动画效果呢.呵呵,当你这么想的时候,证明你应该存在两种主要的问题:第一,就是你的确基础知识不过关,别人用到的东西,你根本就没有接触过,但是这些东西的确是API里面确实存在的东西.第二,就是你的经验不够,逻辑思维能力还有待提升.任何一个很酷很炫的动画效果,都应该是由一系列的动画效果合成

Android中的补间动画(tween)的简单使用

相对帧动画,补间动画(tween)可以这么理解:我们不必像帧动画一样指定动画的每一帧,只需定义一个动画的开始和结束关键帧,而中间变化的帧由系统帮我们计算. tween动画可以分为下面几种: AlphaAnimation(透明渐变动画): 示例:res/anim/alpha.xml <?xml version="1.0" encoding="utf-8"?> <alpha xmlns:android="http://schemas.andr

Android中RelativeLayout各个属性的含义

androidlayout android:layout_above="@id/xxx"        --将控件置于给定ID控件之上 android:layout_below="@id/xxx"        --将控件置于给定ID控件之下 android:layout_toLeftOf="@id/xxx"     --将控件的右边缘和给定ID控件的左边缘对齐 android:layout_toRightOf="@id/xxx&quo

Android中RelativeLayout各个属性

Android中RelativeLayout各个属性 android:layout_alignParentLeft=”true”找不到有时候 2014年09月05日 ⁄ 综合 ⁄ 共 945字 ⁄ 字号 小 中 大 ⁄ 评论关闭 android:layout_above="@id/xxx"  --将控件置于给定ID控件之上android:layout_below="@id/xxx"  --将控件置于给定ID控件之下 android:layout_toLeftOf=&