Как сделать вид следовать за моим пальцем с помощью 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 переменные для управления, где вид текста возвращается, когда вы поднимаете палец.
