Android Home Screen как проблема мерцания эффекта, когда установлено child.setvisibility (View.Visible) - PullRequest
1 голос
/ 23 августа 2010

Я создал пример приложения для просмотра различных макетов в видоискателе.

XML в основном (псевдокод)

<ViewFlipper>
<LinearLayout><TextView text:"this is the first page" /></LinearLayout>
<LinearLayout><TextView text:"this is the second page" /></LinearLayout>
<LinearLayout><TextView text:"this is the third page" /></LinearLayout>
</ViewFlipper>

А в коде Java

public boolean onTouchEvent(MotionEvent event)
case MotionEvent.ACTION_DOWN {
   oldTouchValue = event.getX()
} case MotionEvent.ACTION_UP {
   //depending on Direction, do viewFlipper.showPrevious or viewFlipper.showNext
   //after setting appropriate animations with appropriate start/end locations
} case MotionEvent.ACTION_MOVE {
   //Depending on the direction
   nextScreen.setVisibility(View.Visible)
   nextScreen.layout(l, t, r, b) // l computed appropriately
   CurrentScreen.layout(l2, t2, r2, b2) // l2 computed appropriately
}

Вышеупомянутый псевдокод хорошо работает, перемещая линейные макеты внутри видоискателя при перетаскивании на экране (как на домашнем экране).

Проблема заключается в том, что я делаю nextScreen.setVisibility (View.VISIBLE).Когда следующий экран становится видимым, он мигает на экране, прежде чем перейти в соответствующее положение.(Полагаю, он отображается в 0 месте.)

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

Большое спасибо за потраченное время и помощь!

1 Ответ

3 голосов
/ 13 сентября 2010

+ 1. У меня точно такая же проблема. Я попытался переключить вызовы layout () и setVisible () безрезультатно.

Обновление: Проблема оказывается в правильной последовательности в настройке видимости представления следующего экрана. Если вы установите видимость VISIBLE до вызова layout (), вы получите мерцание в позиции 0, как вы заметили. Но если вы сначала вызовете layout (), он игнорируется, потому что видимость GONE. Я сделал две вещи, чтобы исправить это:

  1. Установите видимость невидимым перед первым вызовом layout (). Это отличается от GONE тем, что layout () выполняется - вы просто его не видите.
  2. Установите видимость VISIBLE асинхронно, чтобы макет () и связанные сообщения обрабатывались первыми

В коде:

case MotionEvent.ACTION_DOWN:
    nextScreen.setVisibility(View.INVISIBLE); //from View.GONE

case MotionEvent.ACTION_MOVE:
    nextScreen.layout(l, t, r, b);
    if (nextScreen.getVisibility() != View.VISIBLE) {
    //the view is not visible, so send a message to make it so
    mHandler.sendMessage(Message.obtain(mHandler, 0));
}

private class ViewHandler extends Handler {

    @Override
    public void handleMessage(Message msg) {
        nextScreen.setVisibility(View.VISIBLE);
    }
}

Более элегантные / простые решения приветствуются!

...