ViewFlipper的使用
ViewFlipper的介绍
ViewFlipper是一个切换控件,本质是一个FrameLayout,所以可以添加子控件,让这些子控件有切换效果并可以设置切换动画。可以用来做轮播图、跑马灯等效果。
ViewFlipper的基本方法
在xml布局中的方法介绍:android:autoStart: 设置自动加载下一个Viewandroid:flipInterval:设置View之间切换的时间间隔android:inAnimation: 设置切换View的进入动画android:outAnimation:设置切换View的退出动画在代码中也可以设置:isFlipping: 判断View切换是否正在进行setFilpInterval:设置View之间切换的时间间隔startFlipping: 开始View的切换,而且会循环进行stopFlipping: 停止View的切换setOutAnimation:设置切换View的退出动画setInAnimation: 设置切换View的进入动画showNext: 显示ViewFlipper里的下一个ViewshowPrevious: 显示ViewFlipper里的上一个ViewgetCurrentView() 获取当前展示的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;@Overrideprotected 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() {@Overridepublic boolean onTouch(View v, MotionEvent event) {return gestureDetectorCompat.onTouchEvent(event);}});}private class GestureListener extends GestureDetector.SimpleOnGestureListener {@Overridepublic 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() {@Overridepublic void onAnimationStart(Animation animation) {isSlide = true;}@Overridepublic void onAnimationEnd(Animation animation) {Log.d("lx", "onAnimationEnd"+right_to_left);isSlide = false;if (right_to_left == false) {switchAnimation(false,true);}}@Overridepublic 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);}@Overrideprotected void onStart() {super.onStart();viewFlipper.startFlipping();}@Overrideprotected void onStop() {super.onStop();viewFlipper.stopFlipping();}
}
总结
ViewFlipper的用法比较简单,如有问题,欢迎在下方留言参与讨论。