是Android的自定义View-基础知识-坐标系

2020-12-23  本文已影响0人  redrain39

坐标系

屏幕坐标系与数学坐标系的区别

由于移动设备一般定义屏幕左上角为坐标原点,向右为x轴增大方向,向下为y轴增大方向, 所以在手机屏幕上的坐标系与数学中常见的向右为x轴增大方向,向上为y轴增大方向的坐标系是稍微有点差别的,详情如下:
(PS:其中的∠a 是对应的,注意y轴方向!)

坐标系对比

右边的是手机屏幕上实际的坐标系。

Android中的坐标系统

在android中,屏幕、ViewGroup、View都有各自的参考坐标系,它们的坐标系和上文中所述一样是x轴向右,y轴向下来指导相关绘制。

View的位置描述

了解了Android系统的屏幕坐标系组成,接下来就可以来看看控件在坐标系中是如何被定位的:

首先一个控件在坐标中肯定是可以通过x、y来进行定义的,那么对于一个控件来说必然会处在一个参考坐标系里,这个参考坐标系就是它的父控件,确定了参考坐标系,那么就可以对控件进行位置定义,但是控件是一个方形区域,怎么来定义这个区域呢?

Android中通过对控件的左上角作为控件的参考点进行控件的位置定义,具体提供了如下的方法来进行描述:

view.width              // View的宽度
view.height             // View的高度

view.x                  // View左上角相对于ViewGroup左上角的X坐标位置
view.y                  // View左上角相对于ViewGroup左上角的Y坐标位置
view.z                  // 相对于屏幕的Z位置

view.left               // View左边相对于ViewGroup左边的距离
view.top                // View上边相对于VIewGroup上边的距离
view.right              // View右边相对于ViewGroup左边的距离
view.bottom             // View底边相对于ViewGroup上边的距离
view.elevation          // View的高度

view.translationX       // 在滑动过程中,View当前位置的最左边和这个View原始位置的最左边的距离
view.translationY       // 在滑动过程中,View当前位置的最上边和这个View原始位置的最上边的距离
view.translationZ       // 在动画过程中,View当前位置的Z轴高度和这个View原始Z轴高度的距离

可以发现View的位置描述是相对于其在的ViewGroup的,下面通过一张图来更加直观地感受一下这些位置描述的属性:

相对位置描述

因为translation的相关属性不是很好表示,这里先给出实际在view进行动画时的计算公式:

x = left + translationX;
y = top + translationY;
z = elevation + translationZ;

具体的内容,我们会在动画相关的章节详细介绍,这里先做一个了解。

触摸点的位置描述

Android程序员知道触摸需要重写onTouch方法,在onTouch方法中包含有一个MotionEvent,它提供了对于触摸点的位置描述:

event.x         // 触摸点相对于View的X坐标位置
event.y         // 触摸点相对于View的Y坐标位置
event.rawX      // 触摸点相对于屏幕最左侧的距离
event.rawY      // 触摸点相对于屏幕最上侧的距离

通过图例来更加直观地感受一下:


触摸点相对位置

View相对屏幕的距离

下面介绍三种获取View距离屏幕距离的方法,具体实现方法如下:

getLocationInWindow

val position = IntArray(2)
viewGroup.getLocationInWindow(position)
Log.d("coordinate-screen", "x: " + position[0])
Log.d("coordinate-screen", "y: " + position[1])

getLocationOnScreen

val position = IntArray(2)
viewGroup.getLocationOnScreen(position)
Log.d("coordinate-screen", "x: " + position[0])
Log.d("coordinate-screen", "y: " + position[1])

getGlobalVisibleRect

val rect = Rect()
viewGroup.getGlobalVisibleRect(rect)
Log.d("coordinate-screen", "x: " + rect.left.toString())
Log.d("coordinate-screen", "y: " + rect.top.toString())

总结

以上就是关于坐标系和View在坐标系中的位置描述方式,如果有什么讲解错误之处或是有什么疑问,欢迎留言讨论。

上一篇下一篇

猜你喜欢

热点阅读