ViewDragHelper处理拖动式代码

/** * Created by gyzhong on 15/4/8. */ public class VdhLayout01 extends RelativeLayout { private ViewDragHelper mViewDragHelper; private View mCaptureView; private float mInitialMotionX; private float mInitialMotionY;

private boolean mIsUnableToDrag; private int mSlideRange; private float mSlideOffset; public VdhLayout01(Context context) { this(context, null); } public VdhLayout01(Context context, AttributeSet attrs) { this(context, attrs, 0);

} public VdhLayout01(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(context); } private void initView(Context context) { mViewDragHelper = ViewDragHelper.create(this, 1.0f, new DragHelperCall());

} @Override protected void onFinishInflate() { super.onFinishInflate(); mCaptureView = findViewById(R.id.id_capture_view); TextView textView = (TextView) findViewById(R.id.id_text); textView.setText(Shakespeare.DIALOGUE[0]); }

@Override protected void onAttachedToWindow() { super.onAttachedToWindow(); mCaptureView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { mCaptureView.getViewTreeObserver().removeOnPreDrawListener(this); mSlideRange = mCaptureView.getMeasuredWidth(); return false; } }); }

private class DragHelperCall extends ViewDragHelper.Callback { @Override public boolean tryCaptureView(View child, int pointerId) { return child == mCaptureView;

} @Override public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) { super.onViewPositionChanged(changedView, left, top, dx, dy);

mSlideOffset = left * 1.0f / mSlideRange*2; } @Override public int clampViewPositionHorizontal(View child, int left, int dx) { return clamp(left, 0, mSlideRange / 2);

} @Override public int getViewHorizontalDragRange(View child) { return mSlideRange/2; } @Override public void onViewReleased(View releasedChild,

float xvel, float yvel) { int finalLeft; if (xvel > 0 || xvel == 0 && mSlideOffset > .5f) { finalLeft = mSlideRange/2 ; }else { finalLeft = 0 ; } mViewDragHelper.settleCapturedViewAt( finalLeft, mCaptureView.getTop()); invalidate();

} } @Override public void computeScroll() { if (mViewDragHelper.continueSettling(true)){ ViewCompat.postInvalidateOnAnimation(this); } } private int clamp(int value, int min, int max) { return Math.min(max, Math.max(min, value));

} @Override public boolean onInterceptTouchEvent(MotionEvent ev) { final int action = MotionEventCompat.getActionMasked(ev); if (action == MotionEvent.ACTION_CANCEL ||

action == MotionEvent.ACTION_UP) { mViewDragHelper.cancel(); return false; } if (!isEnabled() || (mIsUnableToDrag && action != MotionEvent.ACTION_DOWN)) { mViewDragHelper.cancel(); return super.onInterceptTouchEvent(ev);

} int index = MotionEventCompat.getActionIndex(ev) ; switch (action) { case MotionEvent.ACTION_DOWN: { final float x = ev.getX(); final float y = ev.getY(); mInitialMotionX = x; mInitialMotionY = y;

mIsUnableToDrag = false; break; } case MotionEvent.ACTION_MOVE: { final float x = ev.getX(); final float y = ev.getY(); final float adx = Math.abs(x - mInitialMotionX); final float ady = Math.abs(y - mInitialMotionY);

int slop = mViewDragHelper.getTouchSlop(); if (adx > slop && adx < ady) { mIsUnableToDrag = true; mViewDragHelper.cancel(); return false; } break; } } return mViewDragHelper.shouldInterceptTouchEvent(ev); }

@Override public boolean onTouchEvent(MotionEvent event) { mViewDragHelper.processTouchEvent(event); return true; } }

posted @ 2021-08-23 09:15  v17166570219  阅读(24)  评论(0)    收藏  举报