Создание ViewFlipper как домашнего экрана с помощью MotionEvent.ACTION_MOVE - PullRequest
10 голосов
/ 08 апреля 2010

Хорошо, у меня есть ViewFlipper с тремя LinearLayouts, вложенными в него. По умолчанию показывается первый. Этот код:

// Assumptions in my Activity class:
// oldTouchValue is a float
// vf is my view flipper
@Override
public boolean onTouchEvent(MotionEvent touchEvent) {
  switch (touchEvent.getAction()) {
    case MotionEvent.ACTION_DOWN: {
      oldTouchValue = touchEvent.getX();
      break;
    }
    case MotionEvent.ACTION_UP: {
      float currentX = touchEvent.getX();
      if (oldTouchValue < currentX) {
        vf.setInAnimation(AnimationHelper.inFromLeftAnimation());
        vf.setOutAnimation(AnimationHelper.outToRightAnimation());
        vf.showNext();
      }
      if (oldTouchValue > currentX) {
        vf.setInAnimation(AnimationHelper.inFromRightAnimation());
        vf.setOutAnimation(AnimationHelper.outToLeftAnimation());
        vf.showPrevious();
      }
      break;
    }
    case MotionEvent.ACTION_MOVE: {
      // TODO: Some code to make the ViewFlipper
      // act like the home screen.
      break;
    }
  }
  return false;
}

public static class AnimationHelper {
  public static Animation inFromRightAnimation() {
    Animation inFromRight = new TranslateAnimation(
    Animation.RELATIVE_TO_PARENT, +1.0f,
    Animation.RELATIVE_TO_PARENT, 0.0f,
    Animation.RELATIVE_TO_PARENT, 0.0f,
    Animation.RELATIVE_TO_PARENT, 0.0f);
    inFromRight.setDuration(350);
    inFromRight.setInterpolator(new AccelerateInterpolator());
    return inFromRight;
  }

  public static Animation outToLeftAnimation() {
    Animation outtoLeft = new TranslateAnimation(
    Animation.RELATIVE_TO_PARENT, 0.0f,
    Animation.RELATIVE_TO_PARENT, -1.0f,
    Animation.RELATIVE_TO_PARENT, 0.0f,
    Animation.RELATIVE_TO_PARENT, 0.0f);
    outtoLeft.setDuration(350);
    outtoLeft.setInterpolator(new AccelerateInterpolator());
    return outtoLeft;
  }

  // for the next movement
  public static Animation inFromLeftAnimation() {
    Animation inFromLeft = new TranslateAnimation(
    Animation.RELATIVE_TO_PARENT, -1.0f,
    Animation.RELATIVE_TO_PARENT, 0.0f,
    Animation.RELATIVE_TO_PARENT, 0.0f,
    Animation.RELATIVE_TO_PARENT, 0.0f);
    inFromLeft.setDuration(350);
    inFromLeft.setInterpolator(new AccelerateInterpolator());
    return inFromLeft;
  }

  public static Animation outToRightAnimation() {
    Animation outtoRight = new TranslateAnimation(
    Animation.RELATIVE_TO_PARENT, 0.0f,
    Animation.RELATIVE_TO_PARENT, +1.0f,
    Animation.RELATIVE_TO_PARENT, 0.0f,
    Animation.RELATIVE_TO_PARENT, 0.0f);
    outtoRight.setDuration(350);
    outtoRight.setInterpolator(new AccelerateInterpolator());
    return outtoRight;
  }
}

... обрабатывает переворачивание вида, но анимация очень "вкл / выкл". Мне интересно, может ли кто-нибудь помочь мне с последней частью. Предполагая, что я могу получить доступ к LinearLayouts, есть ли способ, которым я могу установить положение макетов на основе deltaX и deltaY?

Кто-то дал мне эту ссылку и сказал, что я должен обратиться к методу applyTransformation для подсказок о том, как это сделать, но я не знаю, как повторить то же самое поведение.

Ответы [ 2 ]

10 голосов
/ 10 апреля 2010

Перемещение вида во время движения пальца легко сделать:

case MotionEvent.ACTION_MOVE:
    final View currentView = vf.getCurrentView();
    currentView.layout((int)(touchEvent.getX() - oldTouchValue), 
            currentView.getTop(), currentView.getRight(), 
            currentView.getBottom());
break;

Теперь это перемещает только текущий вид, а не соседей. Я еще не проверял это, но, вероятно, их можно получить с помощью getChildAt:

vf.getChildAt(vf.getDisplayedChild() - 1); // previous
vf.getChildAt(vf.getDisplayedChild() + 1); // next

Надеюсь, это поможет.

1 голос
/ 12 октября 2011

Если я понимаю ваш запрос, этот эффект теперь должен быть реализован с использованием View Pager

выглядит так:

enter image description here

...