Android View滑动

来源:互联网 发布:ee是哪个国家域名 编辑:程序博客网 时间:2024/06/06 13:03

学习笔记:使用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;

}

0 0
原创粉丝点击