IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android 属性动画 -> 正文阅读

[移动开发]Android 属性动画

介绍

属性动画本质就是动态改变View的属性。
PS:属性动画不仅可以改变View的属性。只要是一个对象的属性,有set/get方法,就可以动态的去变化。

ObjectAnimator

ObjectAnimator类是将属性动画操作简化的一个类。
最常见用法:

//将view的tranlationX属性,在2000ms从0变化到100
ObjectAnimator.ofFloat(view,"translationX",0,100)
        .setDuration(2000)
        .start();

ObjectAnimator方法有ofInt、ofFloat、ofObject等方法,传入一个Object对象,一个对象的属性,数值变化范围(如0-100-1000),就会主动调用Object的Set方法不断去设置属性。设置之后调用更新方法(如View的重绘方法等)
XML:

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
                android:duration="2000"
                android:propertyName="translationX"
                android:valueFrom="0"
                android:valueTo="100"
                android:valueType="floatType">
</objectAnimator>

JAVA引用XML文件方法

Animator animator = AnimatorInflater.loadAnimator(context, R.animator.tranlation_animator);
animator.setTarget(view);
animator.start();

AnimatorSet

动画集,关联多个Animator动画。

//以下动画播放顺序,1->(2,3)->4
AnimatorSet set = new AnimatorSet();
set.play(2).with(3).before(1).after(4);
//动画5在1000ms后播放。
set.play(5).after(1000);
set.setDuration(2000);
set.start();

ValueAnimator(重点)

ValueAnimator是ObjectAnimator的父类,它相当于只提供了一个数据变化的功能。需要自己去实现数据变化时,具体要执行的操作。大多数时候,我们自定义一些特殊的动画的时候,都是使用ValueAnimator类。
常见用法

ValueAnimator animator = ValueAnimator.ofFloat(0,100);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        float value = (float)animation.getAnimatedValue();
    	//数值更新时进行的操作。
    }
});
animator.setDuration(2000);

ps:数值更新时应当使用postInvalidateOnAnimation来优化,postInvalidateOnAnimation 依赖上一帧动画的的执行时间,因为动画的刷新是存在一个频率的,直到下一帧动画的时间才会真正执行刷新操作。

动画监听

以上几种类型的动画都支持设置此监听

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) {
    	//动画重复播放监听
    }
});

TypeEvaluator

估值器:简单来说,就是告诉动画系统如何从初始值过渡到结束值。
以常见的ObjectAnimator.ofFloat()方法为例,
FloatEvaluator源码:

public Float evaluate(float fraction, Number startValue, Number endValue) {
        float startFloat = startValue.floatValue();
        return startFloat + fraction * (endValue.floatValue() - startFloat);
    }

可以看出来,其实就是初始值加上变化值。
看起来是不是很简单,但是就这玩意儿我们用好了,就可以实现一系列花里胡哨的动画了,什么圆形变成心形啦,什么心形弹弹弹啦。自定义的话,其实就是实现TypeEvaluator接口的evaluate方法啦~
举个简单的栗子吧:


public class Circle {
    private int r;

    public int getR() {
        return r;
    }

    public void setR(int r) {
        this.r = r;
    }
}

public class CircleEvaluator implements TypeEvaluator<Circle> {

    @Override
    public Circle evaluate(float fraction, Circle startValue, Circle endValue) {
        if (startValue == null || endValue == null) {
            return startValue;
        }
        int startR = startValue.getR();
        int endR = endValue.getR();
        int nowR = startR + (int) (fraction * (endR - startR));
        Circle nowCircle = new Circle();
        nowCircle.setR(nowR);
        return nowCircle;
    }
}

应该很明显就能看出来,这就是个简单的圆半径变化的估值器。大家可以想象一下利用这个玩意儿可以实现什么样的动画啦!

Interpolator

插值器:它的作用概括来说就是控制动画变化的速度。可以看到TypeEvaluator的接口evaluate方法中有一个fraction参数,这个参数的值其实就是根据Interpolator计算得出的。
我们平常使用属性动画时,系统默认的Interpolator其实就是一个先加速后减速的Interpolator,对应的实现类就是AccelerateDecelerateInterpolator。

@HasNativeInterpolator
public class AccelerateDecelerateInterpolator extends BaseInterpolator
        implements NativeInterpolatorFactory {
    public AccelerateDecelerateInterpolator() {
    }

    @SuppressWarnings({"UnusedDeclaration"})
    public AccelerateDecelerateInterpolator(Context context, AttributeSet attrs) {
    }

    public float getInterpolation(float input) {
        return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;
    }

    /** @hide */
    @Override
    public long createNativeInterpolator() {
        return NativeInterpolatorFactoryHelper.createAccelerateDecelerateInterpolator();
    }
}

其中重点是getInterpolation()方法,这个方法就是最终提供给TypeEvaluator使用的fraction。
再举一个简单的栗子:

public class ReverseInterpolator implements Interpolator {
    @Override
    public float getInterpolation(float input) {
        return 1 - input;
    }
}

这就简单的实现倒序的变化啦!是不是很easy!
再推荐大家一个变化函数直观看效果的网站(里面也有很多已经实现好的函数,用起来贼得劲!):
http://inloop.github.io/interpolator/
下面这个网站也包含了很多函数,大家也可以参考一下!
https://easings.net/cn#

ViewPropertyAnimator

专门提供给View的快捷的Animator操作。拥有更好的性能,只执行一次刷新操作就能将所有动画绘制一次,而我们平常使用的Animator每一个都需要绘制一次。

//简单的x轴y轴平移到100的位置,横向纵向放大到2倍,旋转180度,播放时长1s
view.animate().x(100).y(100).scaleX(2).scaleY(2).rotation(180).setDuration(1000);

ViewPropertyAnimator支持的方法还是挺多的,能满足咱们大多数的需求。而且调用真的是很方便!

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-17 12:52:17  更:2021-11-17 12:53:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:36:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码