首先總結一下大體思路就是通過一個ViewPager來進行無限的自動滑動來達到我們想要的實現的輪播圖效果
首先先寫UI
<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.viewpager.widget.ViewPager android:layout_width="match_parent" android:layout_height="200dp" android:id="@+id/viewpager"/> </LinearLayout>
在上面的布局文件中我們只寫了一個ViewPager控件,實現簡單的輪播圖效果(沒有小圓點滑動)這一個控件就夠了
然后我們在MainActivity中來對ViewPager進行實例化
public class MainActivity extends AppCompatActivity[ private ViewPager mViewPager; private ViewPagerAdapter adapter; private List dates; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView(){ mViewPager=findViewById(R.id.view_pager); adapter=new MyViewAdapter(this,datas); mViewPager.setAdapter(adapter); } }
我們在上面設置了我們的ViewPager的適配器,所以我們下面也要來自己創建一個ViewPager的適配器
public class ViewPagerAdapter extends PagerAdapter { //我們存放圖片的數據集合 private List<Integer> dates; private Context context; public ViewPagerAdapter( Context context,List datas) { this.dates=dates; this.context = context; } public void setDates(List dates) { this.dates = dates; } //這個方法返回的是我們的ViewPager可以滑動多少次 @Override public int getCount() { //返回個數為int的最大值 那么就可以滑動很多很多次 return dates==null ?0:Integer.MAX_VALUE; } @Override public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { return view==object; } //每一次滑動都會調用下面這個方法 @NonNull @Override public Object instantiateItem(@NonNull ViewGroup container, int position) { //為了實現無限滑動而防止數組越界 我們可以通過下面這行代碼來實現我們想要的功能 int newPosition=position%dates.size(); ImageView imageView=new ImageView(context); imageView.setBackgroundColor(dates.get(newPosition)); container.addView(imageView); return imageView; } //銷毀試圖 @Override public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { container.removeView((View) object); } public int getDatasSize(){ return dates.size(); } }
然后我們更改MainActivity中的代碼 來創建一個handler來實現無限滑動
public class MainActivity extends AppCompatActivity { private ViewPager viewPager; private List<Integer> dates=new ArrayList<>(5); private ViewPagerAdapter adapter; //創建一個handler private Handler mHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); //添加數據集合 Random random=new Random(); for(int i=0;i<=5;i++){ dates.add(Color.argb(random.nextInt(255),random.nextInt(255),random.nextInt(255),random.nextInt(255))); } adapter.setDates(dates); //我們先設置適配器后填充的數據 那么我們就要通知適配器我們的數據更改了 adapter.notifyDataSetChanged(); //設置不是從第一個開始並且關閉滑動動畫那么剛開始就可以左右滑動 viewPager.setCurrentItem(adapter.getDatasSize()*100,false); //完成對handler的實例化 mHandler=new Handler(); } //當窗口處於后台的時候 @Override public void onDetachedFromWindow() { //停止handler任務 mHandler.removeCallbacks(lopperTask); } //當視圖和窗口綁定的時候 @Override public void onAttachedToWindow() { //開始handler任務 mHandler.post(lopperTask); } //無限自動循環ViewPager的任務 private Runnable lopperTask=new Runnable() { @Override public void run() { //獲取當前的視圖位置 int currentItem = viewPager.getCurrentItem(); //設置下一個視圖位置 viewPager.setCurrentItem(++currentItem,true); //一秒后重新執行這個任務 mHandler.postDelayed(this,1000); } }; private void initView() { viewPager = findViewById(R.id.view_pager); adapter=new ViewPagerAdapter(this); viewPager.setAdapter(adapter); } }