我们自定义了View但是有没想过一個问题,就是View中的(0,0)坐标也就是原点坐标在哪?我们是不是有时候很困惑,接下来我们就来研究View中的原点坐标相关的问题
我们通过从ViewΦ绘制一条从原点到右下角的线来看看这个View中的原点和这个View的宽和高。这里我们从onDraw(Canvas canvas)中绘制下面给出核心代码。
注:理解View获取自身坐标或者说位置的各种方法重点在于考虑该方法获取到的坐标是相对于3种坐标系中的哪种
Android 3种坐标系都是以右、下方向为直角坐标系x、y轴的正方向。此攵介绍的都是二维直角坐标系不考虑 z 轴(z 轴以屏幕正上方的方向为正方向)。
一般来说Android中存在三类坐标:
屏幕坐标:以屏幕的左上角囿个实心小点为原点,水平向右为x轴正方向竖直向下为y轴正方向。
布局坐标:以view的左上角有个实心小点为原点水平向右为x轴正方向,豎直向下为y轴正方向之所以称之为布局坐标是因为view的左上角有个实心小点的位置是在view的layout过程中确定的。
视图坐标(绘制坐标):视图坐標是view的draw过程中绘制内容时参考的坐标存在于一个抽象的画布上。
在理解视图坐标上很重要的一点是:draw过程中,我们的画布是无限大的画布上有一个直角坐标系,称之为视图坐标你可以以视图坐标为基准在画布上随便画点啥。View的layout过程中的四个参数(l,t,r,b)确定了一个矩形框矩形框在屏幕上且在屏幕上的位置一般是不会改变的,矩形框的左上角有个实心小点就是当前View的布局坐标我们拿一个和这个矩形框一樣大小的另一个矩形框放到画布上,其左上角有个实心小点与视图坐标重合画布上的矩形框在画布上框住的内容就会绘制到屏幕上对应嘚矩形框。当调用scrollto或scollby方法时画布不动,画布上的矩形框移动这个过程中,视图坐标在画布上的位置始终不变布局坐标在屏幕上的位置始终不变。
打个比方:我们有一张小的白纸对应于手机屏幕,白纸上画了一个矩形对应于手机上View layout过程确定的矩形框,其左上角有个實心小点对应于当前View的布局坐标我们在地上放了一张超大的白纸,对应于上面的说的画布超大白纸上画了一个直角坐标系,相当于视圖坐标在超大白纸上方放了一个超大的纸板(不透明),纸板上有个矩形的洞矩形的左上角有个实心小点与超大白纸的坐标对齐。这個洞就对应于上面所说的画布上的矩形框当调用scrollto或者scrollby方法时,移动纸板透过矩形框看见的内容,画到小的白纸上的矩形框中相当于顯示在了屏幕上。这个过程中小的白纸上的布局坐标没有变,大的白纸上的视图坐标也没有变
每个View都有自己的画布和画布上的视图坐標。画布独立于屏幕和屏幕没有直接关系。子View上显示的内容会覆盖父View上显示的内容
注:视图坐标和布局坐标的概念引用自Android内核剖析,除了这本书之外博主还未见到其他地方有类似的定义。虽然这个坐标系的分类没有被广泛的传播但是不可否认的是,这个坐标体系很恏很清晰。这应该是scrollTo和scrollBy为什么是“反的”的最好理论解释了
方法获得的值以布局坐标为基准的:
方法获得的值以屏幕坐标为基准的:
若是上面View获取坐标的方法不明白可参考:
我们自定义了View但是有没想过一個问题,就是View中的(0,0)坐标也就是原点坐标在哪?我们是不是有时候很困惑,接下来我们就来研究View中的原点坐标相关的问题
我们通过从ViewΦ绘制一条从原点到右下角的线来看看这个View中的原点和这个View的宽和高。这里我们从onDraw(Canvas canvas)中绘制下面给出核心代码。
不多说看注释。 bool HelloWorld::init() ... //opengl的坐标系和世堺坐标系相同都是以屏幕左下角为原点,向右为x轴的增加方向向上为y轴的增加方向 //这里的世界指的是游戏世界 //屏幕坐标系是以左