/** * view在范围外移动执行此Runnable * @param stickyViewHelper */ private void setViewOutRangeMove(StickyViewHelper stickyViewHelper) { stickyViewHelper.setViewOutRangeMoveRun(new Runnable() { @Override public void run() { DisplayUtils.showToast(mContext, "ViewOutRangeMove"); } }); }
@Override public void onAnimationEnd(Animator animation) { if (dragStickViewListener != null) { dragStickViewListener.inRangeUp(mDragCanterPoint); } }
/** * 当移出了规定范围,最后在范围外松手的回调 * @param dragCanterPoint */ @Override public void outRangeUp(PointF dragCanterPoint) { removeView(); playAnim(dragCanterPoint); }
startX = event.getRawX(); startY = event.getRawY(); updateDragCenterPoint(startX, startY); break; case MotionEvent.ACTION_MOVE: float endY = event.getRawY(); updateDragCenterPoint(endX, endY); distance(); dragStickViewListener.outRangeMove(mDragCanterPoint); dragStickViewListener.inRangeMove(mDragCanterPoint); this.setEnabled(false); distance(); if (isOut) { outUp(); inUp(); invalidate(); break;
/** * 初始化StickyView的 */ private void initStickyViewData() { // 计算小圆点在屏幕的坐标 int[] points = new int[2]; mShowView.getLocationInWindow(points); int x = points[0] + mShowView.getWidth() / 2; int y = points[1] + mShowView.getHeight() / 2; // 需要外部设置,当StickyView还没有执行完dispatchAttachedToWindow()时是计算不出其高度的 mStickyView.setStatusBarHeight(mStatusBarHeight); if(mFarthestDistance>0){ mStickyView.setFarthestDistance(mFarthestDistance); } if(mMinFixRadius>0){ mStickyView.setMinFixRadius(mMinFixRadius); } if(mFixRadius>0){ mStickyView.setFixRadius(mFixRadius); } if(mPathColor!=0){ mStickyView.setPaintColor(mPathColor); } // 初始化做作画的圆和控制点坐标 mStickyView.setShowCanterPoint(x, y); }
copyText(); mStickyView = new StickyView(mContext, mDragView, mWm); initStickyViewData(); mStickyView.setDragStickViewListener(this); mStickyView.onTouchEvent(event); return true;
/** * 移动出规定范围 */ private void outUp() { // 外面松手 if (rangeMove > mFarthestDistance) { isOutUp = true; if (dragStickViewListener != null) { dragStickViewListener.outRangeUp(mDragCanterPoint); } } // 里面松手 else { isOutUp = false; if (dragStickViewListener != null) { dragStickViewListener.out2InRangeUp(mDragCanterPoint); } } updateDragCenterPoint(mFixCanterPoint.x, mFixCanterPoint.y); }
/** * 更新拖拽圆圆心 */ private void updateDragCenterPoint(float x, float y) { mDragCanterPoint.set(x, y); updateManagerView(x, y); invalidate(); }
/** * 一直没有移动出范围,在范围内松手的回调 * @param dragCanterPoint */ @Override public void inRangeUp(PointF dragCanterPoint) { removeView(); if(mViewInRangeUpRun !=null){ mViewInRangeUpRun.run(); } } /**
public StickyView(Context context, View mDragView, WindowManager mWm) { super(context); this.mContext=context; this.mDragView = mDragView; this.mWm = mWm; init(); }
/** * view在范围内移动指此此Runnable * @param stickyViewHelper */ private void setViewInRangeMove(StickyViewHelper stickyViewHelper) { stickyViewHelper.setViewInRangeMoveRun(new Runnable() { @Override public void run() { DisplayUtils.showToast(mContext, "ViewInRangeMove"); } }); }
/** * view移出过范围,最后在范围内松手执行次Runnable * @param stickyViewHelper */ private void setViewOut2InRangeUp(StickyViewHelper stickyViewHelper) { stickyViewHelper.setViewOut2InRangeUpRun(new Runnable() { @Override public void run() { DisplayUtils.showToast(mContext, "ViewOut2InRangeUp"); myAdapter.notifyDataSetChanged(); } }); }
/** * view没有移出过范围,在范围内松手 * @param stickyViewHelper */ private void setViewInRangeUp(StickyViewHelper stickyViewHelper) { stickyViewHelper.setViewInRangeUpRun(new Runnable() { @Override public void run() { DisplayUtils.showToast(mContext, "ViewInRangeUp"); myAdapter.notifyDataSetChanged(); } }); }
/** * view移出范围,最后在范围外松手 * @param position * @param stickyViewHelper */ private void setViewOutRangeUp(final int position, StickyViewHelper stickyViewHelper) { stickyViewHelper.setViewOutRangeUpRun(new Runnable() { @Override public void run() { DisplayUtils.showToast(mContext, "ViewOutRangeUp"); removeList.add(position); myAdapter.notifyDataSetChanged(); } }); }
/** * 设置固定圆、拖拽圆、控制点的圆心坐标 * * @param x * @param y */ public void setShowCanterPoint(float x, float y) { mFixCanterPoint.set(x, y); mDragCanterPoint.set(x, y); mCanterPoint.set(x, y); invalidate(); }
private void removeView() { if (mWm != null && mStickyView.getParent() != null && mDragView.getParent() != null) { mWm.removeView(mStickyView); mWm.removeView(mDragView); } }
mParams.height=WindowManager.LayoutParams.WRAP_CONTENT; long duration = getAnimDuration(mAnimDrawable);
float mFixRadius = updateStickRadius(); canvas.drawCircle(mFixCanterPoint.x, mFixCanterPoint.y, mFixRadius, mPaint);
/** * 移动的时候一直在范围内,最后在范围内松手 */ private void inUp() { final PointF startPoint = new PointF(mDragCanterPoint.x, mDragCanterPoint.y); final PointF endPoint = new PointF(mFixCanterPoint.x, mFixCanterPoint.y); ValueAnimator animator = ValueAnimator.ofFloat(1.0f); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float fraction = animation.getAnimatedFraction(); PointF byPercent = GeometryUtil.getPointByPercent( startPoint, endPoint, fraction); updateDragCenterPoint(byPercent.x, byPercent.y); } }); addUpEndAnimListener(animator); animator.setInterpolator(new OvershootInterpolator(4.0f)); animator.setDuration(500); animator.start(); }
/** * 当移出了规定范围,最后在范围内松手的回调 * @param dragCanterPoint */ @Override public void out2InRangeUp(PointF dragCanterPoint) { removeView(); if(viewOut2InRangeUpRun !=null){ viewOut2InRangeUpRun.run(); } }