Android 对View 进行旋转、缩放、平移的属性变换后,获取外矩形顶点

news/2024/5/20 17:31:27/文章来源:https://blog.csdn.net/jjwwmlp456/article/details/130053641

文章目录

  • 前言
  • 改变 View 的属性,进行旋转、缩放、平移
    • 输出 View 的属性
  • 使用 matrix 映射 view 变换后的外矩形
  • 前(左)乘(preXxx)、后(右)乘(postXxx) 对映射结果的影响
    • 前(左)乘(preXxx) 的意义
    • 后(右)乘(postXxx)
  • 结论

来张图
view 变换

前言

Android View 通过平移、旋转、缩放后,顶点映射
之前写的这个文章,里面用到的是 matrix.mapPoints() 通过 矩形的4个点来映射出新的4个点。
个人以为这就会得到正确的结果。
最近呢,就想着,验证一下这个是不是正确的

验证想法:
“基于 变换后的 ltrb,加一个自定义 view layout; 有最外层 view那么大; 当 view 变换后,在 layout 上以 ltrb为圆心, 画出一个小圆”

最终发现,旋转 用 matrix#mapPoints() 会有问题;但用 matrix#mapRect() 就正常了


改变 View 的属性,进行旋转、缩放、平移

// View 通过如下操作,在平移、旋转、缩放后,其本身的 left、top、right、bottom、width、height是没有变化的
private fun selfTransform(view: View, tx: Float, ty: Float, rx: Float, ry: Float, sx: Float, sy: Float) {view.translationX = txview.translationY = tyval px = view.pivotXval py = view.pivotYview.pivotX = view.left + view.width/2fview.pivotY = view.top + view.height/2f
//        view.rotationX = rx
//        view.rotationY = ryview.rotation = ryview.scaleX = sxview.scaleY = syview.pivotX = pxview.pivotY = py
}

rotation 是绕一点,进行二维的旋转
rotationX、rotationY,是绕 x轴 、 y 轴进行旋转

输出 View 的属性

private fun selfProperties(view: View) {logi("self-ltrb: ${view.left}, ${view.top}, ${view.right}, ${view.bottom}")logi("tx, ty: ${view.translationX}, ${view.translationY}")logi("rx, ry: ${view.rotationX}, ${view.rotationY}; rotation: ${view.rotation}")logi("sx, sy: ${view.scaleX}, ${view.scaleY}")logi("----------------")
}

通过 selfTransform()传参的不同,并调用 selfProperties()后,发现 view 本身的 left、top、right、bottom、width、height是没有变化的


使用 matrix 映射 view 变换后的外矩形

fun mapRect(model: View, dst: RectF, src: RectF) {val l = model.left.toFloat()val t = model.top.toFloat()val r = model.left + model.width.toFloat()val b = model.top + model.height.toFloat()val matrix = Matrix()val cx = l + (r - l) / 2fval cy = t + (b - t) / 2fmatrix.postScale(model.scaleX, model.scaleY, cx, cy)matrix.postRotate(model.rotation, cx, cy) // 以view的中心点旋转matrix.postTranslate(model.translationX, model.translationY)matrix.mapRect(dst, src)
}

这里遇到一个问题:
当view 的变换顺序是 translation(T)、rotate(R)、scale(S)
matrix 中的顺序 用 RST 或 SRT 都会得到正确的结果;但若用 T在最前,就会得出错误结果


前(左)乘(preXxx)、后(右)乘(postXxx) 对映射结果的影响

前(左)乘(preXxx) 的意义

当前矩阵在前(左),新矩阵在后(右)。
如,若当前矩阵为 M,前乘矩阵 A ⇒ M * A

后(右)乘(postXxx)

当前矩阵在后(右),新矩阵在前(左)。
如,若当前矩阵为 M,后乘矩阵 A ⇒ A * M

一般说,平移使用的矩阵加法, 而旋转、缩放使用的是矩阵乘法。
Android Matrix,应用了 齐次坐标, 转换成 3x3 的矩阵。统一使用 矩阵乘法。虽然运算是乘法,但平移操作和旋转、缩放不能交换顺序,交换后,结果不同。


结论

若,translation(T)、rotate(R)、scale(S)* postXxx(), 当前矩阵在 后/右;
*      post->TRS ==> S(R(T))
*      post->TSR ==> R(S(T))
*
*      post->RST ==> T(S(R))
*      post->SRT ==> T(R(S))* preXxx(),当前矩阵在 左/前;
*      pre->TRS ==> T(R(S))
*      pre->TSR ==> T(S(R))
*
*      pre->RST ==> R(S(T))
*      pre->SRT ==> S(R(T))

虽然统一采用了乘法,但 S、R是可交换的。它们和 T 是不可交换的。
从结论看, preXxx 可以完全符合 view变换的顺序。
(说个故事,多年以来,都喜欢用 post,这次突破了自我 %^--^%)

Demo完整代码

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

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

相关文章

为什么APP也需要SSL证书?

通常我们会想到对网站使用SSL证书,来加密数据传输过程,确保信息不被篡改、泄露。对APP这类应用程序则选择软件签名证书,来进行数字签名和防止代码被恶意篡改。然而APP很容易获取到个人敏感信息,为了防止这些信息在传输过程中被有心…

Android ProtoLog动态开启相关wm logging源码分析补充

Android ProtoLog动态开启相关wm logging源码分析补充 针对上一节已经清楚了相关的代码中怎么可以打印到logcat中,其实本质上还就是protologtool这个工具对代码中的所有ProtoLog进行了相关的替换成了具体实现,最后会条件判断输出到Slog中 本文就重点来看…

IP协议头

IP 4位版本号(version)4位头部长度(header length)8位服务类型(Type Of Service)16位总长度(total length)16位标识(id)3位标志字段13位分片偏移(…

PEIS源码 体检源码 医院体检系统源码

PEIS体检管理系统源码 PEIS源码 体检源码 医院体检系统源码 本套PEIS医院体检管理系统源码,采用C#语言开发,C/S架构,前台开发工具为Vs2012,后台数据库采用oracle大型数据库。有演示。 文末获取联系 PEIS体检管理系统适用于大中型…

03-Mybatis的基本使用-注解配置文件+xml配置文件

目录 1、环境准备 2、注解配置文件 基础操作01-通过ID删除数据 基础操作02-插入数据 基础操作03-更新数据 基础操作04-根据ID查询数据 基础操作05-条件查询数据 3、xml配置文件 1、环境准备 1. 创建数据库数据表 -- 部门管理 create table dept(id int unsigned prim…

继续学c++

由于c里面有很多和c语言很像的东西,这里就来总结一点不像的或者要注意的,或者是我已经快忘记的; 先来一个浮点型也就是实型类型的总结; 知道浮点型有这两个类型:float和double型; 然后float型占四个字节…

儿童用灯哪个品牌好?分享五款儿童护眼台灯品牌

家中有小朋友上了幼儿园就已经戴上了眼镜,太让人心疼了 近视已经成为世界难题,而我国儿童近视形式尤为严峻 据官方数据显示,我国儿童青少年总体近视率竟高达52.7% 如何保护孩子眼睛,儿童用灯哪个品牌好? 那今天&am…

代码随想录之动态规划(力扣题号)

62 不同路径 很简单的dp class Solution {public int uniquePaths(int m, int n) {//58-02int[][] dp new int[m][n];//初始化for(int i 0;i<m;i){dp[i][0] 1;}for(int i 0;i<n;i){dp[0][i] 1;}for(int i1;i<m;i){for(int j 1;j<n;j){dp[i][j] dp[i-1][j]d…

基于LS1028 TSN 交换机软件系统设计与实现(三)

NXP 推出 OpenIL 作为用于工业领域的 Linux 发行版&#xff0c; OpenIL 新增的部分中 含有&#xff1a;支持实时的操作系统的扩展和支持工业厂房中自动化 OEM 的 Time-Sensitive 网络。 OpenIL 作为开放型的工业 Linux 系统最大的优势便是将实时计算在网络中 的…

基础数据结构------单链表

1、链表使用的解决方案 【链表的概述】 链表是一种物理存储单元上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点&#xff08;链表中每一个元素称为结点&#xff09;组成&#xff0c;结点可以在运行时动态生成。…

调度系统: Quartz

最近在做数据中台架构设计&#xff0c;整体架构设计完后发现数据中台最重要的就是元数据和调度系统。元数据设计参考了atlas、metcat、datahus&#xff0c;模型设计、数据架构、技术架构基本完成。现在设计调度系统&#xff0c;才发现调度系统不像别的系统&#xff0c;主要是理…

Vivado之VIO原理及应用

虚拟输入输出&#xff08;Virtual Input Output,VIO)核是一个可定制的IP核&#xff0c;它可用于实时监视和驱动内部FPGA的信号&#xff0c;如图所示。 可以定制VIO的输入和输出端口的数量与宽度&#xff0c;用于和FPGA设计进行连接。由于VIO核与被监视和驱动的设计同步&#xf…

(leetcode)20. 有效的括号 13. 罗马数字转整数 14. 最长公共前缀

目录 20. 有效的括号 思路 代码 13. 罗马数字转整数 思路 代码 14. 最长公共前缀 思路 代码 20. 有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&…

Rabbitmq学习笔记教程-尚硅谷

Rabbitmq学习笔记 &#xff08;尚硅谷&#xff09; 尚硅谷 rabbitmq 教程 1.MQ 的概念 1.1 什么是 MQ? 存放消息的队列&#xff0c;互联网架构中常见的一种服务与服务之间通信的方式。 1.2 为什么要用 MQ? 三大好处&#xff0c;削峰&#xff0c;解耦&#xff0c;异步。…

【C++类和对象】类和对象(上) {初识面向对象,类的引入,类的定义,类的访问限定符,封装,类的作用域,类的实例化,类对象模型,this指针}

一、面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间的交互完成。…

推进数字化转型进程,AntDB数据库协同神州云动共促新发展

当今&#xff0c;数字化转型已成为企业发展的必由之路。随着新技术的不断发展和市场的日益竞争&#xff0c;越来越多的企业开始意识到数字化转型的重要性&#xff0c;在帮助企业数字化转型过程中&#xff0c;高效的客户关系管理软件和具有灵活性、可伸缩的数字底座&#xff0c;…

nodejs+vue 智能餐厅菜品厨位分配管理系统

系统功能主要介绍以下几点&#xff1a; 本智能餐厅管理系统主要包括三大功能模块&#xff0c;即用户功能模块和管理员功能模块、厨房功能模块。 &#xff08;1&#xff09;管理员模块&#xff1a;系统中的核心用户是管理员&#xff0c;管理员登录后&#xff0c;通过管理员功能来…

第二章:uniapp整合axios之真机测试两问题

第二章&#xff1a;uniapp整合axios之真机测试两问题 上一章节&#xff0c;笔者编写了uniapp整合axios并实现前后端跨域请求的方案&#xff0c;完成了这些基本配置后&#xff0c;在浏览器端的测试基本是可以完成了&#xff0c;但是当笔者将程序运行到手机时&#xff0c;却出现…

coinex // 撮合引擎 逻辑流程 (两种数据源 初始化源和前端源)

目录 1 生产者 数据源 1.1. match-server 一启动 初始化数据 自动查询数据库 查询level2要展示的数据 1.2 match-server接收 前端发给Exchange-server的数据 2. 将查询/接受的数据EntrustOrder 转成 Order 解耦 过滤掉不要的属性 3.Order转成 OrderEvent 4. 分配序号发布…

行为识别预警系统 opencv

行为识别预警系统通过pythonopencv网络模型技术&#xff0c;行为识别预警系统对现场画面中人的行为进行智能分析&#xff0c;发现违规行为自动抓拍告警&#xff0c;同步回传后台存档提醒值班人员及时处理。OpenCV的全称是Open Source Computer Vision Library&#xff0c;是一个…