Android ViewFlipper + анимация домашнего экрана - PullRequest
4 голосов
/ 28 апреля 2010

Я пытаюсь использовать ViewFlipper и заставить его работать как домашний экран (макет будет двигаться пальцем). Проверьте это для примера. Я хочу сделать это с помощью ViewFlipper, который содержит только двух дочерних элементов, поэтому противоположное представление должно отображаться с каждой стороны текущего представления в зависимости от того, каким образом пользователь перемещает палец. Этот код работает, но только для 1 направления одновременно. Это в onTouchEvent.

case MotionEvent.ACTION_MOVE: 

leftView.setVisibility(View.VISIBLE);
rightView.setVisibility(View.VISIBLE);
// move the current view to the left or right.
currentView.layout((int) (touchEvent.getX() - oldTouchValue),
    currentView.getTop(),
    (int) (touchEvent.getX() - oldTouchValue) + 320,
    currentView.getBottom());

// place this view just left of the currentView
leftView.layout(currentView.getLeft() - 320, leftView.getTop(),
    currentView.getLeft(), leftView.getBottom());

// place this view just right of the currentView
rightView.layout(currentView.getRight(), rightView.getTop(), 
    currentView.getRight() + 320, rightView.getBottom());

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

Вот как я устанавливаю leftView и rightView:

final View currentView = myFlipper.getCurrentView();
final View leftView, rightView;
if (currentView == meView) {
    Log.d("current layout: ", "me");
    leftView = youView;
    rightView = youView;
} else if (currentView == youView) {
    Log.d("current layout: ", "you");
    leftView = meView;
    rightView = meView;
} else {
    leftView = null;
    rightView = null;
}

Будет ли возможно настроить его так, чтобы с обеих сторон текущего вида отображался один и тот же вид?

Ответы [ 4 ]

1 голос
/ 29 апреля 2010

Спасибо, stealthcopter

Здесь сработал новый код, если кому-то интересно.

        if (touchEvent.getX() < oldTouchValue){
             // place this view just right of the currentView
            rightView.layout(currentView.getRight(), rightView.getTop(), 
                            currentView.getRight() + 320, rightView.getBottom());

        }else if (touchEvent.getX() > oldTouchValue) {
            // place this view just left of the currentView
            leftView.layout(currentView.getLeft() - 320, leftView.getTop(),
                            currentView.getLeft(), leftView.getBottom());

        }

Я также переместил вызовы setVisibility () в MotionEvent.ACTION_DOWN в попытке избавиться от некоторого мерцания представлений. Это помогло, но я все еще получаю немного.

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

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

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

enter image description here

0 голосов
/ 15 марта 2011

Чтобы избавиться от мерцания, установите setVisibility(View.INVISIBLE) в MotionEvent.ACTION_DOWN. Значение по умолчанию «GONE» в представлении. Это означает, что вы не можете установить Layout() для представления, пока оно не станет "VISIBLE" или "INVISIBLE". Итак, в три этапа:

  1. Установить видимость невидимым в представлении
  2. Установить макет () в представлении
  3. Установить видимость видимой в представлении
0 голосов
/ 28 апреля 2010

Возможно, у меня не очень конструктивное предложение, но если вы хотите, чтобы он вел себя как домашний экран, почему вы не хотите смотреть на src этого и изменять его в соответствии со своими потребностями?

...