ViewFlipper的使用

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的用法比较简单,如有问题,欢迎在下方留言参与讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值