【面试】用属性动画和view的layoutparams做一个view的移动效果 有啥区别

属性动画:通过Animator执行动画进度过程中持续调用View的属性方法,实现View的平移、缩放、透明度、旋转动画。
对应的属性方法:

// 平移属性方法
public void setTranslationX(float translationX)
public void setTranslationY(float translationY)
// 透明度变化属性方法
public void setAlpha(@FloatRange(from=0.0, to=1.0) float alpha)
// 缩放属性变化方法
public void setScaleX(float scaleX)
public void setScaleY(float scaleY)
// 旋转属性变化动画
public void setRotation(float rotation)
public void setRotationY(float rotationY)
public void setRotationX(float rotationX)

以上是常用的属性方法,其本质上只是改变了View的展示,不会触发重新layout过程。
如果改成随着动画进度不断执行setLayoutParams是会让View持续调用requestLayout方法,进行重新测量、布局、绘制过程,View的实际坐标是会变化的。

每一个View对象都有一个RenderNode对象,View的属性方法的实现都是转调到View的RenderNode对象,比如setTranslationX方法的源码比如:

@RemotableViewMethodpublic void setTranslationX(float translationX) {if (translationX != getTranslationX()) {invalidateViewProperty(true, false);// 关键!!mRenderNode.setTranslationX(translationX);invalidateViewProperty(false, true);invalidateParentIfNeededAndWasQuickRejected();notifySubtreeAccessibilityStateChangedIfNeeded();}}

实际写代码验证,当触发平移动画、缩放动画、旋转动画、alpha动画是不会触发View的重新onMeasure、onLayout、onDraw过程的,只是生成matrix对RenderNode进行变换,不对View的真实坐标进行变化,RenderNode的方法都是用native实现的,所以性能上也是比较好的。

  • View的width和height不会变化
  • 不会重新layout
  • 不会重新走onDraw

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/30052.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python教程】如何搭建一个高效的Python开发环境?结尾附安装包直通车

前言: Python 丰富的函数库和组件库是这门语言强大的核心原因!但我们不可能去记忆所有的方法名和参数名,往往只能记住一些常用的或者某个方法开头的几个字母。这个时候一个好的开发工具就需要能聪明地“猜”出你想输入的代码,并给…

Java数据结构与算法——稀疏数组和队列

一、稀疏数组sparsearray数组 该二维数组的很多值是默认值0,因此记录了很多没有意义的数据,可以采用稀疏数组进行压缩 1.基本介绍: 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。 稀疏数组的处理方法…

深入解析Linux权限管理:从基本原理到应用

目录 Shell 命令及运行原理 Shell 与 Kernel Linux 权限的概念 命令提示符 Linux 权限管理 1. 访问者的分类 ugo 2. 类型和访问权限 3. 权限值表示方法 4. chmod 访问权限设置 掩码命令:umask 5.目录权限 粘滞位: 文章手稿见文末 Shell 命令…

Unity OpenCVForUnity 安装和第二个案例详解 <二>

目录 一、前言 二、场景介绍 1.WebCamTextureToMatExample脚本 2.FpsMonitor脚本 三、 结构体Scaler 四、找到相机并使用 1.相机的启用 2.格式转换 a.把webCamTexture转换成Mat b.把Mat转换成Texture2D 五、脚本组合 六、作者的碎碎念 一、前言 第二个案例&#xf…

大语言模型的昨天、今天和明天

引言 近年来,人工智能(AI)技术突飞猛进,其中大语言模型(LLM)无疑是最引人瞩目的技术之一。从OpenAI的GPT系列到Meta的Llama模型,大语言模型的发展不仅改变了人们对AI的认知,也在各行…

通过防抖动代码解决ResizeObserver loop completed with undelivered notifications.

通过防抖动代码解决ResizeObserver loop completed with undelivered notifications. 一、报错内容二、解决方案解释: 一、报错内容 我通过el-tabs下的el-tab-pane切换到el-table出现的报错,大致是渲染宽度出现了问题 二、解决方案 扩展原生的 Resiz…

windows桌面运维----第三天

1、电脑存储位置更改: 操作方式:使用win I打开系统设置 → 系统 → 存储选项卡 → 更改新内容的保存位置; 2、开启存储感知:自动清理临时文件 操作方式:右键开始图标(左下角)➡ 系统 ➡ 存储…

每天一个数据分析题(三百七十六)- 时间序列

影响时间序列的因素不包括以下哪个? A. 季节变动 B. 循环波动 C. 不规则波动 D. 有效性 数据分析认证考试介绍:点击进入 题目来源于CDA模拟题库 点击此处获取答案

DevOps学习回顾01-技能发展路线-岗位能力-体系认知

事为先,人为重–事在人为 参考来源: 极客时间专栏:DevOps实战笔记,作者:石雪峰 课程链接:https://time.geekbang.org/column/intro/235 时代的典型特征 VUCA VUCA 是指易变性(Volatility&…

破局者:Codebeamer如何打破传统束缚,开启工程新纪元

飞速发展的数字时代,一场深刻的数字化革命正在重塑各行各业的价值链条,为产品开发组织带来了前所未有的挑战。随着电子技术和软件组件在产品设计中的地位日益凸显,传统的工程实践正经历着一场深刻的变革。为了顺应这一潮流,企业必…

【碳排放控排1006】碳排放控排企业名单数据集,探索绿色生产!

今天给大家分享的是国内顶级期刊2023发表论文《碳排放规制、企业减排激励与全要素生产率——基于中国碳排放权交易机制的准自然实验》中使用到的重要数据集——碳排放控排企业名单,该论文从企业生产效率视角对论文进行研究,发现碳排放权交易机制显著提升…

植物大战僵尸杂交版V2.1快速刷金币的方法(新号适用,无需自带招财猫)

📝个人主页:哈__ 期待您的关注 目录 1. 💻游戏介绍 2. 🔥快速刷取金币的办法(我是新号测试的) 2.1 无招财猫 2.2 有招财猫 《植物大战僵尸杂交版》是一款在原版《植物大战僵尸》基础上进行了创新的塔防…

骗小孩背单词的游戏

我小孩还没有生,我打算生2个,这样他们有竞争性。我们小时候玩过一款游戏,叫做编编战,就是通过作者进行现场在脑子里编故事,然后玩家,直接加入故事,通过讲述或者演绎,来做凭空的角色扮…

Java学习【深入解读File类:从基础到高级的完整指南】

Java学习【深入解读File类:从基础到高级的完整指南】 ⭐File的概述和构造方法⭐File常见的成员方法🌙构造方法🌙length()🌙getAbsoluteFile()和getPath()🌙getName()和lastModified() ⭐文件的创建和删除⭐获取并遍历 …

【OpenHarmony开发】 tracepoint的机制总结

一、tracepoint 的机制 1.1 DECLARE_HOOK 解析 DECLARE_HOOK(vendor_bond_check_dev_link,TP_PROTO(const struct bonding *bond, const struct slave *slave, int *state), TP_ARGS(bond, slave, state)); ​ // 在已经实现如下宏定义的前提下 // CONFIG_TRACEPOINTS 和 CO…

代码随想录算法训练营DAY41|背包问题 二维 、背包问题 一维、416. 分割等和子集

背包问题 二维 题目链接:背包问题 二维 def bag_weight_problem(n,space,weight,value):dp [[0 for i in range(space1)]for j in range(n)]for i in range(weight[0], space1):dp[0][i]value[0]for j in range(1, n):for k in range(space1):if weight[j]>k:…

力扣410.分割数组的最大值

力扣410.分割数组的最大值 分割数组 使得子数组最大值最小 凡是最小化最大值和最大化最小值的题都是二分答案二分子数组最大值 求当前数组可以分为几段 class Solution {public:int splitArray(vector<int>& nums, int k) {auto check [&](int mid) -> bo…

Leetcode Hot 100 刷题记录 - Day 1

问题描述&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 示…

AbMole带你探索颅内压力与肌肉生长的联系:一项突破性研究

在生物医学领域&#xff0c;颅内压力&#xff08;ICP&#xff09;的调控机制一直是研究的热点。最近&#xff0c;一项发表在《PLOS ONE》上的研究为我们揭示了颅内压力与后颅窝肌肉生长之间的潜在联系&#xff0c;为我们理解某些慢性头痛的成因提供了新的视角。 颅内压力的异常…

spring-boot-starter-websocket 客户端 服务端 例子

1. 添加依赖 首先&#xff0c;在pom.xml中添加spring-boot-starter-websocket依赖&#xff0c;正如你已经指出的&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId&g…