Android View的拖动

Demo下载地址:http://download.csdn.net/detail/u011634756/5959637 (免积分哦~)
-----------------------------华丽的分割线---------------------------------
一. 骨头

1
2
3
1. view的拖动首先我们的获取拖动的坐标即 : onTouchEvent 事件
2. 坐标获取到了,那么我们需要把坐标给实现 即: View.layout(left, top, right, bottom);
3. 在实现这个坐标的时候我们的有一个小小的逻辑 即: 移动的距离和坐标的转换

二. 肉

1
2
1. OnTouchListener 这个的实现就不赘述
2. 讲一下View.layout(left, top, right, bottom)  这四个参数

图片说明文字

从上图中可以很清晰的看到 left, top, right, bottom 4个分别是对应的是和父View的距离。
为了证明我们说的是对的,这里我们的demo中进行了研究
当固定X轴的时候 ,也就是 left = 0 right = view的宽度

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

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

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

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

当拖动的时候一直是在方框的最顶端左右移动
注意: 我们的父组件是那个方框 上下左右都有空隙的哦, 大家一定要哈下满的getRawX 区分开来

1
3. 小逻辑

在拖动的时候 我们有一个MotionEvent.getX()和 MotionEvent.getRawX() ,这个应该也有好多小伙伴不明白,下面上图讲述看一下
图片说明文字
结论:getX是获取以widget左上角为坐标原点计算的X轴坐标直.
getRawX 获取的是以屏幕左上角为坐标原点计算的X轴坐标直.
在详细一点可以去这个博文看一下

1
4. 主要的源码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/**
 * 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坐标
     * 这个地方如果不明白会在博客上图说明。
     */

    @Override
    public 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;
    }

}

1
5. 效果图

图片说明文字

====================关注小鱼===================
新浪微博:http://weibo.com/AwareMissing
腾讯微博:http://t.qq.com/y_haiyang

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值