Android高级UI面试题汇总(含详细解析 十八)

本文详细解读了Android并发编程面试中的插值器和估值器概念,介绍了它们在动画中的作用,包括插值器控制动画速率,估值器计算属性变化值。还涵盖了匀速插值器和自定义估值器的实现方式。

Android并发编程高级面试题汇总最全最细面试题讲解持续更新中👊👊
👀你想要的面试题这里都有👀
👇👇👇

动画插值器与估值器是什么?

这道题想考察什么?

这道题想考察同学对 插值器 估值器 的理解。

考生应该如何回答

插值器和估值器是动画运行过程中非常重要的内容。简单来说插值器是负责计算动画完成的百分比,换一句话说插值器也就是用来控制动画执行的变化速率的,当然也可以叫加速器。而估值器则根据动画完成百分比计算改变后的属性值,具体请参照下面内容。

动画是一系列的图片组合的一个变化过程,那么这个变化应该分为两个部分:1)动画变化的速率也就是“动”或者“移动” 的速率;2)每“移动”或者变化后展示的图片效果。由此,控制动画的变化就有了两个非常重要的工具,由Interpolator也就是插值器来控制的变化速率,以及由Evaluator估值器来计算的每次“移动”或者变化后展示的图片的效果。

Interpolator(插值器)

定义

  • 它是一个接口

  • 通俗易懂的说,Interpolator负责控制动画变化的速率,即确定了动画效果变化的模式,使得基本的动画效果能够以匀速、加速、减速、抛物线速率等各种速率变化。

    动画是开发者给定开始和结束的“关键帧”,其变化的“中间帧”是由系统计算决定然后播放出来。因此,动画的每一帧都将在开始和结束之间的特定时间显示。此时动画时间被转换为时间索引,则动画时间轴上的每个点都可以转换成0.0到1.0之间的一个浮点数,然后再将该值用于计算该对象的属性变换。在变换的情况下,y轴上,0.0对应于起始位置,1.0对应于结束位置,0.5对应于起始和结束之间的中间值。

Interpolator 本质上是一个数学函数,其取数字在0.0和1.0之间,并将其转换为另一个数字。

分类

在这里插入图片描述

TimeInterpolator接口只有一个方法getInterpolation(float input)。这个方法会在调度时间内返回从0~1变化值。所以我们变化不同的动画插值器,实际上就是在该方法内使用不同的曲线算法,不断的返回一个趋近于物理规律的曲线时刻点的变化值。在众多的插值器中,匀速插值器是相对容易理解的插值器,适合作为案例讲解,其他插值器采用的是类似的方案,大家感兴趣的可以自行去研究。

LinearInterpolator匀速插值器

匀速插值器的意思是随着时间变化,动画匀速变化,在整个过程中速率是一样的。

核心代码:

public class LinearInterpolator extends BaseInterpolator implements NativeInterpolator {
	...//省略部分方法
	//输入多少返回多少,匀速变化
    public float getInterpolation(float input) {
        return input;
    }
}

在上述代码中,getInterpolation函数传入了参数input,在未做任何处理的情况下又将input作为参数返回。整个数学模式表达的意思时间和动画变化速率一致,类似于数学函数中的f(x) = x,用坐标轴表示类似于下图,横轴作为时间,纵轴作为动画变化。

在这里插入图片描述

​ 使用Android内置的插值器能满足大多数的动画需求。不管你是速率的要求是匀速、先加速后减速、先减速后加速、先慢后快再慢、先快后慢再快,内置的插值器都可以满足。如果实在是动画效果特殊,也可以自定义插值器。自定义插值器需要实现 TimeInterpolator接口并复写getInterpolation()。

​ 插值器(Interpolator)决定值的变化规律(匀速、加速),即决定的是变化趋势,而接下来的具体变化数值则交给 而估值器。估值器是协助插值器 实现非线性运动的动画效果。

TypeEvaluator(类型估值算法,即估值器)

什么是估值器:根据当前属性改变的百分比来计算改变后的属性值。也就是基于属性的变化的比率来计算得到当前的属性的值。例如:颜色从红色变成白色的动画,那么这个渐变的过程中,每一步变化都会有一个新的颜色,这个颜色怎么来的呢?它就是估值器计算出来的。估值器中有一个函数叫evaluate,这个函数的返回值,就是返回计算后的颜色。

  • 插值器决定属性值随时间变化的规律;而具体变化后属性数值则交给估值器去计算。
  • 是一个动画相关的接口。
  • 作用:设置属性值从初始值过渡到结束值的变化过程中每一步的具体数值。
  • 属性动画特有的属性
  • 协助插值器实现非线性运动的动画效果

如果你还是对估值器的概念不清楚的话,不妨以例子作为切入点,我们从例子慢慢分析。

我们用代码初始化ObjectAnimation的时候,有利用到系统默认提供的FloatEvaluator:

val objectAnimator = 
ObjectAnimator.ofObject(viewHolder,"PropertyName",FloatEvaluator(),0f,1f)

这时候,我们定义的值的类型是Float,直接看看FloatEvaluator的源码,只有一个方法:

public Float evaluate(float fraction, Number startValue, Number endValue) {
    float startFloat = startValue.floatValue();
    return startFloat + fraction * (endValue.floatValue() - startFloat);
}
  • startValue 是指初始值
  • endValue 是指最终值
  • fraction是指从startValue到endValue的动画的进度,这个值是从0到1的float值。其变化的速率和插值器是有关联的,假设插值器使用的是LinearInterpolator线性插值器,那么fraction的变化也是线性的!
  • return 生成的具体值。在上个Demo中,就是直接操控View的透明度的值。

那么估值器在这段时间内会一值被调用 evaluate() 方法,fraction始终是从0到1的变化,而startValue和endValue会以下面的方式变化:

在这里插入图片描述

需要注意的是:因为估值器返回的值会直接影响显示的效果,如果把fraction看作是x,startValue和endValue是常量,其返回值y必须满足与x*(endValue - startValue) 构成的等式为一元一次方程。

使用方法

ObjectAnimator anim = ObjectAnimator.ofObject(myView2, "height", new Evaluator()13);
// 在第4个参数中传入对应估值器类的对象
// 系统内置的估值器有3个:
// IntEvaluator:以整型的形式从初始值 - 结束值 进行过渡
// FloatEvaluator:以浮点型的形式从初始值 - 结束值 进行过渡
// ArgbEvaluator:以Argb类型的形式从初始值 - 结束值 进行过渡

如果要为 Android 系统无法识别的类型添加动画效果,则可以通过实现 TypeEvaluator 接口来创建您自己的评估程序。Android 系统可以识别的类型为 int、float 或颜色,分别由 IntEvaluator、FloatEvaluator 和 ArgbEvaluator 类型评估程序提供支持。

  • IntEvaluator :Int类型估值器,返回int类型的属性改变
  • FloatEvaluator : Float类型估值器,返回Float类型属性改变
  • ArgbEvaluator :颜色类型估值器,返回16进制颜色值

自定义估值器

本质:根据插值器计算出当前属性值改变的百分比 & 初始值 & 结束值来计算当前属性具体的数值

如:动画进行了50%(初始值=100,结束值=200 ),那么匀速插值器计算出了当前属性值改变的百分比是50%,那么估值器则负责计算当前属性值 = 100 + (200-100)x 50% = 150。

具体使用:自定义估值器需要实现 TypeEvaluator接口 & 复写evaluate()

public interface TypeEvaluator {  

    public Object evaluate(float fraction, Object startValue, Object endValue) {  
// 参数说明
// fraction:插值器getInterpolation()的返回值
// startValue:动画的初始值
// endValue:动画的结束值

        ....// 估值器的计算逻辑

        return xxx;
        // 赋给动画属性的具体数值
        // 使用反射机制改变属性变化

    }  
}  

那么插值器的input值 和 估值器fraction有什么关系呢?

答:input的值决定了fraction的值:input值经过计算后传入到插值器的getInterpolation(),然后在getInterpolation()中的基于响应的逻辑算法结合input值来计算出一个返回值,而这个返回值就是fraction了。

总结

属性动画是对属性做动画,属性要实现动画。

  • 首先由插值器根据时间流逝的百分比计算出当前属性值改变的百分比,然后由插值器将这个百分比返回。这个时候插值器的工作就完成了。

比如 插值器 返回的值是0.5,很显然我们要的不是0.5这个值,而是变化效果变化了0.5,那么怎么办呢?

  • 插值器算好属性变化百分比之后,由估值器根据当前属性改变的百分比来计算改变后的属性值,根据这个属性值,我们就可以对View设置当前的属性值了。

由于面试题内容比较多,篇幅有限,资料已经被整理成了PDF文档,有需要2023年Android中高级最全面试真题答案 完整文档的可扫描下方卡片免费获取~

PS:(文末还有使用ChatGPT机器人小福利哦!!大家不要错过)

目录

img

第一章 Java方面

  • Java基础部分
  • Java集合
  • Java多线程
  • Java虚拟机

img

第二章 Android方面

  • Android四大组件相关
  • Android异步任务和消息机制
  • Android UI绘制相关
  • Android性能调优相关
  • Android中的IPC
  • Android系统SDK相关
  • 第三方框架分析
  • 综合技术
  • 数据结构方面
  • 设计模式
  • 计算机网络方面
  • Kotlin方面

img

第三章 音视频开发高频面试题

  • 为什么巨大的原始视频可以编码成很小的视频呢?这其中的技术是什么呢?
  • 怎么做到直播秒开优化?
  • 直方图在图像处理里面最重要的作用是什么?
  • 数字图像滤波有哪些方法?
  • 图像可以提取的特征有哪些?
  • 衡量图像重建好坏的标准有哪些?怎样计算?

img

第四章 Flutter高频面试题

  • Dart部分
  • Flutter部分

img

第五章 算法高频面试题

  • 如何高效寻找素数
  • 如何运用二分查找算法
  • 如何高效解决雨水问题
  • 如何去除有序数组的重复元素
  • 如何高效进行模幂运算
  • 如何寻找最长回文子串

img

第六章 Andrio Framework方面

  • 系统启动流程面试题解析
  • Binder面试题解析
  • Handler面试题解析
  • AMS面试题解析

img

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值