Освой программирование играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

ViewFlipper. Продвинутые приёмы

Рассмотрим некоторые приёмы с компонентом 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 и останавливаем слайд-шоу и выходим из активности.

Динамическое добавление дочерних 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);
}
Реклама