View的根底需求控制,得到点击事件爆发的x和y坐标

View的基本功须求精晓:

View的地点参数

  • top : 左上角纵坐标
  • left: 左上角横坐标
  • right : 右下角横坐标
  • bottom :右下角纵坐标

图片 1

  • x : 左上角的横坐标
  • y : 左上角的纵坐标
  • translationX : View左上角相对于父容器的偏移量
  • translationY : View左上角针锋绝对于父容器的偏移量

PS:View在活动的进度中,top和left表示的是固有左上角的职位音信,其值并不会生出变更,此时发生变更的是x、y、translationX和translationY那三个参数。

x = left + translationX;
y = right + translationY;
  1. View的地点参数
  2. MotionEvent对象和TouchSlop对象
  3. VelocityTracker对象
  4. GestureDetector对象
  5. Scroller对象
  6. …………..

MotionEvent

  • ACTION_DOWN — 手指刚接触显示屏
  • ACTION_MOVE — 手指在显示屏上滑动
  • ACTION_UP — 手指从屏幕上甩手的眨眼间间

如:点击显示器后离开,事件系列为DOWN -> UP
点击显示器滑动一会再放手,事件种类为DOWN -> MOVE -> … -> MOVE
-> UP

收获点击事件时有发生的x和y坐标:

  • getX/getY — 相对于当下View左上角的x和y坐标
  • getRawX/getRawY — 绝对于手机显示器左上角的x和y坐标

1.View的岗位参数

一、Top, Left, Right, Bottom

View的岗位主要由它的八个终端来控制,分别对应于View的七个特性:top,left,right,bottom,其中top是左上角的纵坐标,left是左上角的横坐标,right是右下角的横坐标,bottom是右下角纵坐标。不过大家瞩目,这么些坐标都是相对于View的父容器来说的,因而它是一种对峙坐标,View的坐标和父容器的关系如下图(注:在Android中,X轴和Y轴的方框向分别为右和下)

经过得出View的宽高:

width = right - left
height = bottom - top
//这四个参数可以由以下方式获取
Left = getLeft();
Right = getRight();
Top = getTop();
Bottom = getBottom();

Android3.0后,View扩充了x、y、translationX和translationY那多少个参数。其中x和y是View左上角的坐标,而translationX和translationY是View左上角针锋相对于容器的偏移量
他俩中间的折算关系如下:

x = left + translationX;
y = top + translationY;

留意:View在活动的进程中,top和left表示的是原来左上角的职分信息不会变动,改变的是x、y、translationX和translaY。

二、MotionEvent和TouchSlop

MotionEvent

在指尖接触到显示屏后会发生的一多级点击事件,如

ACTION_DOWN:手指刚接触到荧屏

ACTION_MOVE:手指在显示器上移动

ACTION_UP :手指从屏幕上甩手的立刻

通过Motion伊夫n对象大家得以得到事件时有暴发的x和y坐标,大家得以通过getX/getY和getRawX/getRawY获得,它们的区分是:getX/getY再次回到的是相对于近期View左上角的x和y坐标,getRawX/getRawY重临的是绝对于手机屏幕左上角的x和y坐标。

TouchSlop

TouchSloup是系统所能识别出的被认为是滑动的小小距离,那是一个常量,与装备有关,可由此以下方式赢得:

ViewConfiguration.get(getContext()).getScaledTouchSloup()

TouchSlop

TouchSlop是系统所能识别出的被认为是滑动的纤维距离,可由此如下格局获取

ViewConfiguration.get(getContext()).getScaledTouchSlop();

3. VelocityTracker对象

速度追踪,用于追踪手指在滑行进度中的速度,包含水平方向速度和竖直方向速度。
使用方式:

1.在View的onTouchEvent方法中追踪当前单击事件的进程

VelocityRracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);

2.乘除速度,得到水平速度和竖直速度

velocityTracker.computeCurrentVelocity(1000);
int xVelocity = (int)velocityTracker.getXVelocity();
int yVelocity = (int)velocityTracker.getYVelocity();

在意,获取速度此前必须先总结速度,即调用computeCurrentVelocity方法,那里指的快慢是指一段时间内手指滑过的像素数,1000指的是1000微秒,获得的是1000阿秒内滑过的像素数。速度可正可负:

 速度 = (终点位置 - 起点位置) / 时间段

末段,当不要求运用的时候,须求调用clear()方法重置并回收内存:

velocityTracker.clear();
velocityTracker.recycle();

VelocityTracker

进程追踪,用于追踪手指在滑行进程中的速度,包含水平和竖直方向的速度。使用进度如下:

  • 在View的onTouch伊夫nt方法中追踪当前单击事件的快慢

VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);
  • 赢得当前移动速度

velocityTracker.computeCurrentVelocity(1000);    //先根据时间计算速度
int xVelocity = (int) velocityTracker.getXVelocity();
int yVelocity = (int) velocityTracker.getYVelocity();
  • 回收内存

velocityTracker.clear();
velocityTracker.recycle();

4. GestureDetector对象

手势检测,用于救助检测用户的单击、滑动、长按、双击等表现。 使用方式

1.创建一个GestureDetector对象并贯彻OnGestureListener接口,依照需求,也可完结OnDoubleTapListener接口从而监听双击行为:

GestureDetector mGestureDetector = new GestureDetector(this);
//解决长按屏幕后无法拖动的现象
mGestureDetector.setIsLongpressEnabled(false);

2.在目标View的OnTouch伊芙nt方法中加上以下完毕,便可接管目的View的onTouch伊夫nt
方法:

boolean consume = mGestureDetector.onTouchEvent(event);
return consume;

达成OnGestureListener和OnDoubleTapListener接口中的方法,其中常用的方法有:onSingleTapUp(单击)、onFling(急速滑动)、onScroll(拖动)、onLongPress(长按)和onDoubleTap(双击)。
提出:即便只是监听滑动相关的,可以自己在onTouch伊芙nt中落到实处,如若要监听双击那种表现,那么就选择GestureDetector。

GestureDetector

手势检测,用于支持检测用户的单击、滑动、长按和双击等表现。

  • 始建一个GestureDetector对象并已毕OnGestureListener接口或者OnDoubleTapListener

GestureDetector mGestureDetector = new GestureDetector(this);
// 解决长按屏幕后无法拖动的现象
mGestureDetector.setIsLongpressEnabled(false);
  • 接管目的View的onTouch伊夫nt方法

boolean consume = mGestureDetector.onTouchEvent(event);
return consume;

表 OnGestureListener和OnDoubleTapListener中的方法介绍:

方法名 描述 所属接口
onDown 手指轻轻触摸屏幕的一瞬间 OnGestureListener
onShowPress 手指轻轻触摸屏幕,尚未松开和拖动 OnGestureListener
onSingleTapUp 手指(轻轻触摸屏幕后)松开 OnGestureListener
onScroll 手指按下屏幕并拖动 OnGestureListener
onLongPress 用户长久按着屏幕不放 OnGestureListener
onFling 用户按下触摸屏,快速滑动后松开 OnGestureListener
onDoubleTap 双击,第二下单击Down触发 OnDoubleTapListener
onSingleTapConfirmed 严格的单击行为(只能是单击,不能是双击中的一次单击) OnDoubleTapListener
onDoubleTapEvent 表示发生了双击行为 ,DOWN、MOVE、UP都会触发 OnDoubleTapListener

5. Scroller对象

弹性滑动对象,用于落到实处View的弹性滑动,可以已毕有过度的滑动。其本人不可以让View自行滑动,需求和View的computeScroll方法合营使用才能到位那么些意义。
使用形式:

Scroller scroller = new Scroller(mContext);
//缓慢移动到指定位置
private void smoothScrollTo(int destX,int destY){
int scrollX = getScrollX();
int delta = destX - scrollX;
//1000ms内滑向destX,效果就是慢慢滑动
mScroller.startScroll(scrollX,0,delta,0,1000);
invalidata();
}
@Override
public void computeScroll(){
if(mScroller.computeScrollOffset()){
 scrollTo(mScroller.getCurrX,mScroller.getCurrY());
 postInvalidate();
}
}

相关文章