Домашний экран Android, похожий на эффект мерцания, при установке child.setvisibility(View.Visible)

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

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 месте.)

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

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


person the5threvolution    schedule 23.08.2010    source источник


Ответы (1)


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

Обновление: проблема оказывается в правильной последовательности в настройке видимости представления nextScreen. Если вы установите видимость на VISIBLE перед вызовом layout(), вы получите мерцание в позиции 0, как вы заметили. Но если вы сначала вызовете layout(), он будет проигнорирован, потому что видимость ИСЧЕЗНАЕТ. Я сделал две вещи, чтобы исправить это:

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

В коде:

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);
    }
}

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

person markjan    schedule 13.09.2010