这篇文章主要介绍了Android中iewpager实现循环轮播效果的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
在网上看到很多利用viewpager实现轮播都是通过设置一个很大的值,让viewpager开始显示在这个数值区间的中间,但这种轮播个人感觉不是真正的轮播,因此自己实现了一个轮播的效果。大致思路是这样的,假如有5张图adcde是要轮播展示的,这时创建一个新的集合eadcdea,然后再让viewpager设置当前展示第一张图,也就是显示a。这样当往左滑时显示的是e,此时设置viewpager.setCurrentItem(5),当右滑到e的时候在往右滑,此时设置viewpager.setCurrentItem(1),这样就实现了轮播效果。
效果图如下所示:
话不多说上一下代码:
/** * viewpager切换页面时动画 */ public class MainActivity extends AppCompatActivity { private ViewPager viewPager; private ViewPaagerAdapter adapter; private ArrayList<View> viewlist=new ArrayList<>();//承载图片 private ArrayList<TextView> tvList=new ArrayList<>();//底部圆点集合 private int []imgList={R.drawable.img8,R.drawable.img1,R.drawable.img2,R.drawable.img3,R.drawable.img4,R.drawable.img5, R.drawable.img6, R.drawable.img7,R.drawable.img8,R.drawable.img1};//图片数组 boolean isStop=false; private LinearLayout line;//小圆圈父视图 private ScheduledThreadPoolExecutor executor; private int currentPage; private Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 1: viewPager.setCurrentItem(msg.arg1); break; default: break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); supportRequestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); viewPager= (ViewPager) findViewById(mybanner_viewpager); line= (LinearLayout) findViewById(R.id.line); setView();//设置轮播显示的底图 adapter=new ViewPaagerAdapter(this,viewlist); viewPager.setAdapter(adapter); viewPager.setCurrentItem(1); viewPager.setOffscreenPageLimit(10);//加这个是为了防止第一张往左滑动会出现闪烁 startService();//启动轮播 viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(final int position, float positionOffset, int positionOffsetPixels) { Log.i("tag","位置"+position+"positionOffset"+positionOffset+"positionOffsetPixels"+positionOffsetPixels); Log.i("tag","weizhi"+viewPager.getCurrentItem()); if (position==imgList.length-1) { viewPager.setCurrentItem(1,false); }else if(viewPager.getCurrentItem()==0&& positionOffsetPixels==0) { viewPager.setCurrentItem(imgList.length-2, false); } currentPage=viewPager.getCurrentItem(); } @Override public void onPageSelected(final int position) { Log.i("tag","位置wwwww"+position); setEnbale(); if (position==imgList.length-1) { tvList.get(0).setEnabled(true); } else if (position==0) { tvList.get(imgList.length-3).setEnabled(true); } else{ tvList.get(position-1).setEnabled(true); } } @Override public void onPageScrollStateChanged(int state) { } }); } public void setView() { LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(15,15); params.leftMargin=10; params.rightMargin=10; for (int i = 0; i < imgList.length; i++) { View view= LayoutInflater.from(this).inflate(R.layout.layout,null,false); ImageView img= (ImageView) view.findViewById(R.id.img); img.setBackgroundResource(imgList[i]); TextView textView= (TextView) view.findViewById(R.id.tv); textView.setText(i+""); viewlist.add(view); } for (int i = 0; i < imgList.length-2; i++) { TextView view=new TextView(this); view.setBackgroundResource(R.drawable.item); view.setLayoutParams(params); view.setEnabled(false); line.addView(view); tvList.add(view); } tvList.get(0).setEnabled(true); } public void setEnbale(){ for (TextView tvcycle: tvList) { tvcycle.setEnabled(false); } } /** * 启动线程池开启循环任务 */ public void startService(){ executor=new ScheduledThreadPoolExecutor(1); executor.scheduleWithFixedDelay(runnable,1,2, TimeUnit.SECONDS); } /** * 停止任务 */ public void stopService(){ executor.shutdown(); } Runnable runnable=new Runnable() { @Override public void run() { currentPage=currentPage+1%10; Message message= Message.obtain(); message.what=1; message.arg1=currentPage; handler.sendMessage(message); } }; @Override protected void onDestroy() { super.onDestroy(); stopService(); } }郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。