写自定义拖动控件要了解的一些知识点:
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
原文地址:http://blog.csdn.net/laoziyueguo3/article/details/43937325