ViewFlipper的介绍
ViewFlipper是一个切换控件,本质是一个FrameLayout,所以可以添加子控件,让这些子控件有切换效果并可以设置切换动画。可以用来做轮播图、跑马灯等效果。
ViewFlipper的基本方法
在xml布局中的方法介绍:
android:autoStart: 设置自动加载下一个View
android:flipInterval:设置View之间切换的时间间隔
android:inAnimation: 设置切换View的进入动画
android:outAnimation:设置切换View的退出动画
在代码中也可以设置:
isFlipping: 判断View切换是否正在进行
setFilpInterval:设置View之间切换的时间间隔
startFlipping: 开始View的切换,而且会循环进行
stopFlipping: 停止View的切换
setOutAnimation:设置切换View的退出动画
setInAnimation: 设置切换View的进入动画
showNext: 显示ViewFlipper里的下一个View
showPrevious: 显示ViewFlipper里的上一个View
getCurrentView() 获取当前展示的View
实战
写一个简单的轮播图功能,只需要在ViewFilpper添加ImageView控件来显示图片,并设置切换动画,这样实现自动滑动。手动滑动可以借助手势来实现。代码如下:
public class MainActivity extends AppCompatActivity {
private ViewFlipper viewFlipper;
private GestureDetectorCompat gestureDetectorCompat;
private boolean isSlide = false;
private boolean currentDirection = true;
private boolean preDirection = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewFlipper = (ViewFlipper) findViewById(R.id.viewFilter);
addImageView(R.mipmap.banner1);
addImageView(R.mipmap.banner2);
addImageView(R.mipmap.banner3);
switchAnimation(true, true);
viewFlipper.setClickable(true);//不设置这个在手势里就不会响应(onFling、onScroll、双击事件)
viewFlipper.setLongClickable(true);
gestureDetectorCompat = new GestureDetectorCompat(this, new GestureListener());
viewFlipper.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureDetectorCompat.onTouchEvent(event);
}
});
}
private class GestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
Log.d("lx", "velocityX" + velocityX + ";velocityY" + velocityY + "isFlipping" + viewFlipper.isFlipping());
if (isSlide == false) {
if (e1.getX() - e2.getX() > 20 && Math.abs(velocityX) > 0) {
switchAnimation(false, true);
viewFlipper.showNext();
}
if (e2.getX() - e1.getX() > 20 && Math.abs(velocityX) > 0) {
switchAnimation(false, false);
viewFlipper.showPrevious();
}
}
Log.d("lx", "onFling");
return super.onFling(e1, e2, velocityX, velocityY);
}
}
/**
* 动画是否从右到左
* true 从右到左,false 从左到右
*
* @param right_to_left
*/
private void switchAnimation(boolean isFirst, final boolean right_to_left) {
//preDirection=currentDirection;
// currentDirection=right_to_left;
// if(isFirst||(isFirst==false&&preDirection!=currentDirection)) {
if (right_to_left) {
viewFlipper.clearAnimation();
Animation in = AnimationUtils.loadAnimation(MainActivity.this, R.anim.anim_in);
Animation out = AnimationUtils.loadAnimation(MainActivity.this, R.anim.anim_out);
viewFlipper.setOutAnimation(out);
viewFlipper.setInAnimation(in);
} else {
viewFlipper.clearAnimation();
Animation in = AnimationUtils.loadAnimation(MainActivity.this, R.anim.anim_in_);
Animation out = AnimationUtils.loadAnimation(MainActivity.this, R.anim.anim_out_);
viewFlipper.setOutAnimation(out);
viewFlipper.setInAnimation(in);
}
if (viewFlipper.getInAnimation() != null) {
viewFlipper.getInAnimation().setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
isSlide = true;
}
@Override
public void onAnimationEnd(Animation animation) {
Log.d("lx", "onAnimationEnd"+right_to_left);
isSlide = false;
if (right_to_left == false) {
switchAnimation(false,true);
}
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
}
// }
}
private void addImageView(int resid) {
ImageView imageView = new ImageView(this);
imageView.setImageResource(resid);
imageView.setAdjustViewBounds(true);
ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
viewFlipper.addView(imageView, layoutParams);
}
@Override
protected void onStart() {
super.onStart();
viewFlipper.startFlipping();
}
@Override
protected void onStop() {
super.onStop();
viewFlipper.stopFlipping();
}
}
总结
ViewFlipper的用法比较简单,如有问题,欢迎在下方留言参与讨论。