此處利用了ViewDragHelper類
內部設置了一個監聽,鬆手進行關閉即可
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.view.ViewCompat;
import android.support.v4.widget.ViewDragHelper;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
public class DragViewGrouop extends FrameLayout {
private ViewDragHelper dragHelper;
private int mOldLeft;
private int mOldTop;
private int mHeight;
private float mScaleValue;
private float mMinRate = 0.4f;
public DragViewGrouop(@NonNull Context context) {
this(context, null);
}
public DragViewGrouop(@NonNull Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public DragViewGrouop(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr, 0);
init();
}
private void init() {
dragHelper = ViewDragHelper.create(this, new ViewDragHelper.Callback() {
@Override
public boolean tryCaptureView(View child, int pointerId) {
return true;
}
@Override
public void onViewReleased(View releasedChild, float xvel, float yvel) {
if (dragListener != null && mScaleValue < mMinRate) {
dragListener.onViewReleased();
} else {
dragHelper.settleCapturedViewAt(mOldLeft, mOldTop);
invalidate();
ViewCompat.animate(releasedChild).scaleX(1).setDuration(0);
}
}
@Override
public void onViewCaptured(View capturedChild, int activePointerId) {
mOldLeft = capturedChild.getLeft();
mOldTop = capturedChild.getTop();
}
@Override
public int clampViewPositionVertical(View child, int top, int dy) {
mScaleValue = 1.00f - Math.abs((top - mOldTop) * 1.0f / (mHeight - mOldTop));
ViewCompat.animate(child).scaleX(mScaleValue).setDuration(0);
return top;
}
@Override
public int clampViewPositionHorizontal(View child, int left, int dx) {
return left;
}
});
}
@Override
public void computeScroll() {
super.computeScroll();
if (dragHelper != null && dragHelper.continueSettling(true)) {
invalidate();
}
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mHeight = h;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (dragHelper != null) {
return dragHelper.shouldInterceptTouchEvent(ev);
}
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (dragHelper != null) {
dragHelper.processTouchEvent(event);
}
return true;
}
private DragListener dragListener;
public void setOnDragListener(DragListener dragListener) {
this.dragListener = dragListener;
}
public interface DragListener {
void onViewReleased();
}