是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在坐标系中的位置描述方式,如果有什么讲解错误之处或是有什么疑问,欢迎留言讨论。