如何使用onScroll和GestureDetector – Android来使视图跟随我的手指

我有一个与TextView中间的RelativeLayout。 我有它使用SimpleOnGestureListener()检测onFling,onDown和onScroll事件。

我希望TextView能够沿着屏幕沿着我的手指(可以只是在X轴上),当我抬起手指时,让屏幕上的animation或者回到中间(取决于我有多远移动它)。

这是我通常在这些情况下做的。

首先,你的onScroll方法应该看起来像这样:

@Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // Make sure that mTextView is the text view you want to move around if (!(mTextView.getLayoutParams() instanceof MarginLayoutParams)) { return false; } MarginLayoutParams marginLayoutParams = (MarginLayoutParams) mTextView.getLayoutParams(); marginLayoutParams.leftMargin = (int) marginLayoutParams.leftMargin - distanceX; marginLayoutParams.topMargin = (int) marginLayoutParams.topMargin - distanceY; mTextView.requestLayout(); return true; } 

我们正在修改leftMargintopMargin一个等于已经滚动的距离的数量。

接下来,要使文本视图的animation回到原始位置,您需要在事件为ACTION_UPACTION_CANCEL时执行此操作:

 @Override public boolean onTouch(View arg0, MotionEvent event) { if (event.getActionMasked() == MotionEvent.ACTION_UP || event.getActionMasked() == MotionEvent.ACTION_CANCEL) { snapBack(); } return mScrollDetector.onTouchEvent(event); } 

然后在snapback方法中,我们为文本视图制作animation:

 private void snapBack () { if (mTextView.getLayoutParams() instanceof MarginLayoutParams) { final MarginLayoutParams marginLayoutParams = (MarginLayoutParams) mTextView.getLayoutParams(); final int startValueX = marginLayoutParams.leftMargin; final int startValueY = marginLayoutParams.topMargin; final int endValueX = 0; final int endValueY = 0; mTextView.clearAnimation(); Animation animation = new Animation() { @Override protected void applyTransformation(float interpolatedTime, Transformation t) { int leftMarginInterpolatedValue = (int) (startValueX + (endValueX - startValueX) * interpolatedTime); marginLayoutParams.leftMargin = leftMarginInterpolatedValue; int topMarginInterpolatedValue = (int) (startValueY + (endValueY - startValueY) * interpolatedTime); marginLayoutParams.topMargin = topMarginInterpolatedValue; mTextView.requestLayout(); } }; animation.setDuration(200); animation.setInterpolator(new DecelerateInterpolator()); mTextView.startAnimation(animation); } } 

这应该做的! 您可以修改endValueXendValueYvariables来控制当您抬起手指时文本视图返回的位置。