写自定义拖动控件要了解的一些知识点:
1.View.getLeft() view.getTop() view.getRight() view.getBottom( )
这四个方法是View类的方法:作用是获取view左边沿、右边沿到Y轴的距离,上边沿、下边沿到X轴的距离(坐标轴是以父布局左上角为坐标原点的坐标系),可以简单看成是view的左上角和右下角的坐标(view的外观为一个矩形)。
扩展:View.getX( )、View.getY( )是获取view在父布局中的位置,也是该View的左上角坐标,其中View.getX( ) = View.getLeft( ) View.getY( )=View.getTop( )
2.MotionEvent.getX( )、MotionEvent.getY( )方法
这两个方法是获取在触摸条件下,手指相对于view左上角水平和竖直方向的距离。
扩展:MotionEvent.getRawX( )和MotionEvent.getRawY( )是获取在触摸条件下,手指相对于手机屏幕左上角水平和竖直方向的距离,通常可用来判断滑动距离是否有效。
3.Layout(int left,int top,int right,int bottom)方法用来控制View的位置。
该方法是使View移动的关键,要正确计算出 left top right bottom的值,通常用上一状态的值(1中的四个方法) 加上 在水平或竖直方向移动的距离就可以了
大致了解了这一系列方法,就可以简单写出可拖动的自定义控件,代码如下:
package com.example.android_dragbutton;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.TextView;
public class DragTV extends TextView {
private float startx;// down事件发生时,手指相对于view左上角x轴的距离
private float starty;// down事件发生时,手指相对于view左上角y轴的距离
private float endx; // move事件发生时,手指相对于view左上角x轴的距离
private float endy; // move事件发生时,手指相对于view左上角y轴的距离
private int left; // DragTV左边缘相对于父控件的距离
private int top; // DragTV上边缘相对于父控件的距离
private int right; // DragTV右边缘相对于父控件的距离
private int bottom; // DragTV底边缘相对于父控件的距离
private int hor; // 触摸情况下,手指在x轴方向移动的距离
private int ver; // 触摸情况下,手指在y轴方向移动的距离
public DragTV(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public DragTV(Context context, AttributeSet attrs) {
this(context, attrs, 0);
// TODO Auto-generated constructor stub
}
public DragTV(Context context) {
this(context, null);
// TODO Auto-generated constructor stub
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// 手指刚触摸到屏幕的那一刻,手指相对于View左上角水平和竖直方向的距离:startX startY
startx = event.getX();
starty = event.getY();
break;
case MotionEvent.ACTION_MOVE:
// 手指停留在屏幕或移动时,手指相对与View左上角水平和竖直方向的距离:endX endY
endx = event.getX();
endy = event.getY();
// 获取此时刻 View的位置。
left = getLeft();
top = getTop();
right = getRight();
bottom = getBottom();
// 手指移动的水平距离
hor = (int) (endx - startx);
// 手指移动的竖直距离
ver = (int) (endy - starty);
// 当手指在水平或竖直方向上发生移动时,重新设置View的位置(layout方法)
if (hor != 0 || ver != 0) {
layout(left + hor, top + ver, right + hor, bottom + ver);
}
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
return true;
}
}
Demo下载地址:
http://download.csdn.net/detail/laoziyueguo3/8456849