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

这篇具有很好参考价值的文章主要介绍了Android 对View 进行旋转、缩放、平移的属性变换后,获取外矩形顶点。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

来张图
Android 对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 = tx
    view.translationY = ty

    val px = view.pivotX
    val py = view.pivotY
    view.pivotX = view.left + view.width/2f
    view.pivotY = view.top + view.height/2f
//        view.rotationX = rx
//        view.rotationY = ry
    view.rotation = ry
    view.scaleX = sx
    view.scaleY = sy
    view.pivotX = px
    view.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) / 2f
	val cy = t + (b - t) / 2f
	matrix.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 中的顺序 用 RSTSRT 都会得到正确的结果;但若用 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完整代码文章来源地址https://www.toymoban.com/news/detail-422321.html

到了这里,关于Android 对View 进行旋转、缩放、平移的属性变换后,获取外矩形顶点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 三维变换矩阵实战——三维点云的旋转、缩放、镜像、错切、平移、正交投影

    旋转矩阵:右边矩阵是点云的原始坐标,左边的是旋转矩阵     可视化:绕x轴旋转90度 代码: 旋转矩阵:    可视化:绕y轴旋转180度 代码: 旋转矩阵:    可视化:绕z轴旋转90度 代码: 旋转矩阵:  线绕哪个轴转,xyz矩阵就和哪和轴的旋转矩阵先计算      可视化:先

    2024年02月04日
    浏览(71)
  • 数字图像处理 matlab图像的几何运算 实验三 旋转 缩放 裁剪 镜像变换 平移

    原图: 读取原图(这里我的图片名字是atm.png): 我们先说原理,图像旋转的本质是向量的旋转。 矩阵乘法的实质是进行线性变换,因此对一个向量进行旋转操作也可以通过矩阵和向量相乘的方式进行。 因为图像都是通过二维矩阵存放的(单通道),所以对图像进行旋转时

    2024年02月07日
    浏览(41)
  • 【C++】【Opencv】cv::warpAffine()仿射变换函数详解,实现平移、缩放和旋转等功能

    仿射变换是一种二维变换,它可以将一个二维图形映射到另一个二维图形上,保持了图形的“形状”和“大小”不变,但可能会改变图形的方向和位置。仿射变换可以用一个线性变换矩阵来表示,该矩阵包含了六个参数,可以进行平移、缩放、旋转等操作。通过原理、函数和

    2024年02月05日
    浏览(35)
  • 【CSS笔记】CSS动画效果(2d、3d)之渐变色、过渡、变换、平移、缩放、旋转、倾斜、关键帧动画

    这篇文章,主要介绍CSS动画效果(2d、3d)之渐变色、过渡、变换、平移、缩放、旋转、倾斜、关键帧动画。 目录 一、2d动画 1.1、渐变色 (1)线性渐变色 (2)径向渐变色

    2024年02月02日
    浏览(78)
  • python实现两函数通过缩放,平移和旋转进行完美拟合

    前几天在工作的时候接到了一个需求,希望将不同坐标系,不同角度的两条不规则曲线,并且组成该曲线的点集数量不一致,需求是希望那个可以通过算法的平移和旋转搞到一个概念里最贴合,拟合态进行比较。 这是初步将两组数据画到图里的情况,和背景需求是一致的。其

    2024年02月15日
    浏览(25)
  • Android中矩阵Matrix实现平移,旋转,缩放和翻转的用法详细介绍

    一,矩阵Matrix的数学原理 矩阵的数学原理涉及到矩阵的运算和变换,是高等代数学中的重要概念。在图形变换中,矩阵起到关键作用,通过矩阵的变换可以改变图形的位置、形状和大小。矩阵的运算是数值分析领域的重要问题,对矩阵进行分解和简化可以简化计算过程。对于

    2024年01月22日
    浏览(45)
  • 【Android】Bitmap图片旋转、缩放、翻转等变换(90/100)

    自定义BitmapChangeView: 工具类: 布局引用: 应用如下: 推荐理由 postman在国内使用已经越来越困难: 1、登录问题严重 2、Mock功能服务基本没法使用 3、版本更新功能已很匮乏 4、某些外力因素导致postman以后能否使用风险较大 出于以上考虑因此笔者自己开发了一款api调试开发工

    2024年02月16日
    浏览(26)
  • GLSL——旋转、平移和缩放

    hello 兄弟们,好久不见撒,我又回来啦!,今天主要讲解如何在顶点着色器中进行旋转、平移和缩放,涉及到矩阵和向量方面的知识哦,忘记的可以翻一下高中数学啦,在讲之前,先回顾一下矩阵和向量点积的知识,矩阵点乘向量,等于矩阵的每一行分别和向量相乘的和,如

    2024年02月16日
    浏览(28)
  • Matlab图像的平移,旋转,缩放,裁剪

    %%------------------------Matlab图像的平移,旋转,缩放,裁剪------------------------------- %-------------------头文件----------------------------- clc ; %清屏幕 clear ; %删除所有的变量 close all ; %将所有打开的图片关掉 %--------------------图像平移 imtranslate-------------------------- A = imread(\\\'1.jpg\\\') ; subplot(

    2024年02月04日
    浏览(33)
  • webgl-矩阵、旋转、平移、缩放 glMatrix组件

    引入新组建glMatrix glMatrix.js /*! @fileoverview gl-matrix - High performance matrix and vector operations @author Brandon Jones @author Colin MacKenzie IV @version 3.4.3 Copyright (c) 2015-2021, Brandon Jones, Colin MacKenzie IV. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation f

    2024年02月10日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包