ViewFlipper的使用---自动播放(轮播图)的实现以及多个view进行切换

一、 ViewFlipper的简介 

 
  
java.lang.Object
android.view.View
android.view.ViewGroup
android.widget.FrameLayout
android.widget.ViewAnimator
android.widget.ViewFlipper

一个View的容器类,继承于ViewAnimator类,可以根据手势滑动进行页面的切换(即多个view进行切换),也可以设定时间间隔使其自动播放(即轮播图)。

SimpleViewAnimator that will animate between two or more views that have been added to it. Only one child is shown at a time. If requested, can automatically flip between each child at a regular interval.

意思就是说ViewFlipper中可以添加两个或多个view并在它们之间进行切换。在每个时刻只能展示其中一个view。如果有需要的话,可以设定一定的时间间隔使它们自动播放。

二、常用的一些方法

addView(view)添加view

removeView(view)删除view

setInAnimation(Context context, int resourceID)设置进入时的动画

setOutAnimation(Context context, int resourceID)     设置滑出时的动画

showNext()展示下一个view

showPrevious()展示上一个view

getDisplayedChild()得到当前正在展示的view的索引值,范围是0 -- n-1

getChildAt(index)得到index处的view

getChildCount()得到总view数,即多少个页面

setFlipInterval(int milliseconds) 设置自动播放时的时间间隔

setAutoStart(false)设置是否为自动播放

isFlipping()  Returns true if the child views are flipping 如果子view正在滑动返回true

startFlipping()  Start a timer to cycle through child views   开始进行切换

stopFlipping()  No more flips  停止切换

三、 多个view进行切换的实现

3.1  xml布局

activity_main.xml

view_flipper.xml

3.2 主要代码

package com.example.viewflipperdemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.View.OnTouchListener;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
import android.widget.ViewFlipper;
import android.widget.ImageView.ScaleType;

public class MainActivity extends Activity implements OnGestureListener,
		OnTouchListener {
	/**flipper控件*/
	private ViewFlipper flipper;
	/**手势识别器*/
	private GestureDetector detector;
	/**用于放置在flipper中的6张图片*/
	private int[] imgs = { R.drawable.h1, R.drawable.h2, R.drawable.h3,
			R.drawable.h4, R.drawable.h5, R.drawable.h6 };

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		flipper = (ViewFlipper) findViewById(R.id.flipper);
		flipper.setOnTouchListener(this);// 设置触摸监听
		flipper.setLongClickable(true); // 设置识别长按手势,这样才能实现拖动
		flipper.setAutoStart(false);// 设置自动播放,默认为false,因为这里要手动切换,所以此处不要也行
		detector = new GestureDetector(this);//构造手势识别器对象
		detector.setIsLongpressEnabled(false);// 设置的是手势识别6个方法中onLongPress方法不执行,即长按不可用
		addFlipperView();
		int total = flipper.getChildCount();// viewFlipper中包含的View数
	}

	/**
	 * 向ViewFlipper中动态添加View
	 */
	private void addFlipperView() {
		for (int i = 0; i < imgs.length; i++) {
			View view = LayoutInflater.from(this).inflate(
					R.layout.view_flipper, null);
			ImageView iv = (ImageView) view.findViewById(R.id.view_image);
			iv.setImageResource(imgs[i]);
			iv.setScaleType(ScaleType.CENTER_INSIDE);
			flipper.addView(view);
		}
	}

	/**
	 * OnTouchListener接口中的方法
	 */
	@Override
	public boolean onTouch(View v, MotionEvent event) {
		return detector.onTouchEvent(event);
	}

	/**
	 * OnGestureListener接口中的方法
	 */
	@Override
	public boolean onDown(MotionEvent e) {
		return false;
	}

	/**
	 * OnGestureListener接口中的方法
	 */
	@Override
	public void onShowPress(MotionEvent e) {
	}

	/**
	 * OnGestureListener接口中的方法
	 */
	@Override
	public boolean onSingleTapUp(MotionEvent e) {
		return false;
	}

	/**
	 * OnGestureListener接口中的方法。
	 * onScroll(),只要手指移动就会执行。他不会执行MotionEvent.ACTION_UP。 onScroll通常用来实现放大缩小和移动。
	 */
	@Override
	public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
			float distanceY) {
		return false;
	}

	/**
	 * OnGestureListener接口中的方法。 
	 * 长按屏幕事件。
	 */
	@Override
	public void onLongPress(MotionEvent e) {
		Toast.makeText(this, "长按了!!", 0).show();
	}

	/**
	 * OnGestureListener接口中的方法。
	 * onFling()是甩,这个甩的动作是在一个MotionEvent.ACTION_UP(手指抬起)发生时执行。
	 * onFling通常用来实现翻页效果。
	 */
	@Override
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
		int index = flipper.getDisplayedChild();// index是被滑走的那个View的索引值,index范围是0---total-1.
		ImageView iv = (ImageView) flipper.getChildAt(index).findViewById(
				R.id.view_image);
		if (e1.getX() > e2.getX()) {
			flipper.setInAnimation(this, R.anim.slide_left_in);
			flipper.setOutAnimation(this, R.anim.slide_left_out);
			flipper.showNext();
		} else if (e2.getX() > e1.getX()) {
			flipper.setInAnimation(this, R.anim.slide_right_in);
			flipper.setOutAnimation(this, R.anim.slide_right_out);
			flipper.showPrevious();
		} else {
			return false;
		}
		return true;
	}

}

3.3 用到的动画,在res文件夹下面新建anim文件夹,然后分别创建slide_left_in.xml,slide_left_out.xml,slide_right_in.xml,slide_right_out.xml,用来实现划入划出时的动画效果

slide_left_in.xml,


slide_left_out.xml,


slide_right_in.xml,


slide_right_out.xml,


位置2为主屏幕所在的位置,3为左边的view的位置,1为右边的view的位置。3者都以左上角的坐标为准。2的坐标为0。3的坐标为-100%p。1的坐标为100%p。
ViewFlipper的使用---自动播放(轮播图)的实现以及多个view进行切换_第1张图片

3.4 主要代码解释

/**
* OnTouchListener接口中的方法
* 当触摸屏幕时,首先调用的是OnTouchListener中的onTouch方法
* 为了直接调用手势识别器中的onTouchEvent方法,
* 此处返回detector的onTouchEvent的返回值
*/
@Override
public boolean onTouch(View v, MotionEvent event) {
return detector.onTouchEvent(event);
}


四、 轮播图的实现

将上面项目中的MainActivity.java代码中添加两行代码即可实现自动轮播

flipper.setFlipInterval(3000);//设置自动播放的时间间隔为3S
flipper.setAutoStart(true);//设置自动播放


五、 项目链接

ViewFlipper的三个小例子

你可能感兴趣的:(Android笔记)