3月29日动画(逐帧、补间、属性)

本文详细介绍了Android中三种类型的动画:逐帧动画,补间动画(包括透明度、旋转、缩放和平移)以及属性动画(ValueAnimator和ObjectAnimator)。通过实例代码展示了如何在XML和Java代码中实现这些动画效果,帮助开发者理解并应用到实际项目中。
摘要由CSDN通过智能技术生成

1.逐帧动画

在drawable资源下加入逐帧图片,写进frame.xml文件中
写进

<animation-list 
</animation-list>

该标签里
注意activity_main文件中相对布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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/frame"
/>

MainActivity

package com.example.animation;

import androidx.appcompat.app.AppCompatActivity;

import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.view.animation.Animation;
import android.widget.RelativeLayout;

public class MainActivity extends AppCompatActivity {

    //点击的时候 启动和停止 加一个标志位
    private boolean flag = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RelativeLayout relativelayout = findViewById(R.id.rl);
        AnimationDrawable animation = (AnimationDrawable) relativelayout.getBackground();
        relativelayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //首先需要获取drawable
                if (flag){
                    animation.start();
                    flag = false;
                }else{
                    animation.stop();
                    flag = true;
                }
            }
        });
    }
}

在这里插入图片描述

点击图片,会启动和停止
在这里插入图片描述

2.补间动画

alpha透明度
rotate旋转
scale缩放
translate平移

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:adjustViewBounds="true"
        android:maxWidth="300dp"
        android:maxHeight="300dp"
        android:src="@drawable/img"/>

</RelativeLayout>

alpha.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!--初始值从全透明到不透明总共花费两秒钟-->
    <alpha
        android:fromAlpha="0"
        android:toAlpha="1"
        android:duration="2000"
        />
</set>

MainActivity.java

package com.example.animtweened;

import androidx.appcompat.app.AppCompatActivity;

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

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ImageView imageView = findViewById(R.id.iv);
        //set一个,里面new一个
        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //通过加载xml动画设置文件来创建一个Animation对象
                Animation animation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.alpha);//想要啥效果修改这个
                //imageView来启动animation
                imageView.startAnimation(animation);
            }
        });
    }
}

点击后,从无到有
在这里插入图片描述

rotate旋转
添加rotate.xml文件

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!--代表从哪个角度开始-->
<!--    50%正中心开始-->
    <rotate
        android:fromDegrees="0"
        android:toDegrees="360"
        android:pivotX="50%"
        android:pivotY="50%"
        android:duration="2000"
        />
</set>

在这里插入图片描述
scale缩放
在这里插入图片描述
scale.xml文件

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!--一开始是原始大小-->
<!--    缩放为原来的一半-->

    <scale
        android:fromXScale="1"
        android:fromYScale="1"
        android:toXScale="0.5"
        android:toYScale="0.5"
        android:pivotX="50%"
        android:pivotY="50%"
        android:duration="2000"
        />
</set>

translate平移
在这里插入图片描述
translate.xml文件

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <translate
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="400"
        android:toYDelta="400"
        android:duration="2000"
        />
</set>

3.属性动画

ValueAnimator
//从0f到1f 加值 实现值自动变化

package com.example.animproperty;

import androidx.appcompat.app.AppCompatActivity;

import android.animation.ValueAnimator;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 1f);
        valueAnimator.setDuration(2000);//设置执行周期
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {//new一个更新监听
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float value = (float) animation.getAnimatedValue();//拿到了一个当前的值
                Log.e("double", "onAnimationUpdate: "+value);
            }
        });
        valueAnimator.start();//启动的时候从0加到1f
    }
}

ObjectAnimator
实现了渐变

package com.example.animproperty;

import androidx.appcompat.app.AppCompatActivity;

import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 1f);
        valueAnimator.setDuration(2000);//设置执行周期
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {//new一个更新监听
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float value = (float) animation.getAnimatedValue();//拿到了一个当前的值
                Log.e("double", "onAnimationUpdate: "+value);
            }
        });
        valueAnimator.start();//启动的时候从0加到1f

        TextView textView = findViewById(R.id.tv);//获取到tv
        ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(textView,
                "alpha",0f,1f);//textView从完全透明到完全不透明
        objectAnimator.setDuration(4000);
        objectAnimator.start();
    }
}

在这里插入图片描述

//一些方法
自动弹出弹框

package com.example.animproperty;

import androidx.appcompat.app.AppCompatActivity;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 1f);
        valueAnimator.setDuration(2000);//设置执行周期
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {//new一个更新监听
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float value = (float) animation.getAnimatedValue();//拿到了一个当前的值
                Log.e("double", "onAnimationUpdate: "+value);
            }
        });
        valueAnimator.start();//启动的时候从0加到1f

        TextView textView = findViewById(R.id.tv);//获取到tv
        ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(textView,
                "alpha",0f,1f);//textView从完全透明到完全不透明
        objectAnimator.setDuration(4000);
        objectAnimator.start();

        objectAnimator.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animator) {
                //动画开始的时候调用
            }

            @Override
            public void onAnimationEnd(Animator animator) {
                //动画结束
            }

            @Override
            public void onAnimationCancel(Animator animator) {
            //被取消
            }

            @Override
            public void onAnimationRepeat(Animator animator) {
            //重复执行
            }
        });

        //用适配的一个方式,去写一个start
        objectAnimator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationStart(Animator animation) {
                super.onAnimationStart(animation);
            }
        });
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值