Освой программирование играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Рассмотрим некоторые приёмы с компонентом ViewFlipper.
У ViewFlipper есть полезные методы getDisplayedChild()/setDisplayedChild(), которые позволяют задать или узнать дочерний элемент для показа на экране. Таким образом, вы можете настроить компонент таким образом, чтобы сначала выводилась не первая картинка, а третья.
Узнать, какая именно картинка (дочерний элемент) выводится в данный момент можно через комбинацию flipper.indexOfChild(flipper.getCurrentView().
Описываемые выше методы легко применить, когда вы вручную сменяете картинки. А если вы установили режим слайд-шоу и картинки меняются в автоматическом режиме, то возникают проблемы. Отдельного слушателя для прослушки смены картинки нет. Но мы можем пойти обходным путём и прослушивать анимацию. Вот как это может выглядеть.
package ru.alexanderklimov.flipper;
import ...
public class MainActivity extends Activity implements AnimationListener {
private ViewFlipper mViewFlipper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_switcher);
mViewFlipper = (ViewFlipper) findViewById(R.id.viewFlipper1);
mViewFlipper.setAutoStart(true);
mViewFlipper.setInAnimation(getApplicationContext(),
android.R.anim.slide_in_left);
mViewFlipper.setOutAnimation(getApplicationContext(), android.R.anim.slide_in_right);
mViewFlipper.getInAnimation().setAnimationListener(this);
mViewFlipper.setFlipInterval(1500);
}
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
// Ваш код
if(mViewFlipper.indexOfChild(mViewFlipper.getCurrentView()) == 9){
mViewFlipper.stopFlipping();
finish();
}
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
// Ваш код
}
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
// Ваш код
}
}
В этом примере в методе onAnimationEnd() мы ждём, когда на экране появится десятый ImageView и останавливаем слайд-шоу и выходим из активности.
Оставим в разметке один ViewFlipper без дочерних элементов.
<ViewFlipper
android:id="@+id/viewFlipper1"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Добавим в класс активности массив картинок из ресурсов.
private int[] mDrawablesArray = { R.drawable.image1, R.drawable.image2,
R.drawable.image3, R.drawable.image4,
R.drawable.image5, R.drawable.image6,
R.drawable.image7, R.drawable.image8,
R.drawable.image9, R.drawable.image10 };
Программно добавим дочерние элементы.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_switcher);
mViewFlipper = (ViewFlipper) findViewById(R.id.viewFlipper1);
for (int i = 0; i < mDrawablesArray.length; i++) {
setFlipperImage(mDrawablesArray[i]);
}
mViewFlipper.setAutoStart(true);
// и т.д.
mViewFlipper.setFlipInterval(1500);
}
private void setFlipperImage(int resId) {
ImageView image = new ImageView(getApplicationContext());
image.setBackgroundResource(resId);
mViewFlipper.addView(image);
}