我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android动画探索之属性动画

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android动画探索之属性动画

这篇文章来总结下属性动画,通过下面几点来了解下属性动画的内容:

属性动画概述 属性动画工作原理 ValueAnimator ObjectAnimator ValueAnimator和ObjectAnimator区别 插值器 估值期 插值器和估值期的区别

一.概述

1.特性

属性动画是API 11新加入的特性,相比于View动画只作用在视图View上,它对作用对象进行了扩展,属性动画可以对任何对象做动画,甚至可以没有对象.除了作用对象进行了扩展以外,属性动画的效果也得到了加强,不再像View动画那样只能支持四种简单的变换.另外View动画没有改变View的属性,只是改变了视觉效果.而属性动画是通过改变对象的属性来实现动画效果.

2.核心类

//载入xml动画
 Animator animator = AnimatorInflater.loadAnimator(this, R.animator.animator_bt);
 //设置动画对象
 animator.setTarget(view);
 //开启动画
 animator.start();

注意:实际开发中,建议使用代码的方式实现属性动画,因为很多属性的初始值无法提前确定,只能代码动态获取。

2.ValueAnimator.ofFloat(float… values)

(1)概念:

将初始值以浮点型数值的形式过渡到结束值,即估值器是浮点估值器(FloatEvaluator)

(2)具体实现

其可以通过xml和代码的方式来实现,使用细节和ValueAnimator.ofInt()类型,这里就不多说了。

3.ValueAnimator.ofObject(TypeEvaluator evaluator, Object… values)

(1)概念

初始值以对象的的形式过渡到结束值。

(2)具体使用

 //步骤一:创建初始动画时的对象&创建结束动画时对象
        MyObject myObject1 = new MyObject();
        MyObject myObject2 = new MyObject();
        //步骤二:创建动画实例,参数分别是自定义估值器对象,初始动画的对象,结束动画的对象
        ValueAnimator valueAnimator = ValueAnimator.ofObject(new MyObjectEvaluator(), myObject1, myObject2);
        //步骤三:设置动画参数
        valueAnimator.setStartDelay(500);
        //步骤四:开始动画
        valueAnimator.start();

(3)估值器(TypeEvaluator)

作用:设置动画如何从初始值过渡到结束值的逻辑。

a.系统内置的估值器

通过上面学习ValueAnimator.ofInt()和ValueAnimator.ofFloat()知道系统内置了一个IntEvaluator估值器和FloatEvaluator估值器,实现了将初始值以整型或浮点型的形式过渡到结束值的逻辑,下面以FloatEvaluator为例看下源代码:

public class FloatEvaluator implements TypeEvaluator {
    public Float evaluate(float fraction, Number startValue, Number endValue) {
    //fraction 表示动画完成度
    //startValue,endValue,表示初始值和结束值
        float startFloat = startValue.floatValue();
        //返回当前动画的值
        return startFloat + fraction * (endValue.floatValue() - startFloat);
    }

b.自定义估值器

ValueAnimator.ofInt()和ValueAnimator.ofFloat()内置了系统估值器,即系统已经默认实现了如何从初始值过渡到结束值的逻辑,但是ValueAnimator.ofObject()没有系统默认实现,因为对象的动画复杂多样,系统无法知道如何从初始对象过渡到结束对象。所以要自定义估值器告诉系统如何从初始对象过渡到结束对象,自定义估值器的逻辑如下:

//实现TypeEvaluator接口
public class ObjectEvaluator implements TypeEvaluator {
    //复写evaluate方法
    @Override
    public Object evaluate(float fraction, Object startValue, Object endValue) {
        //参数:动画完成度、开始值、结束值
        //写对象动画过渡逻辑
        //返回对象动画过渡逻辑计算后的值
        return null;
    }
}

c.案例说明

这里实现一个圆从一个点移动到另外一个点。

步骤1:定义对象类

public class Point {
    //定义坐标位置
    private float x;
    private float y;
    //设置坐标
    public Point(float x, float y) {
        this.x= x;
        this.y = y;
    }
    //获取坐标
    public float getX() {
        return x;
    }
    public float getY() {
        return y;
    }
}

步骤2:自定义估值器

public class PointEvaluator implements TypeEvaluator {
    @Override
    public Point evaluate(float fraction, Object startValue, Object endValue) {
        //将初始值和结束值强制转换为Point对象
        Point startPoint = (Point)startValue;
        Point endPoint = (Point)endValue;
        //计算当前动画x,y的值
        float x = startPoint.getX() + fraction * (endPoint.getX() - startPoint.getX());
        float y = startPoint.getY() + fraction * (endPoint.getY() - startPoint.getY());
        //将计算后的值封装成Point对象返回
        return new Point(x,y);
    }
}

步骤3:将属性动画应用到自定义View当中

public class PointView extends View {
    public final static float RADIUS = 70f;//圆的半径
    private  Paint paint;
    private Point currentPoint;//当前坐标
    public PointView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        //初始化画笔
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.BLUE);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (currentPoint == null) {
            //创建点对象
            currentPoint = new Point(RADIUS,RADIUS);
            float x = currentPoint.getX();
            float y = currentPoint.getY();
            //画一个坐标为x,y,半径为RADIUS的圆
            canvas.drawCircle(x,y,RADIUS,paint);
            //将属性动画作用在View上
            //步骤1:初始化初始对象值和结束对象值
            Point startPoint = new Point(RADIUS, RADIUS);
            Point endPoint = new Point(700,1000);
            //步骤2:创建动画对象
            ValueAnimator valueAnimator = ValueAnimator.ofObject(new PointEvaluator(), startPoint, endPoint);
            //步骤3:设置动画参数
            valueAnimator.setDuration(5000);
            //步骤4:通过值的更新监听器,将变化后的对象手动赋值给当前对象
            valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    currentPoint = (Point)animation.getAnimatedValue();
                    //更新当前坐标值,每次赋值后重新绘制,从而达到动画效果
                    invalidate();
                }
            });
            valueAnimator.start();
        } else {
            float x = currentPoint.getX();
            float y = currentPoint.getY();
            canvas.drawCircle(x,y,RADIUS,paint);
        }
    }
}

步骤4:在布局中使用


四.ObjectAnimator

1.概念

通过不断控制值的变化,再不断自动赋值给对象的属性,从而实现动画效果。它继承自ValueAnimator类,其原理图如下:

    ImageView imageView = findViewById(R.id.image);
    Animator animator = AnimatorInflater.loadAnimator(this, R.animator.animator_obj);
    animator.setTarget(imageView);
    animator.start();

3.ValueAnimator和ObjectAnimator对比

(1)相同点:都是属性动画,都是通过先改变值,再赋值给对象的属性从而实现动画效果。

(2)不同点:ValueAnimator类是先改变值,再手动的赋值给对象的属性,从而实现动画效果,是间接对对象的属性进行操作;ObjectAnimator类是先改变值,再自动的赋值给对象的属性,从而实现动画效果,是直接对对象属性进行操作。

五.属性动画监听

属性动画主要通过两个接口来监听动画的播放过程:AnimatorUpdateListener和AnimatorListener,

animator.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {
            }
            @Override
            public void onAnimationEnd(Animator animation) {
            }
            @Override
            public void onAnimationCancel(Animator animation) {
            }
            @Override
            public void onAnimationRepeat(Animator animation) {
            }
        });
	//AnimatorListenerAdapter类是AnimatorListener的适配器,
	可以选择性的复写上面的四个方法,在开发中能够更加灵活方便的使用
    animator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationStart(Animator animation) {
                super.onAnimationStart(animation);
            }
        });

六.插值器(Interpolator)

1.概念

Android实现动画效果的一个辅助接口,表示属性值从初始值过渡到结束值的变化规律,比如匀速、加速、减速等。

2.具体的使用

(1)代码中使用

        ImageView imageView = findViewById(R.id.image);
        Animator animator = AnimatorInflater.loadAnimator(this, R.animator.animator_obj);
        animator.setTarget(imageView);
        animator.setInterpolator(new LinearInterpolator());
        animator.start();

(2)xml中使用


3.系统内置插值器

在这里插入图片描述
注意:系统默认的插值器是AccelerateDecelerateInterpolator,先加速再减速。

4.自定义插值器

自定义插值器主要是根据动画的进度(0%-100%)计算出当前属性值改变的百分比,需要实现Interpolator/TimeInterpolator接口,复写getInterpolation方法。其中View动画实现Interpolator接口,属性动画实现TimeInterpolator接口,TimeInterpolator接口是属性动画新增的,用于兼容Interpolator接口。

(1)我们先来看一下系统内置的匀速插值器和加速减速插值器。

@HasNativeInterpolator
public class LinearInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {
...
    public float getInterpolation(float input) {
    //匀速插值器没有对input做处理,而是直接返回,这是因为input也是匀速增加,所以fraction值也会匀速增加,实现迅速的动画效果
        return input;
    }
...
}
@HasNativeInterpolator
public class AccelerateDecelerateInterpolator extends BaseInterpolator
        implements NativeInterpolatorFactory {
...
    public float getInterpolation(float input) {
    //加速减速差值器,使用了余弦函数
    //因为input取值是0到1,那么(input + 1) * Math.PI的值是π到2π
    //因此cos(π)结果时-1,cos(2π)的结果时1
    //(Math.cos((input + 1) * Math.PI) / 2.0f) 的取值范围也就是-0.5到0.5
    //因此最后的返回值还是0到1,但是通过余弦计算后,不再是匀速的,而是先加速后减速
        return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;
    }
...
}

(2)自定义一个插值器,实现减速加速

public class DecelerateAccelerateInterpolator implements TimeInterpolator {
    @Override
    public float getInterpolation(float input) {
        float result;
        //这里实现一个减速加速的插值器,使用了正弦函数
        if (input <= 0.5) {
            result = (float) Math.sin(Math.PI*input)/2;
        } else {
            result = 2-  (float)(Math.sin(Math.PI*input)/2);
        }
        return result;
    }
}

5.插值器和估值器的区别

在这里插入图片描述
学习文章:
Android:这份属性动画的核心使用类ValueAnimator学习指南请收好!


作者:终点木木


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android动画探索之属性动画

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android动画探索之属性动画

这篇文章来总结下属性动画,通过下面几点来了解下属性动画的内容: 属性动画概述 属性动画工作原理 ValueAnimator ObjectAnimator ValueAnimator和ObjectAnimator区别 插值器 估值期 插值器和
2022-06-06

Android动画-属性动画

属性动画 所谓属性动画,就是改变对象Object的属性来实现动画过程。属性动画是对View的动画的扩展,通过它可以实现更多漂亮的动画效果。同时属性动画的作用对象不仅仅是View,任何对象都可以。 属性动画的作用效果就是:在一个指定的时间段内
2022-06-06

CSS 动画属性探索:transition 和 transform

在Web开发中,为了增加网页的交互性和视觉效果,我们经常会使用CSS动画来实现元素的过渡和变换。在CSS中,有两个常用的属性可以实现动画效果,分别是transition和transform。本文将深入探索这两个属性的使用方法,并给出具体的代
2023-10-21

Android属性动画

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、常用API3.1 Valu
Android属性动画
2023-12-22

CSS 动画属性探索:keyframes 和 animation

引言:CSS 动画已经成为现代网页设计的重要组成部分。它可以为网页增添生动的交互效果,提升用户体验。在 CSS 中,我们可以利用 keyframes 和 animation 这两个属性来创建各种炫酷的动画效果。本文将带大家深入探索这两个属性
2023-10-21

Android 动画(View动画,帧动画,属性动画)详细介绍

0. 前言 Android动画是面试的时候经常被问到的话题。我们都知道Android动画分为三类:View动画、帧动画和属性动画。先对这三种动画做一个概述:View动画是一种渐进式动画,通过图像的平移、缩放、旋转和透明度等各种渐进式变换完
2022-06-06

Android动画 实现开关按钮动画(属性动画之平移动画)实例代码

Android动画 实现开关按钮动画(属性动画之平移动画),最近做项目,根据项目需求,有一个这样的功能,实现类似开关的动画效果,经过自己琢磨及上网查找资料,终于解决了,这里就记录下:在Android里面,一些炫酷的动画确实是很吸引人的地方,
2022-06-06

Android帧动画、补间动画、属性动画用法详解

在安卓开发中,经常会使用到一些动画,那么在开发中,如何使用这些动画呢? 帧动画:不是针对View做出一些形状上的变化,而是用于播放一张张的图片,例如一些开机动画,类似于电影播放,使用的是AnimationDrawable来播放帧动画 res
2022-06-06

android 帧动画,补间动画,属性动画的简单总结

帧动画——FrameAnimation 将一系列图片有序播放,形成动画的效果。其本质是一个Drawable,是一系列图片的集合,本身可以当做一个图片一样使用 在Drawable文件夹下,创建animation-list为根节点的资源文件
2022-06-06

Android模拟开关按钮点击打开动画(属性动画之平移动画)

在Android里面,一些炫酷的动画确实是很吸引人的地方,让然看了就赏心悦目,一个好看的动画可能会提高用户对软件的使用率。另外说到动画,在Android里面支持两种动画:补间动画和属性动画,至于这两种动画的区别这里不再介绍,希望开发者都能在
2022-06-06

Android源码解析之属性动画详解

前言 大家在日常开发中离不开动画,属性动画更为强大,我们不仅要知道如何使用,更要知道他的原理。这样,才能得心应手。那么,今天,就从最简单的来说,了解下属性动画的原理。ObjectAnimator.ofInt(mView,"width",10
2022-06-06

CSS3 动画属性

CSS3 动画虽然transition在一定的时间内可以实现元素的初始状态在指定的时间范围过渡最终状态, 模拟一种过渡动画效果,但它的功能是非常有限的。 因此,CSS3 新增了一个动画属性animation。与过渡属性transition属
2023-01-31

Android 属性动画原理与DataBinding

Android 属性动画原理与DataBinding 看到这个标题的时候你可能会有疑问,属性动画和 DataBinding 之间有什么关系?我个人理解的是:它们内部的实现思想有相似之处。这篇文章主要对 Android 属性动画的知识通过文字
2022-06-06

图文详解Android属性动画

Android中的动画分为视图动画(View Animation)、属性动画(Property Animation)以及Drawable动画。从Android 3.0(API Level 11)开始,Android开始支持属性动画,本文主
2022-06-06

Android 动画之帧动画用法详解

本文目录帧动画概念帧动画实现方法1:xml实现帧动画第一步:导入帧动画素材第二步:创建帧动画文件第三步:布局文件和Activity方法2:用Java代码实现帧动画 帧动画概念 在Android中,帧动画的本质是把一组预先准备好的图片循环切换
2022-06-06

Android 属性动画:一文让你彻底了解和掌握属性动画用法

本文目录属性动画概述属性动画用法对象动画(ObjectAnimator)方法1:Java代码实现对象动画方法2:XML实现对象动画值动画(ValueAnimator)PropertyValueHolder动画组合(AnimatorSet)差
2022-06-06

Android动画学习笔记之补间动画

本文实例为大家分享了Android补间动画展示的具体代码,供大家参考,具体内容如下 首先看看补间动画的共同属性: Duration:动画持续的时间(单位:毫秒) fillAfter:设置为true,动画转化在动画被结束后被应用 f
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录