Как сделать вид следовать за моим пальцем с помощью onScroll и GestureDetector-Android
У меня есть RelativeLayout с TextView посередине. Я получил его для обнаружения событий onFling, onDown и onScroll с помощью SimpleOnGestureListener().
Я хотел бы, чтобы TextView следовал за моим пальцем по экрану (может быть только по оси x), и когда я поднимаю палец для него, так что анимируйте либо из экрана, либо обратно в середину (в зависимости от того, как далеко я его переместил).
1 ответов
это то, что я обычно делаю в этих случаях.
прежде всего, ваш метод 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;
}
мы модификации leftMargin
и topMargin
сумма, эквивалентная расстоянию, которое было прокручено.
далее, чтобы сделать вид текста анимировать обратно в исходное положение, вам нужно сделать это, когда событие ACTION_UP
или ACTION_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 мы анимируем текст вид:
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);
}
}
и это должно сделать! Вы можете изменить endValueX
и endValueY
переменные для управления, где вид текста возвращается, когда вы поднимаете палец.