【Android 应用开发】Android 组件 位置坐标 属性 ( 组件位置属性 | 父容器坐标系坐标 | 窗口坐标系坐标 | 屏幕坐标系坐标 | 触摸坐标 )

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 【Android 应用开发】Android 组件 位置坐标 属性 ( 组件位置属性 | 父容器坐标系坐标 | 窗口坐标系坐标 | 屏幕坐标系坐标 | 触摸坐标 )

文章目录

I . View 坐标体系总结

II . View 组件的 left , top , right , bottom 父容器相对位置

III . View 组件的 x , y , translationX , translationY 属性

IV . View 组件 窗口坐标 属性

V . View 组件 屏幕坐标 属性

VI . View 组件的触摸位置 属性

VII . View 坐标获取 0 的解决方案



I . View 坐标体系总结


left , top , right , bottom 是组件相对于父容器的位置 , 该值一般不会改变 ;


x , y 是组件当前相对于父容器的位置 ;


translationX , translationY 分别是相对于 left , top 值的偏移大小 ;


left + translationX = x , top + translationY = y ;


窗口坐标获取 : getLocationInWindow ;


屏幕坐标获取 : getLocationOnScreen ;


触摸坐标 : x , y 触摸坐标是相对于组件的坐标 , rawX , rawY 是相对于屏幕的坐标 ;




II . View 组件的 left , top , right , bottom 父容器相对位置


1 . View 组件的基础位置 : left , top , right , bottom 是 View 组件的最基本的位置属性 , 其作用是 描述该组件相对于父容器的位置 ;



2 . 相对父容器位置 : 这里特别注意 , left , top , right , bottom 属性 , 是 相对于父容器的位置 , 不是 相对于 Activity 界面位置 , 也不是 相对于屏幕的位置 ;



3 . 属性本质 : left , top , right , bottom , 四个属性本质是坐标值 ;



4 . 父容器 坐标系 及 坐标原点 : 四属性的坐标值原点 ( 0 , 0 ) (0, 0)(0,0) 是父容器的左上角位置 , x xx 轴向右为正 , 向左为负 , y yy 轴向下为正 , 向上为负 ;



5 . 组件基础位置属性 : 组件的基础位置属性是不会改变的 ;



① left 属性 : 组件的左侧 x xx 轴坐标 , 值为左侧距离父容器左侧的长度 , 本组件左上角顶点 , 在父容器坐标系的 x xx 值 ;


② top 属性 : 组件的顶部 y yy 轴坐标 , 值为顶部距离父容器顶部的高度 , 本组件左上角顶点 , 在父容器坐标系的 y yy 值 ;


③ right 属性 : 组件的右侧 x xx 轴坐标 , 值为右侧距离父容器左侧的长度 , 本组件右下角顶点 , 在父容器坐标系的 x xx 值 ;


④ bottom 属性 : 组件的底部 y yy 轴坐标 , 值为底部距离父容器顶部的长度 , 本组件右下角顶点 , 在父容器坐标系的 y yy 值 ;




III . View 组件的 x , y , translationX , translationY 属性


1 . View 组件的当前位置 : x , y , translationX , translationY 是 View 组件的当前位置 , 其作用是 描述当前的实际位置 , 该位置也是相对于父容器的坐标 , 这里要与基础位置区分开 ;



2 . 组件当前位置 属性 : x , y 是当前的位置 , 这个位置会随着 translationX 和 translationY 的值改变而改变 ;



① x : 表示组件左上角当前的实际位置的 x 坐标 , 该坐标是父容器坐标系中的坐标 , 原点是父容器左上角位置 ;


② y : 表示组件左上角当前的实际位置的 y 坐标 , 该坐标是父容器坐标系中的坐标 , 原点是父容器左上角位置 ;



3 . 偏移位置 : translationX , translationY , 是基于基础位置 left , top 的偏移位置 ;



4 . 当前位置 和 偏移位置 的 初始值 : x 的初始值是 left , y 的初始值是 top , translationX 初始值是 0 , translationY 初始值是 0;




5 . View 组件 坐标属性之间的关系 :



① x , left , translationX 关系 :


x = l e f t + t r a n s l a t i o n X x = left + translationX

x=left+translationX


② y , top , translationY 关系 :


y = t o p + t r a n s l a t i o n Y y = top + translationY

y=top+translationY




6 . 代码分析 :



① View 组件获取 x 属性代码分析 : x 的值 , 由 left 加上 translationX 得到 ;


/**
 * The visual x position of this view, in pixels. This is equivalent to the
 * {@link #setTranslationX(float) translationX} property plus the current
 * {@link #getLeft() left} property.
 *
 * @return The visual x position of this view, in pixels.
 */
@ViewDebug.ExportedProperty(category = "drawing")
public float getX() {
    return mLeft + getTranslationX();
}
1


② View 组件获取 y 属性代码分析 : y 的值 , 由 top 加上 translationY 得到 ;


/**
 * The visual y position of this view, in pixels. This is equivalent to the
 * {@link #setTranslationY(float) translationY} property plus the current
 * {@link #getTop() top} property.
 *
 * @return The visual y position of this view, in pixels.
 */
@ViewDebug.ExportedProperty(category = "drawing")
public float getY() {
    return mTop + getTranslationY();
}



IV . View 组件 窗口坐标 属性


1 . 获取 View 组件窗口坐标 : 这里的窗口指的是 Activity 窗口 ;



① 所在坐标系 : 坐标系的原点 ( 0 , 0 ) (0 ,0)(0,0) 是 Activity 窗口的左上角位置 ;


② 区分屏幕坐标 : Activity 窗口上还有一个状态栏 , 这里要与屏幕坐标系区分开 ;


③ 获取方法 : 调用 View 组件对象的 getLocationInWindow ( ) 方法 , 数组 0 索引是 x 坐标 , 数组 1 索引是 y 坐标 ;


int[] array = new int[2];
surfaceView.getLocationInWindow(array);



V . View 组件 屏幕坐标 属性


1 . 获取 View 组件屏幕坐标 : 这里的屏幕指的是手机屏幕 ;



① 所在坐标系 : 坐标系的原点 ( 0 , 0 ) (0 ,0)(0,0) 是 手机屏幕的左上角位置 ;


② 获取方法 : 调用 View 组件对象的 getLocationOnScreen ( ) 方法 , 数组 0 索引是 x 坐标 , 数组 1 索引是 y 坐标 ;


int[] array = new int[2];
surfaceView.getLocationOnScreen(array);



VI . View 组件的触摸位置 属性


View 组件的触摸事件的位置属性 :



① x , y 相对于组件坐标 : 当触摸组件时 , 从 MotionEvent 事件中获取的 x , y 坐标是 相对于本组件的坐标 , 即坐标系的原点 ( 0 , 0 ) ( 0, 0 )(0,0) 是该组件的左上角位置 ;


② rawX , rawY 相对于屏幕坐标 : 从 MotionEvent 事件中获取的 rawX , rawY 坐标 , 是当前触摸点相对于屏幕的坐标 , 即坐标系的原点 ( 0 , 0 ) (0, 0)(0,0) 是屏幕的左上角位置 ;




VII . View 坐标获取 0 的解决方案


1 . 问题描述 : 在获取组件 位置 , 宽高 时 , 经常遇到获取组件的值为 0 00 的情况 , 这是因为该组件还没有绘制完成 ;



2 . 解决方案 : 获取 ViewTreeObserver , 监听布局树的绘制情况 , 组件绘制时 , 需要测量 ( Measure ) , 摆放 ( Layout ) , 绘制 ( Draw ) , 此时监听的是摆放操作 , 摆放完毕后 , 就可以获取组件的坐标和大小属性 ;



3 . 监听 Layout 代码 :


surfaceView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        //此时可以获取 View 的坐标和大小 , 不为 0
    }
});



目录
相关文章
|
4月前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
5月前
|
存储 Android开发 开发者
深入理解安卓应用开发的核心组件
【10月更文挑战第8天】探索Android应用开发的精髓,本文带你了解安卓核心组件的奥秘,包括Activity、Service、BroadcastReceiver和ContentProvider。我们将通过代码示例,揭示这些组件如何协同工作,构建出功能强大且响应迅速的应用程序。无论你是初学者还是资深开发者,这篇文章都将为你提供新的视角和深度知识。
|
5月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
166 0
|
3月前
|
XML 搜索推荐 前端开发
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
5月前
|
XML 前端开发 Java
安卓应用开发中的自定义View组件
【10月更文挑战第5天】自定义View是安卓应用开发的一块基石,它为开发者提供了无限的可能。通过掌握其原理和实现方法,可以创造出既美观又实用的用户界面。本文将引导你了解自定义View的创建过程,包括绘制技巧、事件处理以及性能优化等关键步骤。
|
5月前
|
测试技术 数据库 Android开发
深入解析Android架构组件——Jetpack的使用与实践
本文旨在探讨谷歌推出的Android架构组件——Jetpack,在现代Android开发中的应用。Jetpack作为一系列库和工具的集合,旨在帮助开发者更轻松地编写出健壮、可维护且性能优异的应用。通过详细解析各个组件如Lifecycle、ViewModel、LiveData等,我们将了解其原理和使用场景,并结合实例展示如何在实际项目中应用这些组件,提升开发效率和应用质量。
100 6
|
6月前
|
存储 开发框架 数据可视化
深入解析Android应用开发中的四大核心组件
本文将探讨Android开发中的四大核心组件——Activity、Service、BroadcastReceiver和ContentProvider。我们将深入了解每个组件的定义、作用、使用方法及它们之间的交互方式,以帮助开发者更好地理解和应用这些组件,提升Android应用开发的能力和效率。
432 5
|
6月前
|
移动开发 数据管理 HTML5
Twaver-HTML5基础学习(22)层管理容器(LayerBox)、告警管理容器(AlarmBox)、列管理容器(ColumnBox)、属性管理容器(PropertyBox)
本文介绍了Twaver HTML5中的多种管理容器:层管理容器(LayerBox)、告警管理容器(AlarmBox)、列管理容器(ColumnBox)和属性管理容器(PropertyBox)。文章解释了这些容器的作用、如何获取它们,并提供了一些基本的操作方法。这些容器分别用于管理图层、告警、表格列和属性对象,是TWaver中数据管理和组织的重要部分。
61 1
|
6月前
|
缓存 搜索推荐 Android开发
安卓应用开发中的自定义View组件实践
【9月更文挑战第10天】在安卓开发领域,自定义View是提升用户体验和实现界面个性化的重要手段。本文将通过一个实际案例,展示如何在安卓项目中创建和使用自定义View组件,包括设计思路、实现步骤以及可能遇到的问题和解决方案。文章不仅提供了代码示例,还深入探讨了自定义View的性能优化技巧,旨在帮助开发者更好地掌握这一技能。
|
7月前
|
XML 搜索推荐 Android开发
安卓开发中的自定义View组件实践
【8月更文挑战第30天】探索Android世界,自定义View是提升应用界面的关键。本文以简洁的语言带你了解如何创建自定义View,从基础到高级技巧,一步步打造个性化的UI组件。