一、 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,
3.4 主要代码解释
/**
* OnTouchListener接口中的方法
* 当触摸屏幕时,首先调用的是OnTouchListener中的onTouch方法
* 为了直接调用手势识别器中的onTouchEvent方法,
* 此处返回detector的onTouchEvent的返回值
*/
@Override
public boolean onTouch(View v, MotionEvent event) {
return detector.onTouchEvent(event);
}
四、 轮播图的实现
将上面项目中的MainActivity.java代码中添加两行代码即可实现自动轮播
五、 项目链接
ViewFlipper的三个小例子