【实训】自动横向循环滑动图片控件的实现

嗯,应该在看很多软件的时候,能看到有个推荐栏一直在滚动推荐内容是吧,可能在刚刚看到的时候,觉得这个肯定很好做。但是我实际做的时候发现了很多的问题,比如在滚动到最后一个时如果直接跳到第一个未免太过突兀了,也没有动画效果,强行加上动画效果的结果就是从最后一直向前,滚到第一个,这个可不是我们需要的效果。我们需要的效果是这种(不会做gif,讲究着看吧)



循环滑动

其实原理也很简单,网上其他教程也写的很详细,以下为解释

假如我们要显示12345,共5张图


如果我们现在只考虑向右滑动,显示顺序如下


               1   2   3   4   5   1

                            ↑                                           ↓

                              ————————————

就是在最后一张5的后面加上1,当向右滑倒最后5时,继续向右,滑到1(其实不是真正的1),然后立即跳转到第一个1(真正的1),然后就可以继续向右到2。。。这样向右滑动就很连贯,不突兀


如果我们现在要加上向左滑动,显示顺序变成这样:


                         ————————————

                        ↑                                          ↓


             5   1   2   3   4   5   1

                                 ↑                                           ↓

                                  ————————————

和向右同样的原理,在第一张1前加上5,当滑到1时,继续向左滑,滑到5(不是真正的5),然后立即跳转到最后的5(真正的5)。


这样在序列前后分别加上最后一张和第一张图片就能连贯地实现左右循环滑动。但这个做法实际是有个问题的,就是新添加的2个view仍然不是真正的那个view,图片循环滑动不明显,其实当做fragment的滑动时,就不能这么做了,具体我也不知道很好的做法,如果有dalao懂的希望能分享下。


代码(部分)的关键就是在监听器上下点功夫(注意在views数量小于3时,不跳转,其实就是只显示一张图片的时候):

viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                @Override
                public void onPageSelected(int position) {
                    if (processpage != null && views.size() > 3)
                        if (position > 0 && position < views.size() - 1)
                            processpage.pageSelected(position - 1);
                        else if (position == 0) processpage.pageSelected(views.size() - 3);
                        else if (position == views.size() - 1) processpage.pageSelected(0);
                }

                public void onPageScrolled(int position, float positionOffset,
                                           int positionOffsetPixels) {
                    if (positionOffset == 0.0 && views.size() > 3) {//完全切换完后跳转
                        if (position == 0) viewPager.setCurrentItem(views.size() - 2, false);
                        if (position == views.size() - 1) viewPager.setCurrentItem(1, false);
                    }
                }

                public void onPageScrollStateChanged(int state) {
                }
            });


自动滑动

自动滑动应该很多人知道如何实现,使用一个Handler即可解决

关键代码:

    private final Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            if (shouldAutoScroll) {
                viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
                handler.sendEmptyMessageDelayed(0, SCROLLER_TIME);
            }
        }
    };

在最后,我整理写好了一个可以直接使用的代码,包含了adapter,listener等

下载


具体使用方法:

private void initTopView() {
    //自己的viewPager设置adapter
	viewPager = (ViewPager) view.findViewById(R.id.sell_top_pager);
	viewPager.setAdapter(new SellMainTopAdapter(activity));

	//设置自动播放viewpager,循环左右切换
	TopScroller topScroller = new TopScroller(context,
			(ViewPager) view.findViewById(R.id.sell_top_pager_ad));
	topScroller.setTime(5000, 500);//第一个参数是滑动间隙,第二个是切换的时间
	List<View> views = new ArrayList<>();
	views.add(view5);
	views.add(view1);
	views.add(view2);
	views.add(view3);
	views.add(view4);
	views.add(view5);
	views.add(view1);
	topScroller.setViews(views);//设置views
	//设置监听器,可以监听滑到哪里了。在这里我是用来根据显示的图片,显示下面的小圆点
	//不需要的可以不写
	topScroller.setProcessPage(new TopScroller.ProcessPage() {
		@Override
		public void pageSelected(int position) {
			mCircleView.setBackgroundResource(R.drawable.tab_sell_circle_light);
			View circleView = mNumLayout.getChildAt(position);
			circleView.setBackgroundResource(R.drawable.tab_sell_circle_dark);
			mCircleView = circleView;
		}
	});
}


在Vue中实现图片自动循环横向滚动,通常可以通过HTML和CSS来构建基本的轮播效果,再利用Vue的数据驱动特性来控制图片的切换。这里给出一个简单的实现方法: 1. HTML结构:你需要一个容器(比如`div`),并在其中放置一个用于显示图片的列表(比如`ul`),列表中包含多个图片项(比如`li`)。 ```html <div id="image-carousel" class="carousel"> <ul class="carousel-list"> <li class="carousel-item" v-for="(image, index) in images" :key="index"> <img :src="image" alt="图片描述"> </li> </ul> </div> ``` 2. CSS样式:设置轮播容器和列表的样式,确保图片能够横向滚动。可以通过`overflow: hidden`和`white-space: nowrap`来实现。 ```css .carousel { position: relative; width: 100%; overflow: hidden; } .carousel-list { display: flex; width: auto; } .carousel-item { margin-right: 20px; /* 控制图片间隔 */ } .carousel-item img { width: 100%; /* 根据需要调整图片宽度 */ display: block; } ``` 3. Vue逻辑:在Vue实例中,定义图片数组和控制滚动的方法。可以使用`setInterval`来实现自动滚动效果。 ```javascript new Vue({ el: '#image-carousel', data: { images: [ 'path/to/image1.jpg', 'path/to/image2.jpg', // 更多图片路径... ], index: 0, intervalId: null }, mounted() { this.startAutoScroll(); }, methods: { startAutoScroll() { this.intervalId = setInterval(() => { this.index++; if (this.index >= this.images.length) { this.index = 0; } this.updateCarouselPosition(); }, 3000); // 3秒切换一次图片 }, updateCarouselPosition() { const carousel = document.querySelector('.carousel-list'); carousel.style.transform = `translateX(${-100 * this.index}%)`; } }, beforeDestroy() { if (this.intervalId) { clearInterval(this.intervalId); } } }); ``` 在这个例子中,我们通过更新`carousel-list`的`transform`属性来改变图片的位置,实现横向滚动。`setInterval`函数每3秒触发一次,使图片列表移动到下一张图片的位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值