请善用目录


Demo下载地址:http://download.csdn.net/detail/u011634756/5959637 (免积分哦~

-----------------------------华丽的分割线---------------------------------

一. 骨头

1. view的拖动首先我们的获取拖动的坐标即 : onTouchEvent 事件
2. 坐标获取到了,那么我们需要把坐标给实现 即: View.layout(left, top, right, bottom);

3. 在实现这个坐标的时候我们的有一个小小的逻辑 即: 移动的距离和坐标的转换

二. 肉

1. OnTouchListener 这个的实现就不赘述了

2. 讲一下View.layout(left, top, right, bottom)  这四个参数


从上图中可以很清晰的看到 left, top, right, bottom 4个分别是对应的是和父View的距离而不是屏幕左上角的距离。 

为了证明我们说的是对的,这里我们的demo中进行了研究

当固定X轴的时候 ,也就是 left = 0 right = view的宽度

v.layout(0, top, v.getWidth(), bottom);

当拖动的时候一直是在方框的最左边一直在上下移动


当固定Y轴的时候 , 也就是 top = 0 ; bottom= view的高度

v.layout(left, 0, right, v.getHeight());

当拖动的时候一直是在方框的最顶端左右移动

注意: 我们的父组件是那个方框 上下左右都有空隙的哦, 大家一定要哈下满的getRawX 区分开来

3. 小逻辑

在拖动的时候 我们有一个MotionEvent.getX()和 MotionEvent.getRawX() ,这个应该也有好多小伙伴不明白,下面上图讲述看一下


结论:getX是获取以widget左上角为坐标原点计算的X轴坐标直.
getRawX 获取的是以屏幕左上角为坐标原点计算的X轴坐标直.

在详细一点可以去这个博文看一下

4. 主要的源码

/** * onTouchEvent的监听事件, * 拖动的主要实现方法 * @author yuhaiyang */private class MyOnTouchListener implements OnTouchListener{/** * 这有一点要说明的是 ****小理解点******* * 1. event.getX : 是以 widget(控件) 的左上角 为 原点的 X坐标 *    event.getRawX() : 是以 屏幕左上角 为原点的 X坐标 * 2. View.layout(left, top, right, bottom); * left   :   控件左端以   父  控件的 左上角为原点的X坐标 * top    :   控件顶端以   父  控件的 左上角为原点的Y坐标 * right  :   控件右端以   父  控件的 左上角为原点的X坐标 * bottom :  控件底端以   父  控件的 左上角为原点的Y坐标 * 这个地方如果不明白会在博客上图说明。 */@Overridepublic boolean onTouch(View v, MotionEvent event) {/** * 这个地方的逻辑是: * 在 down 的时候记录一下距离屏幕左上角的距离 * 然后move的时候来再来计算一下距离 * 2着的差值就是分别 x轴和y轴移动的距离 */switch(event.getAction()){case MotionEvent.ACTION_DOWN ://   按下的时候距离屏幕左上角的距离lastX = (int) event.getRawX();lastY = (int) event.getRawY();break;case MotionEvent.ACTION_MOVE ://   移动的时候距离屏幕左上角的距离int nowX = (int)event.getRawX();int nowY = (int)event.getRawY();// X轴和Y轴移动的距离int moveX = nowX - lastX;int moveY = nowY -lastY;// 分别计算距离int top = v.getTop() + moveY;int bottom = v.getBottom() + moveY;int left =  v.getLeft() + moveX;int right = v.getRight() + moveX;// 这个地方是控制 那个轴固定的的 if(mFix == FIX_X){v.layout(0, top, v.getWidth(), bottom);}else if (mFix == FIX_Y){v.layout(left, 0, right, v.getHeight());}else{v.layout(left, top, right, bottom);}lastX = (int) event.getRawX();lastY = (int) event.getRawY();break;case MotionEvent.ACTION_UP:break;}return false;}}

5. 效果图




====================关注小鱼===================

新浪微博http://weibo.com/AwareMissing

腾讯微博http://t.qq.com/y_haiyang



更多相关文章

  1. Android(安卓)RotateAnimation动画不能旋转的问题
  2. Android调用第三方百度APP进行导航
  3. Android(安卓)UI效果之绘图篇(四)
  4. Android(安卓)实现简单的画画版一
  5. Android(安卓)获取按钮Button的高度、宽度、坐标
  6. MonkeyRunner进坑——errors importing other modules
  7. 百度地图Android(安卓)SQLITE在本地如何实现按距离排序、范围查
  8. eclipse开发android
  9. 计算经纬度间的距离公里数

随机推荐

  1. ES 规范为什么总在 6 月发版?
  2. navicate premium 如何导入excel表数据
  3. 【3y】从零单排学Redis【青铜】
  4. Mybatis框架如何使用分页插件呢?
  5. ES11 来了,还学得动吗?
  6. 基于SSH框架实现的驾校管理系统
  7. 移动端跨平台技术之下的变与不变
  8. Fast Refresh 原理剖析
  9. 从0开始搭建数据仓库(2):产品经理如何“玩
  10. 图解 *** 等 6 种前端渲染模式