转载请注明出处:
http://blog.youkuaiyun.com/user11223344abc?viewmode=contents
出自【蛟-blog】
基本思路:
本文主要突出是“可拖拽”这个中心。
涉及到2个点:
- 1:(onTouchEvent/margin)位置的变化与确定:
请想象一个空白的屏幕上一个控件的位置有一侧margin变了,它的位置也会跟着变。具体的实现是通过复写onTouchEvent重新计算ViewGroup.MarginLayoutParams
- 2:requestLayout():
Android view中有requestLayout和invalidate方法。
requestLayout:当view确定自身已经不再适合现有的区域时,该view本身调用这个方法要求parent view重新调用他的onMeasure onLayout来对重新设置自己位置。
特别的当view的layoutparameter发生改变,并且它的值还没能应用到view上,这时候适合调用这个方法。
invalidate:View本身调用迫使view重画。
拓展
该View只是一个雏形,可以在此View上加上一些动效,应用到项目内实际使用中去。
控件代码:
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
public class DragView extends View {
private int lastX;
private int lastY;
public DragView(Context context) {
super(context);
}
public DragView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int x = (int) event.getRawX();
int y = (int) event.getRawY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
break;
}
case MotionEvent.ACTION_MOVE: {
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) getLayoutParams();
int left = layoutParams.leftMargin + x - lastX;
int top = layoutParams.topMargin + y - lastY;
layoutParams.leftMargin = left;
layoutParams.topMargin = top;
setLayoutParams(layoutParams);
requestLayout();
break;
}
case MotionEvent.ACTION_UP: {
break;
}
}
lastX = x;
lastY = y;
return true;
}
}