Android Animations简介

一 、Animations简介

  Animations提供了一系列的动画效果,这些效果可以应用于绝大多数的控件;

二、Animations的分类
  第一类:TweenedAnimations,该类Animations提供了旋转,移动,淡入淡出和缩放等效果;
  第二类:Frame-by-Frame Animations,这类Animations可以创建一个Drawable序列,这些Drawable可以按照指定的时间间歇一个个的显示;


TweenedAnimations介绍
(1)TweenedAnimations可以分为下面几类:

  1. Alpha:淡入淡出效果
  2. Scale:缩放效果
  3. Rotate:旋转效果
  4. Translate:移动效果

(2)Animations的使用方法:
  一种是在Java代码中使用,另一种是定义在XML文件中;

(3)在Java代码中使用步骤为:
  a) 创建一个AnimationSet对象;
  b)根据需要创建相应的Animation对象;
  c)根据软件动画的需求,为Animation对象设置相应的数据;
  d)将Animation对象添加到AnimationSet对象当中;
  e)使用控件对象开始执行AnimationSet;

而Animation在代码中对应的四个子类分别为:
  AlphaAnimation、TranslateAnimation、ScaleAnimation、RotateAnimation

 

例子:

 

效果图不好传,就不传了;

 

代码如下:

activity_main.xml

<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.xiaozhang.animationtest.MainActivity" >

    <Button
        android:id="@+id/scaleButtonId"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:text="scale动画效果" />

    <Button
        android:id="@+id/rotateButtonId"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@id/scaleButtonId"
        android:text="rotate动画效果" />

    <Button
        android:id="@+id/alphaButtonId"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@id/rotateButtonId"
        android:text="alpha动画效果" />

    <Button
        android:id="@+id/translateButtonId"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@id/alphaButtonId"
        android:text="translate动画效果" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/imageViewId"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="100dp"
            android:src="@drawable/icon" />
    </LinearLayout>

</RelativeLayout>

 

MainActivity.java

package com.xiaozhang.animationtest;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;

public class MainActivity extends Activity {

    private ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.imageViewId);
        imageView = (ImageView) findViewById(R.id.imageViewId);
        findViewById(R.id.rotateButtonId).setOnClickListener(
                new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        AnimationSet animationSet = new AnimationSet(true);
                        RotateAnimation rotateAnimation = new RotateAnimation(
                                0, 360, Animation.RELATIVE_TO_PARENT, 0.3f,
                                Animation.RELATIVE_TO_PARENT, 0.3f);
                        rotateAnimation.setDuration(1000);
                        animationSet.addAnimation(rotateAnimation);
                        imageView.startAnimation(animationSet);

                    }
                });
        findViewById(R.id.scaleButtonId).setOnClickListener(
                new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        AnimationSet animationSet = new AnimationSet(true);
                        ScaleAnimation scaleAnimation = new ScaleAnimation(1,
                                0.0f, 1, 0.0f, Animation.RELATIVE_TO_PARENT,
                                0.1f, Animation.RELATIVE_TO_PARENT, 0.1f);
                        scaleAnimation.setDuration(1000);
                        animationSet.addAnimation(scaleAnimation);
                        imageView.startAnimation(animationSet);

                    }
                });
        findViewById(R.id.alphaButtonId).setOnClickListener(
                new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        // 创建一个AnimationSet对象
                        AnimationSet animationSet = new AnimationSet(true);
                        // 创建一个AlphaAnimation对象
                        AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);
                        // 设置整个动画执行所需要的时间
                        alphaAnimation.setDuration(2000);
                        // 将AlphaAnimation对象添加到AnimationSet当中
                        animationSet.addAnimation(alphaAnimation);
                        // 使用控件执行动画效果
                        imageView.startAnimation(alphaAnimation);

                    }
                });
        findViewById(R.id.translateButtonId).setOnClickListener(
                new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        AnimationSet animationSet = new AnimationSet(true);
                        TranslateAnimation translateAnimation = new TranslateAnimation(
                                Animation.RELATIVE_TO_SELF, 0f,
                                Animation.RELATIVE_TO_SELF, 0.5f,
                                Animation.RELATIVE_TO_SELF, 0f,
                                Animation.RELATIVE_TO_SELF, 1.0f);
                        translateAnimation.setDuration(1000);
                        animationSet.addAnimation(translateAnimation);
                        imageView.startAnimation(translateAnimation);

                    }
                });
    }
}

 

另外,Animation或AnimationSet有一系列的方法,如:

  setDuration(long) :设置动画持续时间(单位:毫秒)

  setFillAfter(boolean) :如果参数为true,则动画执行结束后,控件将停留在结束的状态

  setFillBefore(boolean) :如果参数为true,则动画执行结束后,控件将回到执行前的状态

  setStartOffset(long) :设置动画执行前的等待时间

  setRepeatCount(int) :设置动画重复执行的次数

 

(4)使用XML文件来执行Animation;

  a)在res文件夹下新建一个名为anim的文件夹;

  b)为各个不同的效果分别创建xml文件,并首先加入set标签,标签代码如下:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator" >

</set>

  c)在该标签中分别加入rotate,alpha,scale或translate标签;

  d)在代码当中使用AnimationUtils装载xml文件,并生成Animation对象;

 

例子如上,代码如下:

res/anim/alpha.xml

<?xml version="1.0" encoding="UTF-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator" >

    <alpha
        android:duration="500"
        android:fromAlpha="1.0"
        android:startOffset="1000"
        android:toAlpha="0.0" />

</set>

res/anim/scale.xml

<?xml version="1.0" encoding="UTF-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator" >

    <scale
        android:duration="2000"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="0.0"
        android:toYScale="0.0" />

</set>

res/anim/rotate.xml

<?xml version="1.0" encoding="UTF-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator" >

    <rotate
        android:duration="3000"
        android:fromDegrees="0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="+350" />

</set>

res/anim/translate.xml

<?xml version="1.0" encoding="UTF-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator" >

    <translate
        android:fromXDelta="50%"
        android:toXDelta="100%"
        android:fromYDelta="0%"
        android:toYDelta="100%"
        android:duration="2000"
        />

</set>

 

MainActivity.java

package com.xiaozhang.animationtest;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;

public class MainActivity extends Activity {

    private ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.imageViewId);
        imageView = (ImageView) findViewById(R.id.imageViewId);
        findViewById(R.id.rotateButtonId).setOnClickListener(
                new OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        Animation animation = AnimationUtils.loadAnimation(
                                MainActivity.this, R.anim.rotate);
                        imageView.startAnimation(animation);
                    }
                });
        findViewById(R.id.scaleButtonId).setOnClickListener(
                new OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        Animation animation = AnimationUtils.loadAnimation(
                                MainActivity.this, R.anim.alpha);
                        imageView.startAnimation(animation);

                    }
                });
        findViewById(R.id.alphaButtonId).setOnClickListener(
                new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Animation animation = AnimationUtils.loadAnimation(
                                MainActivity.this, R.anim.scale);
                        imageView.startAnimation(animation);
                    }
                });
        findViewById(R.id.translateButtonId).setOnClickListener(
                new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Animation animation = AnimationUtils.loadAnimation(
                                MainActivity.this, R.anim.translate);
                        imageView.startAnimation(animation);
                    }
                });
    }
}

 

不过需注意的是:

rotate.xml文件中android:pivotX的值共有三种设置方法:

  1.android:pivotX="50" 这种方法使用绝对位置定位;

  2.android:pivotX="50%" 这种方法相对于控件本身定位;

  3.android:pivotx="50%p" 这种方法相对于控件的父控件定位;

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。