Android(安卓)View滑动
学习笔记:使用Android坐标系和视图坐标系两种方法实现View拖动效果。
private float lastX;
private float lastY;
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.e(TAG, "onTouchEvent --> " + event.getAction());
return method2(event);
}
/**
* Android 坐标系
* 1,点下手指记录点击位置在屏幕上的坐标lastX lastY;
* 2,移动手指更新手指的相对于屏幕的坐标x y;
* 3,计算手指移动的偏移量,通过layout方法重新设置View的位置;
* 4,因为用的是Android坐标系,参考系是屏幕,移动前后手指位置发生了改变;
* 5,更新手指位置lastX和lastY的坐标。
*/
private boolean method2(MotionEvent event) {
float x = event.getRawX();
float y = event.getRawY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN://0
lastX = x;
lastY = y;
break;
case MotionEvent.ACTION_MOVE://2
int offsetX = (int) (x - lastX);
int offsetY = (int) (y - lastY);
layout(getLeft() + offsetX, getTop() + offsetY, getRight() + offsetX, getBottom() + offsetY);
//note:需要更新lastX和lastY,因为使用的是Android坐标系,执行完layout方法后坐标系是改变了的。
lastX = x;
lastY = y;
break;
case MotionEvent.ACTION_UP://1
break;
case MotionEvent.ACTION_CANCEL://3
break;
case MotionEvent.ACTION_OUTSIDE://4
break;
}
return true;
}
/**
* 视图坐标系方法
* 1,点下手指记录点击位置在View上的坐标lastX lastY;
* 2,移动手指更新手指的相对于View的坐标x y;
* 3,计算手指移动的偏移量,通过layout方法重新设置View的位置;
* 4,执行完layout方法后,手指点击的坐标和移动前的坐标保持一致。
*/
private boolean method1(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN://0
lastX = x;
lastY = y;
break;
case MotionEvent.ACTION_MOVE://2
int offsetX = (int) (x - lastX);
int offsetY = (int) (y - lastY);
Log.e(TAG, "offsetX --> " + offsetX);
Log.e(TAG, "offsetY --> " + offsetY);
Log.e(TAG, "getLeft() --> " + getLeft());
Log.e(TAG, "getTop() --> " + getTop());
//note: 不用重新设置lastX和lastY的值,执行完layout方法就相当于重新归位了。
//lastX和lastY是手指在View上的点击位置(相对于View的视图坐标),执行layout方法前后手指在View上的坐标lastX和lastY值是一样的。
layout(getLeft() + offsetX, getTop() + offsetY, getRight() + offsetX, getBottom() + offsetY);
break;
case MotionEvent.ACTION_UP://1
break;
case MotionEvent.ACTION_CANCEL://3
break;
case MotionEvent.ACTION_OUTSIDE://4
break;
}
return true;
}
更多相关文章
- android TextView 容纳不下内容,让字向左滚动的办法
- ArcGIS API for Android(安卓)案例教程 17
- Android(安卓)API指南(二)自定义控件04之 位置说明
- android TextView 容纳不下内容,让字向左滚动的办法
- android SimpleOnGestureListener详解
- Android(安卓)View系列 - 坐标系
- Android(安卓)AbsListView坐标体系解析
- ArcGIS API for Android(安卓)案例教程 17
- Android-View的滑动