学习笔记:使用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 View系列 - 坐标系
  2. Android AbsListView坐标体系解析
  3. android度量相对于地球坐标系的加速度
  4. Android 坐标系及动画移动坐标相关集合
  5. android 触摸手指动作放大和缩小图片
  6. 一个简单的Android 自定义view,实现手指划线
  7. Android 自定义View之坐标系(一)
  8. android坐标系相关知识点
  9. Android中的坐标系统

随机推荐

  1. Android 跑马灯效果
  2. 【Android 开源系列】之缓存框架
  3. android 读取资源字符串的 方法
  4. 【转】Android最佳性能实践(一)——合理
  5. Android CPU使用率:top和dump cpuinfo的不
  6. Android:你不知道的 WebView 使用漏洞
  7. android 中遇到的Ui问题
  8. 使用Android编译环境编译小工具
  9. android定制化软件修改或添加按键驱动的
  10. Android网络抓包