简单的一个控件拖拽交换位置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=