属性动画的介绍

本文详细介绍了Android属性动画的引入原因、功能特点,并通过示例代码展示了ValueAnimator、ObjectAnimator和AnimatorSet的使用方法,包括对象移动、缩放、旋转等动画效果。属性动画不仅增强了UI交互体验,还能改变对象的实际属性。
摘要由CSDN通过智能技术生成

属性动画的简介

1 为什么要引入属性动画?

  • 补间动画功能比较单调,只有四种动画(透明度,旋转,倾斜和位移)

  • 补间动画针对的对象只是UI控件

  • 补间动画只是改变View的显示效果,不会去改变View的属性

eg:左边的按钮移到右边,但是此时的按钮其实还停留在左边,假如你去点右面的按钮,是不会触发按钮的点击事件的~

2 属性动画是什么?

  • Andoid 3.0引入,可以说是补间动画的增强版,不止可以实现四种动画效果,可以定义任何属性的变化;

  • 执行动画的对象不只是U控件。可以对任何对象执行动画(不管是否显示在屏幕上)

  • 属性动画通过对目标对象进行赋值来修改其属性,上面那个按钮问题就不存在了~

属性动画相关的API

API说明
Animator创建属性动画的基类,一般不会直接用,一般用他的两个子类!
ValueAnimator上面也说了,属性动画是通过不断地修改值来实现的,而初始值和结束值间的过度动画就是由该类来负责计算的。内部采用一种时间循环的机制来计算值与值之间的动画过度,我们只需将初始值以及结束值提供给该类,并告诉它动画所需时长,该类就会自动帮我们完成从初始值平滑过渡到结束值这样的效果!除此之外,该类还负责管理动画播放次数,播放模式,以及对动画设置监听器等!
ObjectAnimatorValueAnimator的子类,允许我们对指定对象的属性执行动画,用起来更加简单,实际中用得较多。当然某些场合下,可能还是需要用到ValueAnimator
AnimatorSetAnimator的子类,用于组合多个Animator ,并制定多个Animator按照次序播放,还是同时播放
Evaluator告诉动画系统如何从初始值过度到结束值,提供了下述几种Evaluator : - IntEvaluator :用于计算int类型属性值的计算器 - FloatEvaluator :用于计算float类型属性值的计算器 - ArgbEvaluator :用于计算十六进制形式表示的颜色值的计算器 - TypeEvaluator :计算器的接口,我们可以实现该接口来完成自定义计算器

ValueAnimator简单使用

1 使用流程:

  1. 调用ValueAnimator的ofInt(),ofFloat()或ofObject()静态方法创建ValueAnimator实例

  2. 调用实例的setXxx方法设置动画持续时间,插值方式,重复次数等

  3. 调用实例的addUpdateListener添加AnimatorUpdateListener监听器,在该监听器中 可以获得ValueAnimator计算出来的值,你可以值应用到指定对象上

  4. 调用实例的start()方法开启动画! 另外我们可以看到ofInt和ofFloat都有个这样的参数:float/int... values代表可以多个值!

 简单的使用

ming代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:id="@+id/ly_root"
    android:orientation="vertical"
    android:padding="15dp"
    tools:context=".MainActivity">


    <Button
        android:id="@+id/but_01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="01" />

    <Button
        android:id="@+id/but_02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="02" />

    <Button
        android:id="@+id/but_03"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="03" />

    <Button
        android:id="@+id/but_04"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="04" />

    <ImageView
        android:id="@+id/iv_tp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:srcCompat="@mipmap/img_babi" />
</LinearLayout>

java代码

package com.jzj.day34tage01;

import androidx.appcompat.app.AppCompatActivity;

import android.animation.AnimatorSet;
import android.animation.ValueAnimator;
import android.os.Bundle;
import android.view.View;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.LinearInterpolator;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class MainActivity extends AppCompatActivity {
    private Button but_01;
    private Button but_02;
    private Button but_03;
    private Button but_04;
    private ImageView iv_tp;
    private LinearLayout ly_root;

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

        but_01 = findViewById(R.id.but_01);
        but_02 = findViewById(R.id.but_02);
        but_03 = findViewById(R.id.but_03);
        but_04 = findViewById(R.id.but_04);
        iv_tp = findViewById(R.id.iv_tp);
        ly_root = findViewById(R.id.ly_root);

        but_01.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int wgidth = ly_root.getWidth();
                int height = ly_root.getHeight();
                ValueAnimator animator = ValueAnimator.ofInt(height,0,height / 4,height / 2,height /4 * 2,height);
                animator.setDuration(3000L);
                animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator valueAnimator) {
                        int y  = (int) animator.getAnimatedValue();
                        int x = wgidth / 2;
                        moveVime(iv_tp,x,y);
                    }
                });
                animator.setInterpolator(new LinearInterpolator());
                animator.start();
            }
        });
        but_02.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                float scale = 0.5f;
                AnimatorSet animatorSet = new AnimatorSet();
                ValueAnimator animator = ValueAnimator.ofFloat(1.0f,scale);
                animator.setDuration(500);

                ValueAnimator animator1 = ValueAnimator.ofFloat(scale,1.0f);
                animator1.setDuration(500);

                animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator valueAnimator) {
                        float scale = (float) animator.getAnimatedValue();
                        iv_tp.setScaleX(scale);
                        iv_tp.setScaleY(scale);
                    }
                });
                animator1.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator valueAnimator) {
                        float scale = (float) animator.getAnimatedValue();
                        iv_tp.setScaleX(scale);
                        iv_tp.setScaleY(scale);
                    }
                });
                animatorSet.play(animator).after(animator1);
                animatorSet.start();
            }
        });
        but_03.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ValueAnimator animator = ValueAnimator.ofInt(0,360);
                animator.setDuration(1000L);
                animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator valueAnimator) {
                        int rotat = (int) animator.getAnimatedValue();
                        iv_tp.setRotation(rotat);
                        float roaer = animator.getAnimatedFraction();
                        iv_tp.setAlpha(roaer);
                    }
                });
                animator.setInterpolator(new DecelerateInterpolator());
                animator.start();
            }
        });
        but_04.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               int width = ly_root.getWidth();
               int higth = ly_root.getHeight();
               int r = width / 4;
               ValueAnimator animator = ValueAnimator.ofFloat(0,(float)(2.0f * Math.PI));
               animator.setDuration(1000);
               animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                   @Override
                   public void onAnimationUpdate(ValueAnimator valueAnimator) {
                       float t = (float) animator.getAnimatedValue();
                       int x = (int) (r * Math.sin(t) + width / 2);
                       int y = (int) (r * Math.cos(t) + higth / 2);
                       moveVime(iv_tp,x,y);
                   }
               });
               animator.setInterpolator(new DecelerateInterpolator());
               animator.start();
            }
        });
    }
    private void moveVime(View view,int rawx,int rawy){
        int left = rawx - iv_tp.getWidth() / 2;
        int top = rawy - iv_tp.getHeight();
        int whidth = left + view.getWidth();
        int height = top + view.getHeight();
        view.layout(left,top,whidth,height);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值