Android-4-动画

本文深入介绍了Android中的两种动画技术:逐帧动画和补间动画。逐帧动画通过连续播放多张图片实现动态效果,而补间动画则通过对View内容进行平移、旋转、缩放和透明度变化来创造动画效果。文章详细展示了如何在XML和代码中定义这两种动画,并给出了实际应用示例,帮助开发者更好地理解和运用Android动画机制。
摘要由CSDN通过智能技术生成

1.逐帧动画(frame-by- frame animation)

把几张图片快速播放形成一个动画的效果
(1)在drawable文件下new一个Drawable Source File,selector类型的那种
然后把文件的selector改成animation-list,

<animation-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/frame1" android:duration="120"/>
    <item android:drawable="@drawable/frame2" android:duration="120"/>
</animation-list>

duration,是指当前图片显示多少毫秒,每张图片显示的时间可以不一样。
(2)这个xml放在drawable中,相当于一个图片。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rl"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/frame1"
    />

设置为某个布局的背景
(3)然后
//获取动画的Drawable资源
AnimationDrawable anim = (AnimationDrawable) relativeLayout.getBackground();
//启动动画
anim.start();
//停止动画
anim.stop();
通过点击事件,设置动画的启动和停止

RelativeLayout relativeLayout = findviewById(R.id.rl);
Animat ionDrawable anim = (Animat ionDrawable) relativeLayout.getBackground();
relat ivel ayout . setonClickl istener(new view.OnClickL istener() {
@override
public void onClick(View v) {
    if (flag) {
              anim. start(); 
              flag = false;
              } 
         else {
              anim. stop();
              flag = true;
              }
 }

});

(4)通过代码创建逐帧动画

 

 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = (ImageView) findViewById(R.id.tv);
        //获取AnimationDrawable对象
        AnimationDrawable a = new AnimationDrawable();
        imageView.setBackground(a);
        //在AnimaionDrawable中添加一帧,并为其指定图片和播放时长
        a.addFrame(getResources().getDrawable(R.drawable.girl_1), 200);
        a.addFrame(getResources().getDrawable(R.drawable.girl_2), 200);
        a.addFrame(getResources().getDrawable(R.drawable.girl_3), 200);
        //循环播放
        a.setOneShot(false);
        //播放Frame动画
        a.start();
    }

2.补间动画(Tween Animation)

补间动画是通过对View中的内容进行一系列的图形变换来实现动画效果,其中图形变换包括平移、缩放、旋转、改变透明度等。

通常情况下以XML形式定义的动画都会放置在程序res/anim(自定义)的文件下

Android提供了4钟补间动画,分别是透明度渐变动画(AiphaAnimation)、旋转动画(Rotate Animation)、缩放动画(ScaleAnimation)、平移动画(TranslateAnimation)。

(1)透明度渐变动画(AiphaAnimation)

在res下创建一个anim的文件夹,然后new Animation Source  File,先建一个alpha相关的,

透明度渐变动画是指通过改变View组件透明度来实现的渐变效果。它主要通过为动画指定开始时的透明度、结束时的透明度以及动画持续时间来创建动画,在XML文件中定义

alpha_animation.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android :interpolator="@android:anim/linear_interpolator"
        android :repeatMode="reverse"
        android :repeatCount="nfinite"
        android :duration="1000"
        android :fromAlpha="1.0"
        android :toAlpha="0.0"/>
</set>

View从完全不透明到透明、持续时间为1s的动画。

<1>interpolator:用于控制动画的变化速度,一般值为@android:anim/linear_interpolator(匀速改变)、@android:anim/laccelerate_interpolator(开始慢、后来加速)等

<2>repeatMode:用于指定动画重复的方式,可选值为reverse(反向)、restart(重新开始)

<3>repeatCoun:用于指定动画重复的次数,属性值可以为正整数,也可以为infinite(无限循环)

<4>duration:用于指定动画播放时长

<5>fromAlpha:用于指定动画开始时的透明度,0.0为完全透明,1.0为完全不透明

<6>toAlpha:用于指定动画结束时的透明度,0.0为完全透明,1.0为完全不透明

(2)旋转动画(Rotate Animation)

旋转动画就是通过动画指定开始时的旋转角度、结束时的旋转角度以及动画播放时长来创建动画的。

rotate_animation.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <rotate
        android:fromDegress="0"
        android:toDegress="360"
        android:pivotX="50%"
        android:pivotY="50"
        android:repeatMode="reverse"
        android:repeatCount="infinite"
        android:duration="1000"/>
</set>

<1>fromDegress:指定动画开始时的角度

<2>toDegress:指定动画结束时的角度

<3>pivotX:指定轴心的X坐标

<4>pivotY:指定轴心的y坐标,这里xy占的是百分比

(3)缩放动画(ScaleAnimation)

缩放动画就是通过为动画指定开始时的缩放系数、结束时的缩放系数以及动画持续时长来创建动画的

scale_animation.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:pivotX="50%"
        android:pivotY="50"
        android:repeatMode="reverse"
        android:repeatCount="infinite"
        android:duration="3000"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:toXScale="0.5"
        android:toYScale="0.5"
        android:pivotX="50%"
        android:pivotY="50%"/>
</set>

<1>fromXScale:指定动画开始时x轴上的缩放系数,值为1.0表示不变

<2>fromYScale:指定动画开始时y轴上的缩放系数,值为1.0表示不变

<3>toXScale:指定动画结束时x轴上的缩放系数,值为0.5表示缩小为原来的0.5倍

<4>toYScale:指定动画结束时y轴上的缩放系数,值为0.5表示缩小为原来的0.5倍

<5>pivotX(Y)::表示缩放的xy中心点

(4)平移动画(TranslateAnimation)

平移动画就是通过为动画指定开始位置、结束位置以及动画持续时长来创建动画的

translate_animation.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:repeatMode="reverse"
        android:repeatCount="infinite"
        android:duration="4000"
        android:fromXDelta="0.0"
        android:fromYDelta="0.0"
        android:toXDelta="100"
        android:toYDelta="0.0"/>
</set>

上述代码定义了一个让View从起始x(0)位置平移到x(100)位置,持续时间为4s的平移动画,需要注意的是,这里的坐标不是屏幕像素的坐标,而是相对于View的所在位置定义的坐标。开始位置为0.0即表示在View最开始的地方平移(即布局文件定义View所在的位置)

<1>fromXDelta:指定动画开始时View的x坐标

<2>fromYDelta:指定动画开始时View的y坐标

<3>toXDelta:指定动画结束时View的x坐标

<4>toYDelta:指定动画结束时View的y坐标

(5)然后在xml文件中定义布局,一个ImageView和4个按钮,分别显示不同的效果。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginBottom="5dp">
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_baseline_add_box_24"
        android:layout_centerInParent="true"
        android:id="@+id/iv_bean"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true">

        <Button
            android:id="@+id/btn_one"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="渐变"/>

        <Button
            android:id="@+id/btn_two"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="旋转"/>
        <Button
            android:id="@+id/btn_three"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="缩放"/>
        <Button
            android:id="@+id/btn_four"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="移动"/>
    </LinearLayout>

</RelativeLayout>

(6)然后在.java中写四个加载动画的方法

private ImageView ivBean=(ImageView)findViewById(R.id.iv_bean);
    
    public void onClick(View v){
        switch(v.getId()){
            case R.id.btn_one:
                //调用AnimationUtils的loadAnimation()方法加载动画
                //单击按钮使图片渐变
                Animation alpha= AnimationUtils.loadAnimation(this,R.anim.alpha_animation);
                ivBean.setAnimation(alpha);
                break;
            case R.id.btn_two:
                //调用AnimationUtils的loadAnimation()方法加载动画
                //单击按钮使图片旋转
                Animation rotate= AnimationUtils.loadAnimation(this,R.anim.rotate_animation);
                ivBean.setAnimation(rotate);
                break;
            case R.id.btn_three:
                //调用AnimationUtils的loadAnimation()方法加载动画
                //单击按钮使图片缩放
                Animation scale= AnimationUtils.loadAnimation(this,R.anim.scale_animation);
                ivBean.setAnimation(scale);
                break;
            case R.id.btn_four:
                //调用AnimationUtils的loadAnimation()方法加载动画
                //单击按钮使图片移动
                Animation translate= AnimationUtils.loadAnimation(this,R.anim.translate_animation);
                ivBean.setAnimation(translate);
                break;
        }
    }

(7)补间动画也可以在代码中定义,需要用到AlphhaAnimation、ScaleAnimation、TranslateAnimation和RotateAnimation类

private ImageView ivBean;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ivBean = (ImageView) findViewById(R.id.iv_bean);
        //创建一个渐变透明度的动画,从透明到完全不透明
        AlphaAnimation alphaAnimation = new AlphaAnimation(0.0f, 1.0f);
        //设置动画播放时长
        alphaAnimation.setDuration(5000);
        //动画重复方式
        alphaAnimation.setRepeatMode(AlphaAnimation.REVERSE);
        //动画重复次数
        alphaAnimation.setRepeatCount(AlphaAnimation.INFINITE);
        ivBean.startAnimation(alphaAnimation);
    }

其他3钟补间动画也可以用这种方式定义。 

3.属性动画(property animation)

(1)ValueAnimator

listener是更新监听

(2)ObjectAnimator

(3)监听器

 

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值