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

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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值