Android View的坐标获取详解以及动画坐标分析

news2024/11/24 23:34:28

1、介绍

        在平面图形中,图形都是由点坐标确定的。同样,Android的设备屏幕也是一个,如果非3D图形,正常的view就是一个二维坐标 

参考View

        屏幕的左上角的坐标A(0,0),如果屏幕的宽为:width,高:height 那么右下角的坐标是D(width,height)

 坐标的顶点从A点,向右和向下两个方向延伸。所有横坐标为X轴,中坐标是Y轴,变成坐标

D(x,y)=D(width,height)

二、分析

        通过上面的介绍,我们知道了屏幕中坐标点的基本逻辑与知识。很多人在使用中,发现获取坐标点与理想的不一致。通过view.getX()或者view.getY()。

有人会疑问:

getPivotX()和getPivotY()不也是坐标嘛?其实这个与getX()和getY()是有区别的,

(getPivotX(),getPivotY())是旋转中心点的坐标

(getX(),getY())点坐标

坐标点分类:

坐标点分为两大类,一种是在父控件中的绝对坐标点,还有一个是屏幕。

1.父控件:

获取(getX(),getY()),其实就是获取在父控件的坐标

如上图,根布局点A(0,0)的坐标,B是子布局(10,10),C(10,10)是子布局的子布局,三层嵌套。

相对根布局来说,其实C在屏幕中的坐标应该是(20,20),这是通过获取ViewC在屏幕中的坐标,如果是(10,10),就是在父控件中的坐标

涉及屏幕坐标:

1、getLocationInWindow:

        计算此视图在其窗口中的坐标。参数必须是一个由两个整数组成的数组。方法返回后,数组将按顺序包含x和y位置

2、getLocationOnScreen:

        计算此视图在屏幕上的坐标。参数必须是一个由两个整数组成的数组。方法返回后,数组将按顺序包含x和y位置。

3、getLocationInSurface:

        计算视图在曲面内的坐标。计算此视图在其曲面中的坐标。参数必须是一个由两个整数组成的数组。方法返回后,数组将按顺序包含x和y位置

注意:

        屏幕坐标相对根布局坐标存在误差,X轴是相同的,但是Y轴会有误差,这个误差的距离是顶部状态栏的高度。

如何获取真实高度,用获取到屏幕中的坐标减去状态栏的高度。

状态栏高度获取:

           var f = Rect()
            window.decorView.getWindowVisibleDisplayFrame(f)
            var statusBarHeight=f.top

获取view在屏幕中的坐标:

    var locationWindow = IntArray(2)
            bind.img.getLocationInWindow(locationWindow)
            MyLog.log("坐标----getLocationInWindow", "${locationWindow[0]},${locationWindow[1]}")

View在根布局真实的坐标:

    var locationWindow = IntArray(2)
            bind.img.getLocationInWindow(locationWindow)
       var f = Rect()
            window.decorView.getWindowVisibleDisplayFrame(f)
       var trueY=locationWindow(1)-f.top

    

计算出Y轴的真是坐标,(locationWindow(0),trueY)

注意:

第一点:

正常窗口是两种,一种是全屏,另外一种是有状态栏。如果你当前的Activity是全屏,那么获取到的窗口坐标就是View的坐标。即使你通过window获取状态栏也是为0 。

第二点:

getLocationInWindow,getLocationOnScreen,getLocationInSurface,这三个获取的坐标可能会随着屏幕发生改变而改变。

如何测试?

我们可以通过shell命令修改屏幕大小来观察

如何修改屏幕显示大小:

第一步:adb shell,进入shell

第二步:wm size,查看当前设备的尺寸

第三步:wm size 360x480,修改屏幕是360x480,这里x不能通过*来代替。

第四步:wm size reset,还原设备到原来的尺寸,或者指定原尺寸大小也可以

如果设置分辨率出现以下情况:

 可以在开发者中,开启USB调试(安全设置)

通过以上的测试,可以看出坐标随着屏幕发生的变化。如果修改完,发现launch无法启动,可能你的launch出现了BUG,黑屏,只能操作底部的导航(SystemUI),需要重新启动设备。

动画与坐标

        通过上面的坐标学习,我们现在可以很清楚的知道了坐标在不同view中的真是数据。为什么要讲坐标?

        坐标对于动画来说至关重要,为什么这么说?如果获取不到真实的数据,那么动画就达不到想要的目的,影响用户体验。通过以上学习,可以帮助动画找到真实的数据。

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

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

相关文章

【C/C++】使用C++和Direct3D (d3d)获取屏幕截图并根据传入分辨率进行缩放图片大小

目录 一,函数清单 1.Direct3DCreate9 函数 2.IDirect3D9::CreateDevice 方法 3.IDirect3DDevice9::GetDisplayMode 方法 4.IDirect3DDevice9::CreateOffscreenPlainSurface 方法 5.IDirect3DDevice9::GetFrontBufferData 方法 6.IDirect3DDevice9::D3DXLoadS…

Zookeeper工作原理

一 Zookeeper是什么 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易…

【Spring】我抄袭了Spring,手写一套MySpring框架。。。

这篇博客实现了一个简单版本的Spring,主要包括Spring的Ioc和Aop功能 文章目录这篇博客实现了一个简单版本的Spring,主要包括Spring的Ioc和Aop功能🚀ComponentScan注解✈️Component注解🚁在spring中ioc容器的类是ApplicationConte…

迅为4412开发板Qt 界面切换

本节通过实验介绍通过创建窗口对象的方式实现界面切换: 步骤一: 在主界面 ui 文件添加 pushButton 按钮, 然后新建一个窗口,工程下创建新的 Qt 设计师界面类,如图 : 我们选择 Widget,用户可以根…

logstash+elasticsearch+Kibana(ELK)日志收集

文章目录一.安装elasticsearch二. 安装kibana三.配置logstash四.springboot整合logstash五.spring整合Elastic Search六. 定时清理不要一股脑执行以下语句,请观察修改要修改的地方 注意给logstash,elasticsearch,kibana释放端口,云服务器提供商和系统的端口 一.安装elasticsea…

为什么许多人吐槽C++11,那些语法值得我们学习呢?

致前行的人: 人生像攀登一座山,而找寻出路,却是一种学习的过程,我们应当在这过程中,学习稳定冷静,学习如何从慌乱中找到生机。 目录 1.C11简介 2.统一的列表初始化 2.1 {}初始化 …

linux-php 7.3.2安装

1.下载php wget http://am1.php.net/distributions/php-7.3.2.tar.gz 2.解压 tar -zxvf php-7.3.2.tar.gz 3.安装扩展 接下来进行参数配置,配置前如果没有libxml2和libxml2-devel会报错,所以应该更新libxml2并安装libxml2-devel,使用在线…

SpringBoot 项目整合 Redis 教程详解

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

Android Init(后期还会更加完善)

代码分析基于android-12.0.0_r28 前期阶段 kernel/init/main.c: static int __ref kernel_init(void *unused) {// ...省略一堆代码if (execute_command) {ret run_init_process(execute_command);if (!ret)return 0;panic("Requested init %s failed (err…

八百字讲清楚——BCEWithLogitsLoss二分类损失函数

BCEWithLogitsLoss是一种用于二分类问题的损失函数,它将Sigmoid函数和二元交叉熵损失结合在一起。 假设我们有一个大小为NNN的二分类问题,其中每个样本xix_ixi​有一个二元标签yi∈0,1y_i\in {0,1}yi​∈0,1,并且我们希望预测每个样本的概率…

RCNN系列发展历程

1. RCNN RCNN发表于CVPR 2014。是将深度学习应用于目标检测领域的开山之作,凭借卷积神经网络较之传统CV方法的强大特征提取能力,将PASCAL VOC数据集检测率从35.1%提升到53.7%。 RCNN的算法流程如下图所示,其过程主要分为4步: 生成…

Ubuntu中隐藏Apache的版本号等信息

Ubuntu中隐藏Apache的版本号等信息 vim /etc/apache2/apache2.conf在apache主配置文件的末尾增加以下内容: ServerTokens Prod ServerSignature offServerTokens: 默认阀值为Full,以apache-2.0.55为例,阀值可以设定为以下某项&a…

【完整项目开发】Springboot+jsp宠物医院信息管理系统设计和实现--依旧很干

Springbootvue宠物医院信息管理系统设计和实现 **大家好,今天分享最近做的一套系统。**起因源于小伙伴的需求 文末有的获取方式,如需定制系统,需求发来,我为你分忧,搞起 一、 项目介绍 宠物医院信息管理系统是一种…

香港轻量云服务器安全性如何?

​  之前,对于新手外贸站长而言,部署网站首要青睐是香港虚拟主机。但大多人也都清楚,每台香港虚拟主机的资源是由一台物理机分割来的。这无疑会带来一定的安全隐患,比如分割出来的多台香港虚拟主机会共用传统的系统、管理面板以…

Vue3评分(Rate)

可自定义设置以下属性: 是否允许再次点击后清除(allowClear),类型:boolean,默认 true 是否允许半选(allowHalf),类型:boolean,默认 false star …

Java每日一练(20230417)

目录 1. N 皇后 🌟🌟🌟 2. 搜索二维矩阵 🌟🌟 3. 发奖金问题 🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 …

神经网络之反向传播算法(自适应矩估计算法Adam变形形式之Adamax、Nadam)

文章目录自适应矩估计算法(Adam)的两种变形形式1、Adamax算法原理2、Nadam算法原理3、算法实现3.1 Adamax训练过程3.2 Adamax测试过程及结果3.3 Nadam训练过程3.4 Nadam测试过程及结果4、参考源码及数据集自适应矩估计算法(Adam)的…

打造安全无忧软件应用的十大最佳实践

安全无忧的软件开发最佳实践实在是很有必要,因为安全风险无处不在。在网络攻击盛行的时代,它们可能影响到每个人,包括个人、公司和政府。因此,确保软件开发的安全性至关重要。 本篇文章将解释了什么是安全的软件,如何…

你了解C语言中的柔性数组吗?

本篇博客主要讲解C99中的新语法:柔性数组。 1.什么是柔性数组? 柔性数组就是大小可以变化的数组。 注意跟C99中的变长数组区分开来,变长数组指的是可以使用变量来指定大小,并且不能初始化的数组,比如: i…

实例方法、类方法、静态方法、实例属性、类属性

背景:今天在复习类相关知识的时候,突然想到这几种类型的方法的区别和用法,感觉有点模棱两可,于是总结一下,加深记忆。 定义:想要区别和理解几种方法,首先要定义一个类,要在类中加深…