Android View体系是界面编程的核心,其重要性不亚于Android四大组件。
一. View简介
View是Android所有控件的基类,看下面这张图我们就会对其有一个直观的了解:
知道了View的层级关系有助于对View的理解,从上图可以发现我们常用的这些控件都是继承于View,如果我们更好的掌握了View的知识体系,那么我们在界面编程时则会更加的得心应手。
二. Android坐标系
Android中有两种坐标系,分别为Android坐标系和视图坐标系:
1.首先我们先来看看Android坐标系。
在Android中,将屏幕的左上角的顶点作为Android坐标系的原点,这个原点向右是X轴正方向,原点向下是Y轴正方向。
在下文讲到的MotionEvent提供的getRawX()和getRawY()获取的坐标都是Android坐标系的坐标。
2.视图坐标系
它描述的是子视图在父视图的位置关系,和Android坐标系不矛盾也不复杂,他们是相辅相成的,与Android 坐标系类似 , 视图坐标系同样是以原点向右是X轴正方向,原点向下是Y轴正方向。
只不过有点不同的是: 视图坐标系的原点是以父视图左上角为坐标原点.
了解视图坐标系各个方法 我们只需要看懂一张图就可以了:
三. 一些API
Android 系统中提供了非常多的方法来获取坐标值和相对距离,对于刚入门的人来说,在什么情况下使用什么方法会有点困惑,下面总结了一些 API , 结合上面的图就可以很清晰的明白了.
1. View 获取自身宽高
- getHeight(); 获取 View 自身的高度
- getWidth(); 获取 View 自身的宽度
2. View 提供的获取坐标方法
通过如下方法可以获得View到其父控件的距离
- getTop(); // 获取 View 自身 顶边 到其父布局 顶边 的距离
- getLeft(); // 获取 View 自身 左边到其父布局 左边 的距离
- getRight(); // 获取 View 自身 右边到其父布局 左边 的距离
- getBottom(); // 获取 View 自身 底边到其父布局 顶边 的距离
3. MotionEvent提供的方法
看到上图深蓝色的圆点,假设这个圆点是我们触摸屏幕的点.
MotionEvent也提供了各种获取焦点坐标的方法:
① 视图坐标
- getX(); // 获取点击事件 距离 控件左边的距离
- getY(); // 获取点击事件 距离 控件顶边的距离
② 绝对坐标
- getRawX(); // 获取点击事件距离 整个屏幕 左边的距离
- getRawY(); // 获取点击事件距离 整个屏幕 顶边的距离
四. 触控事件 - MotionEvent
触控事件 MotionEvent 在与用户的交互中占据着举足轻重的地位,上面说了几个MotionEvent的方法,接下来我们说下使用的方法:
1.MotionEvent封装的一些常用的 事件常量
public static final int ACTION_DOWN = 0; // 单点触摸按下动作
public static final int ACTION_UP = 1; // 单点触摸离开动作
public static final int ACTION_MOVE = 2; // 触摸点移动动作
public static final int ACTION_CANCEL = 3; // 触摸动作取消
public static final int ACTION_OUTSIDE = 4; // 触摸动作超出边界
public static final int ACTION_POINTER_DOWN = 5; // 多点触摸按下动作
public static final int ACTION_POINTER_UP = 6; // 多点触摸离开动作
通常情况下我们在onTouchEvent(MotionEvent event) 方法中通过 event.getAction() 来获取触控事件的类型,并使用switch-case方法来进行筛选。代码如下
public boolean onTouch( MotionEvent event) {
// 获取当前输入点的X、Y坐标(视图坐标)
int x = (int)event.getX();
int y = (int)event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// 处理按下事件
break;
case MotionEvent.ACTION_UP:
// 处理离开事件
break;
case MotionEvent.ACTION_MOVE:
// 处理移动事件
break;
}
return true;
}
这阶段的笔记就到这,有什么不对的地方欢迎指出。
感谢 各大神的无私分享。
下一篇笔记是 如何实现滑动。