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

}

更多相关文章

  1. android TextView 容纳不下内容,让字向左滚动的办法
  2. ArcGIS API for Android(安卓)案例教程 17
  3. Android(安卓)API指南(二)自定义控件04之 位置说明
  4. android TextView 容纳不下内容,让字向左滚动的办法
  5. android SimpleOnGestureListener详解
  6. Android(安卓)View系列 - 坐标系
  7. Android(安卓)AbsListView坐标体系解析
  8. ArcGIS API for Android(安卓)案例教程 17
  9. Android-View的滑动

随机推荐

  1. android webview秒开框架
  2. ubuntu上实现Android(安卓)JNI示例
  3. 如何通过adb 设置cpu 不降频,性能优化分析
  4. Android之RemoteViews
  5. Gradle 打不同的安装包
  6. Android createWindowSurface failed EGL
  7. Android中TextView实现文字跑马灯效果(滚
  8. ClipDrawable制作图片渐进效果
  9. android点击事件流程
  10. JavaEE + Android 教程