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

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

Шкодим

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

ViewFlipper. Управление жестами

Возьмём за основу предыдущий пример и удалим все кнопки. Переход между экранами будем делать с помощью жестов.


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ViewFlipper
        android:id="@+id/viewflipper"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="#00ff00"
            android:orientation="vertical" >

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Первый экран" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="#ff0000"
            android:orientation="vertical" >

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Второй экран" />
        </LinearLayout>
    </ViewFlipper>

</LinearLayout>

Добавим дополнительные анимации, чтобы смена страниц происходила слева направо и справа налево, в соответствии с движением лапы кота.

flipin_reverse.xml


<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/decelerate_interpolator" >

    <translate
        android:duration="500"
        android:fromXDelta="100%p"
        android:toXDelta="0" />

</set>

flipout_reverse


<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/decelerate_interpolator" >

    <translate
        android:duration="500"
        android:fromXDelta="0"
        android:toXDelta="-100%p" />

</set>

Теперь определим жест движения слева направо и жест в противоположном направлении:


package ru.alexanderklimov.viewflipper;

import ...

public class MainActivity extends Activity {

	ViewFlipper flipper;

	Animation animFlipInForward;
	Animation animFlipOutForward;
	Animation animFlipInBackward;
	Animation animFlipOutBackward;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		flipper = (ViewFlipper) findViewById(R.id.viewflipper);

		animFlipInForward = AnimationUtils.loadAnimation(this, R.anim.flipin);
		animFlipOutForward = AnimationUtils.loadAnimation(this, R.anim.flipout);
		animFlipInBackward = AnimationUtils.loadAnimation(this,
				R.anim.flipin_reverse);
		animFlipOutBackward = AnimationUtils.loadAnimation(this,
				R.anim.flipout_reverse);
	}

	private void SwipeLeft() {
		flipper.setInAnimation(animFlipInBackward);
		flipper.setOutAnimation(animFlipOutBackward);
		flipper.showPrevious();
	}

	private void SwipeRight() {
		flipper.setInAnimation(animFlipInForward);
		flipper.setOutAnimation(animFlipOutForward);
		flipper.showNext();
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		return gestureDetector.onTouchEvent(event);
	}

	SimpleOnGestureListener simpleOnGestureListener = new SimpleOnGestureListener() {

		@Override
		public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
				float velocityY) {

			float sensitvity = 50;
			if ((e1.getX() - e2.getX()) > sensitvity) {
				SwipeLeft();
			} else if ((e2.getX() - e1.getX()) > sensitvity) {
				SwipeRight();
			}
			return true;
		}
	};

	GestureDetector gestureDetector = new GestureDetector(getBaseContext(),
			simpleOnGestureListener);

Запускаем проект и пробуем проводить в разных направлениях. Должно работать.

Можно не создавать XML-файлы анимации, а программно управлять анимацией. На мой взгляд это не совсем удобно, но для общей информации приведу код. Лишний код от предыдущего примера закомментирован, а сами файлы из папки res/anim можно удалить:


package ru.alexanderklimov.viewflipper;

import android.os.Bundle;
import android.app.Activity;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.AnimationUtils;
import android.view.animation.OvershootInterpolator;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.ViewFlipper;

public class MainActivity extends Activity {

	ViewFlipper flipper;

	AnimationSet animSetFlipInForward;
	AnimationSet animSetFlipOutForward;
	AnimationSet animSetFlipInBackward;
	AnimationSet animSetFlipOutBackward;

	// Animation animFlipInForward;
	// Animation animFlipOutForward;
	// Animation animFlipInBackward;
	// Animation animFlipOutBackward;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		flipper = (ViewFlipper) findViewById(R.id.viewflipper);

		animSetFlipInForward = new AnimationSet(true);
		TranslateAnimation translateAnimFlipInForeward = new TranslateAnimation(
				Animation.RELATIVE_TO_SELF, -1f, Animation.RELATIVE_TO_SELF, 0,
				Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0);
		animSetFlipInForward.addAnimation(translateAnimFlipInForeward);
		animSetFlipInForward.setDuration(500);
		animSetFlipInForward.setInterpolator(new OvershootInterpolator());

		animSetFlipOutForward = new AnimationSet(true);
		TranslateAnimation translateAnimFlipOutForeward = new TranslateAnimation(
				Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 1f,
				Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0);
		animSetFlipOutForward.addAnimation(translateAnimFlipOutForeward);
		animSetFlipOutForward.setDuration(500);
		animSetFlipOutForward.setInterpolator(new OvershootInterpolator());

		animSetFlipInBackward = new AnimationSet(true);
		TranslateAnimation translateAnimFlipInBackward = new TranslateAnimation(
				Animation.RELATIVE_TO_SELF, 1f, Animation.RELATIVE_TO_SELF, 0,
				Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0);
		animSetFlipInBackward.addAnimation(translateAnimFlipInBackward);
		animSetFlipInBackward.setDuration(500);
		animSetFlipInBackward.setInterpolator(new OvershootInterpolator());

		animSetFlipOutBackward = new AnimationSet(true);
		TranslateAnimation translateAnimFlipOutBackward = new TranslateAnimation(
				Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, -1f,
				Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0);
		animSetFlipOutBackward.addAnimation(translateAnimFlipOutBackward);
		animSetFlipOutBackward.setDuration(500);
		animSetFlipOutBackward.setInterpolator(new OvershootInterpolator());

		// animFlipInForward = AnimationUtils.loadAnimation(this,
		// R.anim.flipin);
		// animFlipOutForward = AnimationUtils.loadAnimation(this,
		// R.anim.flipout);
		// animFlipInBackward = AnimationUtils.loadAnimation(this,
		// R.anim.flipin_reverse);
		// animFlipOutBackward = AnimationUtils.loadAnimation(this,
		// R.anim.flipout_reverse);
	}

	private void SwipeLeft() {
//		flipper.setInAnimation(animFlipInBackward);
//		flipper.setOutAnimation(animFlipOutBackward);
//		flipper.showPrevious();
		flipper.setInAnimation(animSetFlipInBackward);
		flipper.setOutAnimation(animSetFlipOutBackward);
		flipper.showPrevious();

	}

	private void SwipeRight() {
//		flipper.setInAnimation(animFlipInForward);
//		flipper.setOutAnimation(animFlipOutForward);
//		flipper.showNext();
		flipper.setInAnimation(animSetFlipInForward);
		flipper.setOutAnimation(animSetFlipOutForward);
		flipper.showNext();
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		// TODO Auto-generated method stub
		return gestureDetector.onTouchEvent(event);
	}

	SimpleOnGestureListener simpleOnGestureListener = new SimpleOnGestureListener() {

		@Override
		public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
				float velocityY) {

			float sensitvity = 50;
			if ((e1.getX() - e2.getX()) > sensitvity) {
				SwipeLeft();
			} else if ((e2.getX() - e1.getX()) > sensitvity) {
				SwipeRight();
			}

			return true;
		}

	};

	GestureDetector gestureDetector = new GestureDetector(getBaseContext(),
			simpleOnGestureListener);

}
Реклама