您的位置:首页 > 移动开发 > Android开发

Android动画详解

2015-09-24 19:09 519 查看
领卓教育培训第七十二天

View Animation

View Animation比较简单,只能支持简单的缩放、平移、旋转、透明度基本的动画,且有一定的局限性。

在代码中实现

①首先得到你想要实现动画效果的实例:

[code]AlphaAnimation animation1=new AlphaAnimation(0.0f,1.0f);
                TranslateAnimation animation2=new TranslateAnimation(-imageView.getMeasuredWidth(),0,0,0);
                RotateAnimation animation3=new RotateAnimation(0,360,imageView.getMeasuredWidth(),imageView.getMeasuredHeight());
ScaleAnimation animation4=new ScaleAnimation(1,1.5f,1,1.5f);


AlphaAnimation表示透明,传入的第一个参数表示开始透明度,第二个表示结束透明度。

TranslateAnimation表示位移,前两个参数表示位移的开始和结束位置X坐标,后两个表示位移的开始和结束位置Y坐标。

RotateAnimation表示旋转,第一个参数表示旋转开始角度,第二个表示旋转结束角度,后两个表示旋转中心点的坐标。

ScaleAnimation表示放缩,前两个参数表示X轴开始和结束放缩的比例,后两个参数表示Y轴开始和结束放缩的比例。

②然后设置动画的一些参数,持续时间,重复次数等。

[code]animation.setDuration(5000);


③最后调用start()方法,启动动画

[code]imageView.startAnimation(animation)


注意

如果想要实现多种动画效果的结合,就要使用AnimationSet来实现。

[code]AnimationSet animationSet=new AnimationSet(false);//得到AnimationSet实例
AlphaAnimation animation1=new AlphaAnimation(0.0f,1.0f);
TranslateAnimation animation2=new TranslateAnimation(-imageView.getMeasuredWidth(),0,0,0);
RotateAnimation animation3=new RotateAnimation(0,360,imageView.getMeasuredWidth(),imageView.getMeasuredHeight());
ScaleAnimation animation4=new ScaleAnimation(1,1.5f,1,1.5f);
animationSet.addAnimation(animation1);//加入各种动画效果
animationSet.addAnimation(animation2);
animationSet.addAnimation(animation3);
animationSet.addAnimation(animation4);
animationSet.setDuration(5000);//设置动画持续时间
imageView.startAnimation(animationSet);//开始动画


在XML文件中实现

①首先在res文件夹下新建anim文件夹,然后在其新建xml

比如,实现一个旋转动画:

[code]<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/bounce_interpolator">
    <rotate
        android:duration="5000"
        android:fromDegrees="0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="360"></rotate>
</set>


②然后调用AnimationUtils类的loadAnimation()静态方法返回一个Animation的对象,最后调用start()方法即可

[code]Animation animation= AnimationUtils.loadAnimation(getApplicationContext(),R.anim.animation_rotate);
imageView.startAnimation(animation);


Property Animation(属性动画)

Property Animation就是通过动画的方式改变对象的属性。它有两个执行类ObjectAnimator和ValueAnimator,下面就对ObjectAnimator做一些简单的了解。

在代码中实现

ObjectAnimator的用法非常简单,比如实现一个简单的旋转动画

[code]ObjectAnimator.ofFloat(imageView,"rotation",0f,360f)
                        .setDuration(3000)
                        .start();


这样即可实现一个旋转动画,其中的第二个参数就是对view设置的动画效果。

在XML中实现

①首先在res文件下新建一个animator文件,然后新建

比如实现一个旋转动画

[code]<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:duration="3000"
        android:propertyName="rotation"
        android:valueFrom="0"
        android:valueTo="360"></objectAnimator>
</set>


②首先调用AnimatorInflater类的loadAnimator()静态方法返回一个Animator对象,然后调用setTarget()方法设置要设置该动画效果的View,最后调用start()方法,启动动画。

[code]Animator animator=AnimatorInflater.loadAnimator(getApplicationContext(), R.animator.animator_rotation);
animator.setTarget(imageView);
animator.start();


Layout Animations(布局动画)

布局动画主要使用LayoutTransition类为布局的容器设置动画,当容器中的视图层次发生变化时存在过渡的动画效果。

用法

[code]LayoutTransition transition = new LayoutTransition();
transition.setAnimator(LayoutTransition.APPEARING,animator);
transition.setAnimator(LayoutTransition.DISAPPEARING,animator);        transition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING,                       
       transition.getAnimator(LayoutTransition.CHANGE_DISAPPEARING));              transition.setAnimator(LayoutTransition.CHANGE_APPEARING,      
       transition.getAnimator(LayoutTransition.CHANGE_APPEARING));


过渡的动画效果的分类:

1. LayoutTransition.APPEARING 当一个View在ViewGroup中出现时,对此View设置的动画

2. LayoutTransition.CHANGE_APPEARING 当一个View在ViewGroup中出现时,对此View对其他View位置造成影响,对其他View设置的动画

3. LayoutTransition.DISAPPEARING 当一个View在ViewGroup中消失时,对此View设置的动画

4. LayoutTransition.CHANGE_DISAPPEARING 当一个View在ViewGroup中消失时,对此View对其他View位置造成影响,对其他View设置的动画

代码示例

我们在布局中加入一个按钮和一个GridLayout,点击按钮向GridLayout中添加按钮。

[code]<LinearLayout 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:orientation="vertical"
    tools:context=".MainActivity">
    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="向布局中添加按钮" />
    <GridLayout
        android:id="@+id/gridlayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:columnCount="3"></GridLayout>
</LinearLayout>


同样的,我们自定义一个动画效果,用于对此View的添加效果:

[code]<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:duration="3000"
        android:propertyName="rotation"
        android:valueFrom="0"
        android:valueTo="360"></objectAnimator>
</set>


最后是主活动中的代码:

[code]import android.animation.Animator;
import android.animation.AnimatorInflater;
import android.animation.LayoutTransition;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.GridLayout;

public class MainActivity extends AppCompatActivity {
    private GridLayout gridLayout;
    private int count;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        gridLayout= (GridLayout) findViewById(R.id.gridlayout);
        Animator animator= AnimatorInflater.loadAnimator(getApplicationContext(), R.animator.animator_rotation);
        LayoutTransition transition = new LayoutTransition();
        transition.setAnimator(LayoutTransition.CHANGE_APPEARING,
                transition.getAnimator(LayoutTransition.CHANGE_APPEARING));
        transition.setAnimator(LayoutTransition.APPEARING,
                animator);
        transition.setAnimator(LayoutTransition.DISAPPEARING,
                animator);
        transition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING,
                transition.getAnimator(LayoutTransition.CHANGE_DISAPPEARING));
        gridLayout.setLayoutTransition(transition);
        Button button= (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                count++;
                final Button btn=new Button(getApplicationContext());
                ViewGroup.LayoutParams params=new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
                btn.setLayoutParams(params);
                btn.setText("按钮"+count);
                int position=Math.min(1, gridLayout.getChildCount());
                gridLayout.addView(btn,position);
                btn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        gridLayout.removeView(btn);
                    }
                });
            }
        });
    }
}


实现效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: