本文已参与「新人创作礼」活动,一起开启掘金创作之路。
View 及ViewGroup
在Android中,常用控件可大致分为两大类:View与ViewGroup。ViewGroup可包含多个View及ViewGroup,形成一个树状结构。需要注意的是ViewGroup也继承自View。View及ViewGroup组织结构如下:

常见的可视控件都是View的子类,如:TextView ,Button ,ImageView 等。
常见的布局控件都是ViewGroup的子类,如:LinearLayout ,FrameLayout , RelativeLayout 等。
坐标系
在Android中有两种坐标系:Android坐标系和View坐标系。了解坐标系是对View进行更多操作的基础。
Android坐标系
以屏幕左上角为原点,原点向右为X轴正方向,原点向下为Y轴正方向。在触控事件中,getRawX()、getRawY()获取的坐标也是Android坐标系的坐标。

View坐标系
View坐标系是以View为基础的坐标系,搞清楚下图的关系也就清楚了View坐标系。

下面解释一下上图中涉及到的各个方法。 其中下面4个方法可在View中直接获取:
getTop():获取View顶边到父View顶边的距离getBottom():获取View底边到父View顶边的距离getLeft():获取View左边到父View左边的距离getRight():获取View右边到父View左边的距离
剩余4个方法需要在View有触摸事件发生时,通过onTouchEvent(MotionEvent event)方法中的event获取:
getX():触摸点到View左边的距离getY():触摸点到View顶边的距离getRawX():触摸点到屏幕左边的距离getRawY():触摸点到屏幕顶边的距离
示例代码如下:
public class MyView extends View {
public MyView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
int top = getTop();
int bottom = getBottom();
int left = getLeft();
int right = getRight();
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
float rawX = event.getRawX();
float rawY = event.getRawY();
return super.onTouchEvent(event);
}
}
源码见Github
参考文献: 《Android进阶之光》 《Android开发艺术探索》
学习更多知识,请关注我的个人博客:droidYu