今天实现一个控件的拖动效果,效果图如下:
不多说,下面说下实现步骤:
1.将布局文件创建:
这是包裹的内容
android:id="@+id/llt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
android:background="#07E9FF">
<ImageView
android:src="@drawable/aas"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="拖着移动"
android:textSize="18sp"
android:textColor="#ffffff"/>
这是父控件的内容
android:id="@+id/tvb"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="#FF1F00"
android:padding="10dp"
android:layout_margin="10dp"
android:gravity="center_horizontal"
android:text="按住提示框拖到任意位置\n按手机返回键立即生效"
android:textColor="#000000"
android:textSize="17sp"
2.初始化控件,设置点击方法:
llt = (LinearLayout) findViewById(R.id.llt);
setTouch();
3.设置event的点击方式:按下,移动,松开的事件处理
(1)按下时获取按下的坐标(是手指的坐标而不是控件):
case MotionEvent.ACTION_DOWN:
//按下的
System.out.println("按下了..");
rawX = (int) event.getRawX();
rawY = (int) event.getRawY();
break;
(2)移动时设置便宜,移动坐标,绘制布局文件:
case MotionEvent.ACTION_MOVE:
//移动的事件
System.out.println("移动了..");
newX = (int) event.getRawX();
newY = (int) event.getRawY();
dX = newX-rawX;
dY = newY-rawY;
//移动的时候原控件的坐标
int l=llt.getLeft();
int t=llt.getTop();
//新控件的坐标
l+=dX;
t+=dY;
int r=l+llt.getWidth();
int b=t+llt.getHeight();
llt.layout(l, t, r, b);
//更新坐标
rawX=newX;
rawY=newY;
break;
(3)松开的时候:
case MotionEvent.ACTION_UP:
//抬起的事件
System.out.println("抬起了..");
break;
(最后)
注意return true,否则会认为一直执行而无法执行后面的事件;