Android View滑动

来源:互联网 发布:openwrt nginx服务器 编辑:程序博客网 时间:2024/06/06 10:49
学习笔记:使用Android坐标系和视图坐标系两种方法实现View拖动效果。
private float lastX;private float lastY;@Overridepublic 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;}

0 0
原创粉丝点击