package com.com.mr_wrong.ViewDraghelper;
import android.content.Context;
import android.support.v4.view.MotionEventCompat;
import android.support.v4.widget.ViewDragHelper;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
/**
* Created by Mr_Wrong on 2015/5/22.
*/
public class DragLayout extends LinearLayout {
private final ViewDragHelper mDragHelper;
private View mDragView1;
private View mDragView2;
private boolean mDragEdge;
private boolean mDragHorizontal;
private boolean mDragCapture;
private boolean mDragVertical;
public DragLayout(Context context) {
this(context, null);
}
public DragLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public DragLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mDragHelper = ViewDragHelper.create(this, 1f, new DragHelperCallback());
}
@Override
protected void onFinishInflate() {
mDragView1 = getChildAt(0);
mDragView2 = getChildAt(1);
}
public void setDragHorizontal(boolean dragHorizontal) {
mDragHorizontal = dragHorizontal;
mDragView2.setVisibility(View.GONE);
}
public void setDragVertical(boolean dragVertical) {
mDragVertical = dragVertical;
mDragView2.setVisibility(View.GONE);
}
public void setDragEdge(boolean dragEdge) {
mDragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);
mDragEdge = dragEdge;
mDragView2.setVisibility(View.GONE);
}
public void setDragCapture(boolean dragCapture) {
mDragCapture = dragCapture;
}
private class DragHelperCallback extends ViewDragHelper.Callback {
@Override
public boolean tryCaptureView(View child, int pointerId) {
if (mDragCapture) {
return child == mDragView1;
}
return true;
}
@Override
public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
invalidate();
}
@Override
public void onViewCaptured(View capturedChild, int activePointerId) {
super.onViewCaptured(capturedChild, activePointerId);
}
@Override
public void onViewReleased(View releasedChild, float xvel, float yvel) {
super.onViewReleased(releasedChild, xvel, yvel);
}
@Override
public void onEdgeTouched(int edgeFlags, int pointerId) {
super.onEdgeTouched(edgeFlags, pointerId);
}
@Override
public void onEdgeDragStarted(int edgeFlags, int pointerId) {
if (mDragEdge) {
mDragHelper.captureChildView(mDragView1, pointerId);
}
}
@Override
public int clampViewPositionVertical(View child, int top, int dy) {
if (mDragVertical) {
final int topBound = getPaddingTop();
final int bottomBound = getHeight() - mDragView1.getHeight();
final int newTop = Math.min(Math.max(top, topBound), bottomBound);
return newTop;
}
return super.clampViewPositionVertical(child, top, dy);
}
@Override
public int clampViewPositionHorizontal(View child, int left, int dx) {
if (mDragHorizontal || mDragCapture || mDragEdge) {
final int leftBound = getPaddingLeft();
final int rightBound = getWidth() - mDragView1.getWidth();
final int newLeft = Math.min(Math.max(left, leftBound), rightBound);
return newLeft;
}
return super.clampViewPositionHorizontal(child, left, dx);
}
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
final int action = MotionEventCompat.getActionMasked(ev);
if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {
mDragHelper.cancel();
return false;
}
return mDragHelper.shouldInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
mDragHelper.processTouchEvent(ev);
return true;
}
}