前言
掌握View的事件体系是Android 向高级迈向的必经之路,本片博客讲解Android View的相关基础知识第一部分,后面我们会为大家讲解基础知识第二部分、VIew事件体系、View事件分发等知识内容。
1.View基础
1.1 什么是View
简单的说View是所有控件的“祖宗”,无论TextView、Button、Linearlayout,还是ListView、RecycleView,他们的基类都是View,多个View形成了ViewGroup,ViewGroup本身也是View,比如,TextView是一个View,LinearLayout是一个ViewGroup,ViewGroup中又可以添加许多View
1.2 View 坐标
View坐标是相对于View的父容器来讲的,View看作一个矩形,则View的左上角坐标为(left,top),Vew的右下角的坐标为(right,top),View如果发生改变,这四个值并不会发生改变,改变的是View的偏移量,坐标系如图1所示。
图 1.View坐标系
由坐标系则可以看出View的宽度为right - left 即getLeft() - getRight();View的高度为bottom - top 即getBoottom() - getTop();
在我刚开始接触Android的时候,在我想象中的样子View的坐标为图2 所示,莫名的感觉图2更符合我的思维习惯。
图 2 错误坐标系
1.3 View触摸事件
当手指触摸在View上的时候会触发MotionEvent中的ACTION_DOWN事件,当手指松开时会触发ACTION_UP 事件,如果我们的手指View上滑动又会触发ACTION_MOVE事件,在这里为了验证,我们新建一个类继承自View,重写他的onTouchEvenEvent事件,代码如下所示:
@Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: Log.d(Tag, "按下了"); break; case MotionEvent.ACTION_MOVE: Log.d(Tag, "移动中"); break; case MotionEvent.ACTION_UP: Log.d(Tag, "抬起了"); break; default: break; } return true; }
我们在xml布局中引用这个View,现在我们将手指放在屏幕上并移动一段时间抬起,打印结果如下:
由此我们可以验证上述.
我们可以使用getX和getY方法获取当前View左上角的坐标,由此我们可以通过记录分别记录按下和抬起时坐标,通过坐标计算可以判断用户是左右滑动或者上下滑动,代码如下所示:
@Override public boolean onTouchEvent(MotionEvent event) { startX = (int) event.getX(); startY = (int) event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: pressX = startX; pressY = startY; break; case MotionEvent.ACTION_MOVE: enxX = startX; endY = startY; break; case MotionEvent.ACTION_UP: if (enxX - pressX > 0) { Log.d(Tag, "向右滑动"); } else { Log.d(Tag, "向左滑动"); } break; default: break; } return true; }
由View坐标系我们可以知道如果抬起时X的值 大于 按下时X的值那么说明用户向右滑动了。现在我们手指向右滑动打印日志如下:
反之,手指向左滑动打印:
在我们操作的过程中,我们可能会发现有时候我们不经意点击一下,也会显示向左滑动或者向右滑动,如果我们使用此方法来做用户交互操作的话,用户可能不经意间就误操作了,所以在这里判断用户滑动我们需要一个临界值,这个临界值也就是最小滑动距离,最简单的我们可以在代码中判断滑动距离大于某个临近值的时候才判为用户滑动了,如果小于临界值则判为用户误操作,但把临近值写死显得并不友好,临近值和设备有关系,不同的设备临近值不同,所以我们引出了最小滑动距离TouchSlop。
1.4 TouchSlop
TouchSlop是系统默认的滑动最小距离,我们可以通过
ViewConfiguration.get(context).getScaledDoubleTapSlop()
来获取系统中定义的这个临界值大小,用户判断用户是否滑动。
在framework层源码中定义了TouchSlop的值大小,源码如图所示,不同设备上该值得大小是不同的。
上述就是 View基础知识的第一部分。