自定义可拖动TextView

写自定义拖动控件要了解的一些知识点:

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

你可能感兴趣的:(安卓开发)