java代码
public class DragLayout extends RelativeLayout {
private ViewDragHelper mDragger;
private ViewDragHelper.Callback callback;
private ImageView iv_drag;
private Point oldLocation = new Point();
private int measuredWidth;
@Override
protected void onFinishInflate() {
iv_drag = (ImageView) this.findViewById(R.id.iv_drag);
super.onFinishInflate();
}
public DragLayout(Context context) {
super(context);
}
public DragLayout(Context context, AttributeSet attrs) {
super(context, attrs);
callback = new DraggerCallBack();
mDragger = ViewDragHelper.create(this, 1.0f, callback);
}
private int x, y;
class DraggerCallBack extends ViewDragHelper.Callback {
@Override
public boolean tryCaptureView(View child, int pointerId) {
if (child != iv_drag) {
return false;
}
return true;
}
@Override
public int clampViewPositionHorizontal(View child, int left, int dx) {
final int leftBound = getPaddingLeft();
final int rightBound = getWidth() - child.getWidth() - leftBound;
return Math.min(Math.max(left, leftBound), rightBound);
}
@Override
public int clampViewPositionVertical(View child, int top, int dy) {
final int topBound = getPaddingTop();
final int bottomBound = getHeight() - child.getHeight() - topBound;
return Math.min(Math.max(top, topBound), bottomBound);
}
@Override
public void onViewReleased(View releasedChild, float xvel, float yvel) {
if (releasedChild == iv_drag) {
if (iv_drag.getTop() - y >= -2 && iv_drag.getTop() - y <= 2 && iv_drag.getLeft() - x >= -2 && iv_drag.getLeft() - x <= 2) {
if (onClickImage != null) {
onClickImage.click();
}
}
if (iv_drag.getLeft() + oldLocation.x / 2 >= measuredWidth / 2) {
x = measuredWidth - oldLocation.x;
y = iv_drag.getTop();
} else {
x = 0;
y = iv_drag.getTop();
}
mDragger.settleCapturedViewAt(x, y);
invalidate();
}
}
}
@Override
public void computeScroll() {
if (mDragger.continueSettling(true)) {
invalidate();
}
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
oldLocation.x = iv_drag.getWidth();
oldLocation.y = iv_drag.getHeight();
x = iv_drag.getLeft();
y = iv_drag.getTop();
measuredWidth = this.getMeasuredWidth();
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return mDragger.shouldInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
mDragger.processTouchEvent(event);
if (event.getY() > iv_drag.getTop() && event.getY() < iv_drag.getTop() + oldLocation.y && event.getX() > iv_drag.getLeft() && event.getX() < iv_drag.getLeft() + oldLocation.x)
return true;
return false;
}
private OnClickImage onClickImage;
public void setOnClickImage(OnClickImage onClickImage) {
this.onClickImage = onClickImage;
}
public interface OnClickImage {
void click();
}
}
xml中的使用
<com.jootun.hudongba.view.DragLayout
android:id="@+id/layout_drag"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="3dp">
<ImageView
android:id="@+id/iv_drag"
android:layout_width="86dip"
android:layout_height="86dip"
android:layout_alignParentRight="true"
android:layout_marginTop="20dp"
android:visibility="gone" />
</com.jootun.hudongba.view.DragLayout>