-
View是所有组件的根,包括ViewGroup也继承自view。
-
View的位置属性left、top是左上角相对于父控件的位置,right和bottom是右下角相对于父控件的位置。
因此,right = left + width,bottom = top + height。
可以通过getLeft()、getTop()、getRight()、getBottom()获取相应值。 -
View的x、y属性是左上角的坐标。
translationX和translationY是左上角相对于父控件的偏移量,默认都是0。
因此,x = left + translationX,y = top + translationY。
注意:left、top、right、bottom这四个值是固定不变的代表原始属性,View在移动过程中改变的是translationX和translationY,进而改变x、y。 -
通过getX()、getY()获取View的x、y的值,通过getRawX()、getRawY()获取View相对于屏幕左上角的x、y的值。这两个是不一样的,区别在于相对于父控件还是屏幕的左上角。
-
手指接触屏幕的一系列事件称之为MotionEvent,细分为:
ACTION_DOWN - 手指刚接触屏幕
ACTION_MOVE - 手指在屏幕上移动
ACTION_UP - 手机从屏幕上松开的一瞬间
因此,MotionEvent通常分为两个系列
DOWN - UP为点击,DOWN - MOVE - MOVE - ... - UP为滑动。 -
TouchSlop是系统所能识别出来的滑动的最小距离,也就是滑动的距离单位。这是个常量,因机型而异。可以通过```
ViewConfiguration.get(getContext()).getScaledTouchSlop()
- VelocityTracker用于获取滑动的速度,用过以下代码实现
VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);
velocityTracker.computeCurrentVelocity(1000);
int xVelocity = (int) velocityTracker.getXVelocity();
int yVelocity = (int) velocityTracker.getYVelocity();
其中velocityTracker.computeCurrentVelocity(1000);是设置时间单位,单位是毫秒。1000就是每秒的速度,所求的速度单位是像素。
- GestureDetector用于手势操作的捕获并进行相应操作。
这个这本书写得太简单了,[这篇文章](http://www.cnblogs.com/sw926/p/3208158.html)写得比较清楚。
大概意思是,像onClick()这种事件其实是一串MotionEvent的序列了,其实是可以拆分到Down、Move、Up之类的细分Event的。GestureDetector就能干这种事。
做法是写个类实现OnGestureListener或者OnDoubleTapListener接口。
这两个接口有各自不同的方法:
OnGestureListener
onDown 手指触摸屏幕的一瞬间
onShowPress 手指触摸屏幕后瞬间后的那个状态
onSingleTapUp 手指从屏幕上离开的那个瞬间
onLongPress 长按
onScroll 手指按下屏幕并滑动,比较慢的滑动
onFling 手指按下屏幕,迅速滑动一下然后松开
OnDoubleTapListener
onSingleTapConfirmed 单击
onDoubleTap 双击
onDoubleTapEvent 双击发生过程的期间
如果在重写期间想打印具体什么操作可以
@Override
public void onLongPress(MotionEvent e) {
Log.i(getClass().getName(), "onLongPress-----" + getActionName(e.getAction()));
}
实现以上接口后自己在相应方法写下操作。然后创建对象:
例如我写了个MyOnGestureListener,那么就:
GestureDetector mGestureDetector = new GestureDetector(this, new MyOnGestureListener());
...
// 把Button的TouchEvent交给mGestureDetector去捕获和处理
mButton.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mGestureDetector.onTouchEvent(event);
return true;
}
网友评论