概述
对于view的基础知识来说,基本上都是些概念性的东西,有些内容重要但又不太容易理解,之前研究过一次,但是隔了很久不用,有些概念弄混淆了,导致不得不重新去查找资料学习,这也就是我写这篇博客的原因。
View的位置参数
view的位置由它的四个顶点来决定,分别是left、top、right、bottom,这四个属性确定了它相对父容器所在的位置:即left是view左上角相对于父容器的横坐标,top是view左上角相对于父容器的纵坐标,right是view右下角相对于父容器的横坐标,bottom是view右下角相对于父容器的纵坐标。在view的源码中,这四个属性分别对应mLeft、mTop、mRight、mBottom,并且提供了对应的get\set方法来进行操作。
自Android3.0开始,view又加入了x、y、translationX、translationY几个属性,它们是为view内容的移动服务的。x、y代表view内容左上角的横纵坐标,translationX、translationY代表view内容的偏移量,默认为0。view为这四个属性也提供了相应的get\set方法。之间的关系如下:(注意:view的位置和它的内容可以分离开来)
x = mLeft + translationX
y = mTop + translationY
需要注意的是,view移动后,mLeft、mTop表示的是原始左上角的位置坐标,view的位置不会随着内容的移动而改变。
MotionEvent、TouchSlop
- MotionEvent:指手指触摸屏幕产生的一系列事件,常用的事件类型如下:
- ACTION_DOWN:手指刚触摸屏幕事件
- ACTION_UP:手指离开屏幕事件
- ACTION_MOVE:手指在屏幕上移动事件
通过MotionEvent对象我们还可以得到点击事件发生的x、y坐标。系统提供了getX\getY和getRawX\getRawY两组方法,getX\getY返回的是事件相对于当前view的左上角的x和y坐标,getRawX\getRawY返回的是事件相对于屏幕左上角的x和y坐标。
- TouchSlop:设备能识别的滑动事件的最小距离,随设备而定,一般用于区分事件是点击事件还是滑动事件。获取方式如下:
ViewConfiguration.get(getApplicationContext()).getScaledTouchSlop();
VelocityTracker、GestureDetector
- VelocityTracker:速度跟踪,用于获取手指滑动屏幕过程中的速度,分为水平速度和垂直速度。使用方式如下:
VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);
velocityTracker.computeCurrentVelocity(1000);
int velocityX = (int) velocityTracker.getXVelocity();
int velocityY = (int) velocityTracker.getYVelocity();
velocityTracker.clear();
velocityTracker.recycle();
在获取水平速度或垂直速度之前,必须先计算当前速度,即第3行内容必须在第4、5行之前。这里的速度指的是一段时间内手指划过的像素数,如:时间设置为1000ms(computeCurrentVelocity的参数值),在1s内,手指水平划过的像素数是100,那么速度就是100;速度可以是负数,计算方法如下:(注意:速度跟踪器使用完后,要释放并回收利用。)
速度 = (终点位置 - 初始位置)/ 时间间隔
- GestureDetector:手势检测,可以用于辅助处理点击、双击、滑动、长按事件。需要处理什么事件就实现对应方法即可,然后用gestureDetector.onTouchEvent(event)接管view的onTouchEvent()方法即可。GestureDetector有两个内部接口提供事件方法,分别为OnGestureListener和OnDoubleTapListener。
- OnGestureListener接口常用方法如下:
boolean onDown(MotionEvent e);
boolean onSingleTapUp(MotionEvent e);
boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY);
void onLongPress(MotionEvent e);
boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY);
- OnDoubleTapListener接口常用方法如下:
boolean onSingleTapConfirmed(MotionEvent e);
boolean onDoubleTap(MotionEvent e);
boolean onDoubleTapEvent(MotionEvent e);