public class DragFloatImageView extends AppCompatImageButton { private int parentHeight; private int parentWidth; private int lastX; private int lastY; private boolean isDrag; public DragFloatImageView(Context context) { super(context); } public DragFloatImageView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public DragFloatImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public boolean onTouchEvent(MotionEvent event) { int rawX = (int) event.getRawX(); int rawY = (int) event.getRawY(); switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: setPressed(true); isDrag = false; getParent().requestDisallowInterceptTouchEvent(true); lastX = rawX; lastY = rawY; ViewGroup parent; if (getParent() != null) { parent = (ViewGroup) getParent(); parentHeight = parent.getHeight(); parentWidth = parent.getWidth(); } break; case MotionEvent.ACTION_MOVE: LogUtil.e("移动"); if (parentHeight <= 0 || parentWidth == 0) { isDrag = false; break; } else { isDrag = true; } int dx = rawX - lastX; int dy = rawY - lastY; //这里修复一些手机无法触发点击事件 int distance = (int) Math.sqrt(dx * dx + dy * dy); if (distance < 3) { isDrag = false; break; } float x = getX() + dx; float y = getY() + dy; //检测是否到达边缘,左上右下 x = x < 0 ? 0 : x > parentWidth - getWidth() ? parentWidth - getWidth() : x; y = getY() < 0 ? 0 : getY() + getHeight() > parentHeight ? parentHeight - getHeight() : y; setX(x); setY(y); lastX = rawX; lastY = rawY; break; case MotionEvent.ACTION_UP: if (!isNotDrag()) { setPressed(false); if (rawX >= parentWidth / 2) { //靠右吸附 // ObjectAnimator oa = ObjectAnimator.ofFloat(this, "x", lastX, parentWidth - getWidth()); ObjectAnimator oa = ObjectAnimator.ofFloat(this, "x", getX(), parentWidth - getWidth()); oa.setInterpolator(new DecelerateInterpolator()); oa.setDuration(500); oa.start(); /*animate().setInterpolator(new BounceInterpolator()) .setDuration(500) .xBy(parentWidth - getWidth() - getX()) .start();*///弹几下得效果 } else { //靠左吸附 ObjectAnimator oa = ObjectAnimator.ofFloat(this, "x", getX(), 0); oa.setInterpolator(new DecelerateInterpolator()); oa.setDuration(500); oa.start(); } } break; } return !isNotDrag() || super.onTouchEvent(event); } private boolean isNotDrag() { return !isDrag && (getX() == 0 || (getX() == parentWidth - getWidth())); } }
在xml使用
android:id="@+id/textView_inquire" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_marginBottom="12dp" android:layout_marginRight="12dp" android:background="@drawable/icon_company_inquire" android:visibility="gone" />