控件拖拽置换位置

简单的一个控件拖拽交换位置Demo,有些场景下会用到,关于此类功能网上有很多例子,而且Google官方API中也有相应的接口,对这种业务需求进行了一定逻辑封装。这里没有采用官方接口,单纯的从触摸事件入手来简单的实现控件位置交换。写代码之前先理清楚实现的思路,这里从控件的触摸事件入手,触摸事件有ACTION_DOWN、ACTION_MOVE、ACTION_UP这几个状态,下面先把实现逻辑的思路写出来
摘要由CSDN通过智能技术生成
简单的一个控件拖拽交换位置Demo,有些场景下会用到,关于此类功能网上有很多例子,而且Google官方API中也有相应的接口,对这种业务需求进行了一定逻辑封装。这里没有采用官方接口,单纯的从触摸事件入手来简单的实现控件位置交换。
写代码之前先理清楚实现的思路,这里从控件的触摸事件入手,触摸事件有ACTION_DOWN、ACTION_MOVE、ACTION_UP这几个状态,下面先把实现逻辑的思路写出来:
1.界面加载完成后用一个List记录各个子控件相对于父控件的坐标,同时将这些子控件放入一个List中备用。
2.分别给每个子控件添加触摸事件,拖拽交换的主要逻辑在触摸事件中完成。
3.触摸事件:
    当手指落下时:记录当前手指坐标startX、startY,记录当前触摸的控件a的初始位置;
    当手指开始移动:移动过程中onTouch方法会不断执行,这里要做的就是不断的用View的layout(l,t,r,b)方法不断的将被触摸的控件定位到手指移动过的地方,产生的效果就是被触摸的控件a跟随手指进行滑动。获取手指的实时位置与ACTION_DOWN时的位置相减得出手指移动的差值,获取控件a四条边相对于父控件的坐标位置,将这四个坐标分别加上这个差值得出新的四边坐标,调用View的layout(l,t,r,b)方法重新定位控件a,然后重新给startX、startY赋值。
    当手指抬起:判断当前手指位置是否在某一个子控件b的四条边坐标内部,如果不在则让控件a定位回初始位置,如果在则让控件a和控件b交换位置。

有了以上的逻辑分析是不是思路清晰了许多呢,下面就一步步来实现上面的逻辑
首先定义一个布局文件,其中包含几个Button:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:id="@+id/ll_main"
    android:orientation="vertical"
    android:paddingTop="@dimen/DIMEN_80PX"
    >

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="button1"
        android:paddingTop="@dimen/DIMEN_40PX"
        android:paddingBottom="@dimen/DIMEN_40PX"
        />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="@dimen/DIMEN_40PX"
        android:paddingBottom="@dimen/DIMEN_40PX"
        android:text="button2"
        />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="@dimen/DIMEN_40PX"
        android:paddingBottom="@dimen/DIMEN_40PX"
        android:text="button3"
        />
    <Button
        android:layout_width=
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值