Android实现图片自动轮播并且支持手势左右无限滑动
废话不多说了,先给大家上左右无限滑动的代码了。
1.左右无限滑动
publicclassMainActivityextendsAppCompatActivity{ privatestaticViewPagerviewPager; privateRadioGroupgroup; //图片资源,实际项目需要从网络获取 privateint[]imageIds={R.drawable.ym1,R.drawable.ym2,R.drawable.ym3,R.drawable.ym4}; //存放图片的数组 privateList<ImageView>mList; //当前索引位置以及上一个索引位置 privatestaticintindex=0,preIndex=0; //是否需要轮播标志 privatebooleanisContinue=true; //定时器,用于实现轮播 privateTimertimer=newTimer(); privateMyHandlermHandler; publicstaticclassMyHandlerextendsHandler{ privateWeakReference<MainActivity>weakReference; publicMyHandler(MainActivityactivity){ weakReference=newWeakReference<>(activity); } @Override publicvoidhandleMessage(Messagemsg){ if(weakReference.get()!=null){ index++; viewPager.setCurrentItem(index); } super.handleMessage(msg); } } @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); addListener(); //让当前图片位于中间某个位置,目的就是为了开始能够左滑 viewPager.setCurrentItem(imageIds.length*100); initRadioButton(imageIds.length);//注意这句和上面那句顺序不能写反,否则会出现第一个圆点无法显示选中状态 startSwitch(); } /** *初始化控件 */ publicvoidinitView(){ viewPager=(ViewPager)findViewById(R.id.viewpager); group=(RadioGroup)findViewById(R.id.group); } /** *初始化数据 */ publicvoidinitData(){ mList=newArrayList<>(); viewPager.setAdapter(pagerAdapter); mHandler=newMyHandler(this); } /** *添加监听 */ publicvoidaddListener(){ viewPager.addOnPageChangeListener(onPageChangeListener); viewPager.setOnTouchListener(onTouchListener); } /** *进行图片轮播 */ publicvoidstartSwitch(){ //执行定时任务 timer.schedule(newTimerTask(){ @Override publicvoidrun(){ //首先判断是否需要轮播,是的话我们才发消息 if(isContinue){ mHandler.sendEmptyMessage(1); } } },3000,3500);//延迟3秒,每隔3.5秒发一次消息; } /** *根据图片个数初始化按钮 *@paramlength图片所在集合长度 */ privatevoidinitRadioButton(intlength){ for(inti=0;i<length;i++){ ImageViewimageview=newImageView(this); imageview.setImageResource(R.drawable.rg_selector);//设置背景选择器 imageview.setPadding(20,0,0,0);//设置每个按钮之间的间距 //将按钮依次添加到RadioGroup中 group.addView(imageview,ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); //默认选中第一个按钮,因为默认显示第一张图片 group.getChildAt(0).setEnabled(false); } } /** *根据当前触摸事件判断是否要轮播 */ View.OnTouchListeneronTouchListener=newView.OnTouchListener(){ @Override publicbooleanonTouch(Viewv,MotionEventevent){ switch(event.getAction()){ //手指按下和划动的时候停止图片的轮播 caseMotionEvent.ACTION_DOWN: caseMotionEvent.ACTION_MOVE: isContinue=false; break; default: isContinue=true; } returnfalse;//注意这里只能返回false,如果返回true,Dwon就会消费掉事件,MOVE无法获得事件, //导致图片无法滑动 } }; /** *根据当前选中的页面设置按钮的选中 */ ViewPager.OnPageChangeListeneronPageChangeListener=newViewPager.OnPageChangeListener(){ @Override publicvoidonPageScrolled(intposition,floatpositionOffset,intpositionOffsetPixels){ } @Override publicvoidonPageSelected(intposition){ index=position;//当前位置赋值给索引 setCurrentDot(index%imageIds.length);//因为只有四个按钮,所以我们在此要对长度区域,保证范围在0到4 } @Override publicvoidonPageScrollStateChanged(intstate){ } }; /** *设置对应位置按钮的状态 *@parami当前位置 */ privatevoidsetCurrentDot(inti){ if(group.getChildAt(i)!=null){ group.getChildAt(i).setEnabled(false);//当前按钮选中,显示蓝色 } if(group.getChildAt(preIndex)!=null){ group.getChildAt(preIndex).setEnabled(true);//上一个取消选中。显示灰色 preIndex=i;//当前位置变为上一个,继续下次轮播 } } PagerAdapterpagerAdapter=newPagerAdapter(){ @Override publicintgetCount(){ //返回一个比较大的值,目的是为了实现无限轮播 returnInteger.MAX_VALUE; } @Override publicbooleanisViewFromObject(Viewview,Objectobject){ returnview==object; } @Override publicObjectinstantiateItem(ViewGroupcontainer,intposition){ position=position%imageIds.length;//因为position非常大,而我们需要的position不能大于图片集合长度 //所以在此取余 ImageViewimageView=newImageView(MainActivity.this); imageView.setImageResource(imageIds[position]); imageView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(imageView); mList.add(imageView); returnimageView; } @Override publicvoiddestroyItem(ViewGroupcontainer,intposition,Objectobject){ //注意在此不要做任何操作,因为我们需要实现向左滑动,否则会产生IndexOutOfBoundsException } }; @Override protectedvoidonDestroy(){ super.onDestroy(); //页面销毁的时候取消定时器 if(timer!=null){ preIndex=0; timer.cancel(); } } }
2.单向滑动
publicclassMainActivityextendsAppCompatActivity{ privatestaticViewPagerviewPager; privateRadioGroupgroup; //图片资源,实际项目需要从网络获取 privateint[]imageIds={R.drawable.ym1,R.drawable.ym2,R.drawable.ym3,R.drawable.ym4}; //存放图片的数组 privateList<ImageView>mList; //当前索引位置以及上一个索引位置 privatestaticintindex=0,preIndex=0; //是否需要轮播标志 privatebooleanisContinue=true; //定时器,用于实现轮播 privateTimertimer=newTimer(); privateMyHandlermHandler; publicstaticclassMyHandlerextendsHandler{ privateWeakReference<MainActivity>weakReference; publicMyHandler(MainActivityactivity){ weakReference=newWeakReference<>(activity); } @Override publicvoidhandleMessage(Messagemsg){ if(weakReference.get()!=null){ index++; viewPager.setCurrentItem(index); } super.handleMessage(msg); } } @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); addListener(); initRadioButton(imageIds.length); startSwitch(); } /** *初始化控件 */ publicvoidinitView(){ viewPager=(ViewPager)findViewById(R.id.viewpager); group=(RadioGroup)findViewById(R.id.group); } /** *初始化数据 */ publicvoidinitData(){ mList=newArrayList<>(); viewPager.setAdapter(pagerAdapter); mHandler=newMyHandler(this); } /** *添加监听 */ publicvoidaddListener(){ viewPager.addOnPageChangeListener(onPageChangeListener); viewPager.setOnTouchListener(onTouchListener); } /** *进行图片轮播 */ publicvoidstartSwitch(){ //执行定时任务 timer.schedule(newTimerTask(){ @Override publicvoidrun(){ //首先判断是否需要轮播,是的话我们才发消息 if(isContinue){ mHandler.sendEmptyMessage(1); } } },3000,3500);//延迟3秒,每隔3.5秒发一次消息; } /** *根据图片个数初始化按钮 *@paramlength图片所在集合长度 */ privatevoidinitRadioButton(intlength){ for(inti=0;i<length;i++){ ImageViewimageview=newImageView(this); imageview.setImageResource(R.drawable.rg_selector);//设置背景选择器 imageview.setPadding(20,0,0,0);//设置每个按钮之间的间距 //将按钮依次添加到RadioGroup中 group.addView(imageview,ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); //默认选中第一个按钮,因为默认显示第一张图片 group.getChildAt(0).setEnabled(false); } } /** *根据当前触摸事件判断是否要轮播 */ View.OnTouchListeneronTouchListener=newView.OnTouchListener(){ @Override publicbooleanonTouch(Viewv,MotionEventevent){ switch(event.getAction()){ //手指按下和划动的时候停止图片的轮播 caseMotionEvent.ACTION_DOWN: caseMotionEvent.ACTION_MOVE: isContinue=false; break; default: isContinue=true; } returnfalse;//注意这里只能返回false,如果返回true,Dwon就会消费掉事件,MOVE无法获得事件, //导致图片无法滑动 } }; /** *根据当前选中的页面设置按钮的选中 */ ViewPager.OnPageChangeListeneronPageChangeListener=newViewPager.OnPageChangeListener(){ @Override publicvoidonPageScrolled(intposition,floatpositionOffset,intpositionOffsetPixels){ } @Override publicvoidonPageSelected(intposition){ index=position;//当前位置赋值给索引 setCurrentDot(index%imageIds.length);//因为只有四个按钮,所以我们在此要对长度区域,保证范围在0到4 } @Override publicvoidonPageScrollStateChanged(intstate){ } }; /** *设置对应位置按钮的状态 *@parami当前位置 */ privatevoidsetCurrentDot(inti){ if(group.getChildAt(i)!=null){ group.getChildAt(i).setEnabled(false);//当前按钮选中,显示蓝色 } if(group.getChildAt(preIndex)!=null){ group.getChildAt(preIndex).setEnabled(true);//上一个取消选中。显示灰色 preIndex=i;//当前位置变为上一个,继续下次轮播 } } PagerAdapterpagerAdapter=newPagerAdapter(){ @Override publicintgetCount(){ //返回一个比较大的值,目的是为了实现无限轮播 returnInteger.MAX_VALUE; } @Override publicbooleanisViewFromObject(Viewview,Objectobject){ returnview==object; } @Override publicObjectinstantiateItem(ViewGroupcontainer,intposition){ position=position%imageIds.length;//因为position非常大,而我们需要的position不能大于图片集合长度 //所以在此取余 ImageViewimageView=newImageView(MainActivity.this); imageView.setImageResource(imageIds[position]); imageView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(imageView); mList.add(imageView); returnimageView; } @Override publicvoiddestroyItem(ViewGroupcontainer,intposition,Objectobject){ container.removeView(mList.get(position)); } }; @Override protectedvoidonDestroy(){ super.onDestroy(); //页面销毁的时候取消定时器 if(timer!=null){ preIndex=0; index=0; timer.cancel(); } } }
3.加入一张图片的判断(最终版)
publicclassMainActivityextendsAppCompatActivity{ privatestaticViewPagerviewPager; privateRadioGroupgroup; //图片资源,实际项目需要从网络获取 //privateint[]imageIds={R.drawable.ym1,R.drawable.ym2,R.drawable.ym3,R.drawable.ym4}; privateint[]imageIds={R.drawable.ym1}; //存放图片的数组 privateList<ImageView>mList; //当前索引位置以及上一个索引位置 privatestaticintindex=0,preIndex=0; //是否需要轮播标志 privatebooleanisContinue=true; //定时器,用于实现轮播 privateTimertimer=newTimer(); privateMyHandlermHandler; publicstaticclassMyHandlerextendsHandler{ privateWeakReference<MainActivity>weakReference; publicMyHandler(MainActivityactivity){ weakReference=newWeakReference<>(activity); } @Override publicvoidhandleMessage(Messagemsg){ if(weakReference.get()!=null){ index++; viewPager.setCurrentItem(index); } super.handleMessage(msg); } } @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); addListener(); initRadioButton(imageIds.length);//注意这句和上面那句顺序不能写反,否则会出现第一个圆点无法显示选中状态 startSwitch(); } /** *初始化控件 */ publicvoidinitView(){ viewPager=(ViewPager)findViewById(R.id.viewpager); group=(RadioGroup)findViewById(R.id.group); } /** *初始化数据 */ publicvoidinitData(){ mList=newArrayList<>(); viewPager.setAdapter(pagerAdapter); mHandler=newMyHandler(this); } /** *添加监听 */ publicvoidaddListener(){ viewPager.addOnPageChangeListener(onPageChangeListener); viewPager.setOnTouchListener(onTouchListener); } /** *进行图片轮播 */ publicvoidstartSwitch(){ //执行定时任务 timer.schedule(newTimerTask(){ @Override publicvoidrun(){ //首先判断是否需要轮播,是的话我们才发消息 if(isContinue){ if(imageIds.length!=1)//多于一张图片才轮播 mHandler.sendEmptyMessage(1); } } },3000,3500);//延迟3秒,每隔3.5秒发一次消息; } /** *根据图片个数初始化按钮 *@paramlength图片所在集合长度 */ privatevoidinitRadioButton(intlength){ for(inti=0;i<length;i++){ ImageViewimageview=newImageView(this); if(length==1){ imageview.setVisibility(View.GONE); return; } imageview.setImageResource(R.drawable.rg_selector);//设置背景选择器 imageview.setPadding(20,0,0,0);//设置每个按钮之间的间距 //将按钮依次添加到RadioGroup中 group.addView(imageview,ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); //默认选中第一个按钮,因为默认显示第一张图片 group.getChildAt(0).setEnabled(false); } } /** *根据当前触摸事件判断是否要轮播 */ View.OnTouchListeneronTouchListener=newView.OnTouchListener(){ @Override publicbooleanonTouch(Viewv,MotionEventevent){ switch(event.getAction()){ //手指按下和划动的时候停止图片的轮播 caseMotionEvent.ACTION_DOWN: caseMotionEvent.ACTION_MOVE: isContinue=false; break; default: isContinue=true; } if(imageIds.length==1){ returntrue;//1张图片不允许滑动 } returnfalse;//注意这里只能返回false,如果返回true,Dwon就会消费掉事件,MOVE无法获得事件, //导致图片无法滑动 } }; /** *根据当前选中的页面设置按钮的选中 */ ViewPager.OnPageChangeListeneronPageChangeListener=newViewPager.OnPageChangeListener(){ @Override publicvoidonPageScrolled(intposition,floatpositionOffset,intpositionOffsetPixels){ } @Override publicvoidonPageSelected(intposition){ index=position;//当前位置赋值给索引 setCurrentDot(index%imageIds.length);//因为只有四个按钮,所以我们在此要对长度区域,保证范围在0到4 } @Override publicvoidonPageScrollStateChanged(intstate){ } }; /** *设置对应位置按钮的状态 *@parami当前位置 */ privatevoidsetCurrentDot(inti){ if(group.getChildAt(i)!=null){ group.getChildAt(i).setEnabled(false);//当前按钮选中,显示蓝色 } if(group.getChildAt(preIndex)!=null){ group.getChildAt(preIndex).setEnabled(true);//上一个取消选中。显示灰色 preIndex=i;//当前位置变为上一个,继续下次轮播 } } PagerAdapterpagerAdapter=newPagerAdapter(){ @Override publicintgetCount(){ //返回一个比较大的值,目的是为了实现无限轮播 returnInteger.MAX_VALUE; } @Override publicbooleanisViewFromObject(Viewview,Objectobject){ returnview==object; } @Override publicObjectinstantiateItem(ViewGroupcontainer,intposition){ position=position%imageIds.length;//因为position非常大,而我们需要的position不能大于图片集合长度 //所以在此取余 ImageViewimageView=newImageView(MainActivity.this); imageView.setImageResource(imageIds[position]); imageView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(imageView); mList.add(imageView); returnimageView; } @Override publicvoiddestroyItem(ViewGroupcontainer,intposition,Objectobject){ //注意在此不要做任何操作,因为我们需要实现向左滑动,否则会产生IndexOutOfBoundsException container.removeView(mList.get(position)); } }; @Override protectedvoidonDestroy(){ super.onDestroy(); //页面销毁的时候取消定时器 if(timer!=null){ preIndex=0; index=0; timer.cancel(); } } }
以上所述是小编给大家介绍的Android实现图片自动轮播并且支持手势左右无限滑动,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!