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

1

Я сделал образец приложения, чтобы перелистывать различные макеты в 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
}

Над псевдокодом работает хорошо перемещающийся linearlayouts внутри viewflipper при перетаскивании по экрану (как и на начальном экране).

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

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

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

Теги:
visible
flicker
viewflipper
homescreen

1 ответ

3

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

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

  • Установите видимость для INVISIBLE перед вызовом first layout(). Это отличается от GONE тем, что выполняется layout() - вы просто не видите его.
  • Установите видимость для 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);
    }
}

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню