package com.stu.assistant.uitls; import android.animation.ObjectAnimator; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.ViewGroup; import android.view.animation.DecelerateInterpolator; import androidx.appcompat.widget.AppCompatTextView; public class DragTextView extends AppCompatTextView { private int parentHeight; protected int parentWidth; private int lastX; private int lastY; private boolean isDrag; private ViewGroup parent; public DragTextView(Context context) { super(context); } public DragTextView(Context context, AttributeSet attrs) { super(context, attrs); } public DragTextView(Context context, 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: this.setAlpha(0.9F); this.setPressed(true); this.isDrag = false; this.getParent().requestDisallowInterceptTouchEvent(true); this.lastX = rawX; this.lastY = rawY; if (this.getParent() != null) { this.parent = (ViewGroup) this.getParent(); this.parentHeight = this.parent.getHeight(); this.parentWidth = this.parent.getWidth(); } break; case MotionEvent.ACTION_UP: if (!this.isNotDrag()) { this.setPressed(false); this.moveHide(rawX); } break; case MotionEvent.ACTION_MOVE: if ((double) this.parentHeight > 0.2D && (double) this.parentWidth > 0.2D) { this.isDrag = true; this.setAlpha(0.9F); int dx = rawX - this.lastX; int dy = rawY - this.lastY; int distance = (int) Math.sqrt((double) (dx * dx + dy * dy)); if (distance < 2) { this.isDrag = false; } else { float x = this.getX() + (float) dx; float y = this.getY() + (float) dy; x = x < 0.0F ? 0.0F : (x > (float) (this.parentWidth - this.getWidth()) ? (float) (this.parentWidth - this.getWidth()) : x); y = this.getY() < 0.0F ? 0.0F : (this.getY() + (float) this.getHeight() > (float) this.parentHeight ? (float) (this.parentHeight - this.getHeight()) : y); this.setX(x); this.setY(y); this.lastX = rawX; this.lastY = rawY; Log.i("aa", "isDrag=" + this.isDrag + "getX=" + this.getX() + ";getY=" + this.getY() + ";parentWidth=" + this.parentWidth); } } else { this.isDrag = false; } } return !this.isNotDrag() || super.onTouchEvent(event); } private boolean isNotDrag() { return !this.isDrag && (this.getX() == 0.0F || this.getX() == (float) (this.parentWidth - this.getWidth() - getMarginEnd()) || this.getX() == (float) (this.parentWidth - this.getWidth())); } private int getMarginEnd() { ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) getLayoutParams(); int endMargin = params.getMarginEnd(); return endMargin; } protected void moveHide(int rawX) { if (rawX >= this.parentWidth / 2) { this.animate().setInterpolator(new DecelerateInterpolator()).setDuration(500L).xBy((float) (this.parentWidth - this.getWidth()) - this.getX()).start(); } else { ObjectAnimator oa = ObjectAnimator.ofFloat(this, "x", new float[]{this.getX(), 0.0F}); oa.setInterpolator(new DecelerateInterpolator()); oa.setDuration(500L); oa.start(); } } }