Android动画(一):坐标、区域、视图层级

Catalogue
  1. 1 坐标
  2. 2 区域
  3. 3 视图层级
  4. 参考资料

笔者已将本节的代码上传至 Github,大家可以结合着学习。

1 坐标

event.getX():表示的是触摸的点距离自身左边界的距离。
event.getY():表示的是触摸的点距离自身上边界的距离。
event.getRawX:表示的是触摸点距离屏幕左边界的距离。
event.getRawY:表示的是触摸点距离屏幕上边界的距离,包括状态栏。
View.getX:表示View左上角相对于父容器的x坐标。
View.getY:表示View左上角相对于父容器的y坐标。
View.getTranslationX():计算的是该View在X轴的偏移量。初始值为0,向左偏移值为负,向右偏移值为正。
View.getTranslationY():计算的是该View在Y轴的偏移量。初始值为0,向上偏移为负,向下偏移为正。
View.getLocationInWindow(pos):计算的是view在其父窗口中的坐标位置。
View.getLocationOnScreen(pos):计算的是view在其整个屏幕上的坐标位置。

知识补充
1、Android中每个 View 都有一个自己的坐标系,彼此之间是不影响的。这个坐标系的原点是 View 左上角的那个点;水平方向是 x 轴,右正左负;竖直方向是 y 轴,下正上负。查看来源
2、如果重写 Activity 的onTouchEvent(MotionEvent event)方法,这个时候 event.getX() 与 event.getRawX() 获取的值是一样的,event.getY() 与 event.getRawY() 获取的值是一样,但是直接触摸状态栏、底部导航栏时的坐标位置不能获得。查看来源
3、view.translationX 表示 view 在原来基础上移动多少,view.X 表示最终要移动到X轴的哪个位置,view.getX() 的值为 view.getLeft() 与 view.getTranslationX() 之和。查看来源
4、注意 canvas.translate 与 view.translationX 是不同的,前者表示 canvas 在上次基础上移动多少。(适用所有 translate() 类的方法。)
5、当view是在dialog 或 popupWindow 上显示时,getLocationInWindow获得的值是相对于 dialog 或者 popuwindow 左上角的坐标。查看来源1 | 查看来源2

2 区域

我为便于表述,统一把视图大小视图范围Android 5.0主题风格的知识都划归到这一部分,大家不必纠结,重点关注每个知识点的概念以及区别。
View.getWidth():表示的是当前控件的宽度,即getRight()-getLeft()。
View.getHeight():表示的是当前控件的高度,即getBottom()-getTop()。
View.getTop():子View的顶部到父View顶部的距离。
View.getRight():子View的右边界到父View的左边界的距离。
View.getBottom():子View的底部到父View的顶部的距离。
View.getLeft():子View的左边界到父View的左边界的距离。
View.getGlobalVisibleRect(rect):得到整体相对于屏幕(包括状态栏)的区域范围rect,这个rect表示当前view的范围。
View.getLocalVisibleRect(rect):得到自己显示的区域,这个区域的坐标是相对自身的,仅仅用来表示自身所占的范围。左上角坐标一直为(0,0),右下角通过计算可得。
View.getWindowVisibleDisplayFrame(rect):获取到程序显示的区域,包括标题栏(ActionBar),不包括状态栏、导航栏、键盘区域(如弹起)。

知识补充
1、Android手机获取屏幕分辨率高度因虚拟导航栏带来的问题。
2、如何在onCreate方法中获取状态栏,底部导航栏高度?
(注意:即使状态栏、底部导航栏被隐藏,他们的高度依然可以按链接中的方法得到。)
3、获取View高度的三种方法。

Android 5.0之后的主题风格:

1、如果 app 的标题栏仍是使用 actionbar,则直接在风格 (styles) 或是主题 (themes) 里进行设定 colorPrimary 参数即可;若是采用 toolbar 的话,则要在界面 (layout) 里面设定 toolbar 控件的 background 属性。
2、如果在 style 中设置了 statusBarColor,则会覆盖 colorPrimaryDark 的影响,即:状态栏的颜色将是 statusBarColor。

3 视图层级

getParent:获取上一级容器。
getRootView: 获取顶级视图 ecorView。
getWindow().getDecorView():获取顶级视图 DecorView。
findViewById(android.R.id.content):获取 Xml 根布局的父容器。可想而知,不包括状态栏、标题栏(ActionBar)、导航栏。
对于视图层级,如果要深入了解的话,请参考这篇文章>>


参考资料

1.Android 屏幕坐标系
2.得到view坐标的各种方法