Я сделал образец приложения, чтобы перелистывать различные макеты в 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 месте.)
Есть ли способ загрузить следующий экран, не заставляя его мерцать на экране? Я хочу, чтобы он был загружен (сделан видимым) из экрана, чтобы он не мерцал.
Большое спасибо за ваше время и помощь!
+1. У меня такая же проблема. Я попытался переключить вызовы layout() и setVisible() без эффекта.
Обновление: Проблема заключается в правильной последовательности в настройке видимости следующего экрана. Если вы установите видимость VISIBLE перед вызовом layout(), вы получите мерцание в позиции 0, как вы заметили. Но если вы сначала вызываете layout(), он игнорируется, потому что видимость GONE. Я сделал две вещи, чтобы исправить это:
В коде:
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);
}
}
Более элегантные и простые решения приветствуются!