Android ViewPager實(shí)現(xiàn)無限循環(huán)效果
最近項(xiàng)目里有用到ViewPager來做廣告運(yùn)營位展示,看到現(xiàn)在很多APP的廣告運(yùn)營位都是無限循環(huán)的,所以就研究了一下這個功能的實(shí)現(xiàn)。
先看看效果
從一個方向上一直滑動,么有滑到盡頭的感覺,具體是怎么實(shí)現(xiàn)的呢?看下面的思路。
實(shí)現(xiàn)思路
此處畫了一幅圖來表達(dá)實(shí)現(xiàn)無限循環(huán)的思路,即在數(shù)據(jù)起始位置前插入最后一項(xiàng)數(shù)據(jù),在最后一項(xiàng)數(shù)據(jù)后插入第一項(xiàng)數(shù)據(jù),當(dāng)滑動到此處時,更新頁面的索引位置就ok了 。
代碼實(shí)現(xiàn)
這個方法用于數(shù)據(jù)處理,其中mediaList是原始數(shù)據(jù),newMediaList是處理完的數(shù)據(jù),mMediaList是用于頁面顯示的數(shù)據(jù)。
public void initItemList(List<MediaIntro> mediaList){ List<MediaIntro> newMediaList = new ArrayList<MediaIntro>(); newMediaList.addAll(mediaList); if(newMediaList.size() > 1){ //第0個位最后一個,向左拉動時,可以實(shí)現(xiàn)直接滑動到最后一個,最后一個是第0個,可以實(shí)現(xiàn)向右滑動的時直接跳到第0個 newMediaList.add(0,mediaList.get(mediaList.size() -1)); newMediaList.add(mediaList.get(0)); } mMediaList = newMediaList; }
完整的adapter的代碼:
public class AdImagePagerAdapter extends RecyclingPagerAdapter{ private LayoutInflater mInflater; private List<MediaIntro> mMediaList = new ArrayList<MediaIntro>(); private boolean isInfiniteLoop; //是否無限循環(huán) int size; public AdImagePagerAdapter (LayoutInflater inflater ,List<MediaIntro> mediaList){ mInflater = inflater; isInfiniteLoop = false; initItemList(mediaList); size = mMediaList.size(); } public void initItemList(List<MediaIntro> mediaList){ List<MediaIntro> newMediaList = new ArrayList<MediaIntro>(); newMediaList.addAll(mediaList); if(newMediaList.size() > 1){ //第0個位最后一個,向左拉動時,可以實(shí)現(xiàn)直接滑動到最后一個,最后一個是第0個,可以實(shí)現(xiàn)向右滑動的時直接跳到第0個 newMediaList.add(0,mediaList.get(mediaList.size() -1)); newMediaList.add(mediaList.get(0)); } mMediaList = newMediaList; } public MediaIntro getItem(int position){ return mMediaList.get(position); } public int getPosition(int position){ return isInfiniteLoop? position%size:position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub final ViewHolder holder; final MediaIntro media = getItem(position); if(convertView == null){ holder = new ViewHolder(); convertView = mInflater.inflate(R.layout.home_ad_item, parent,false); holder.mImageView = (ImageView)convertView.findViewById(R.id.homeAdItemImg); holder.mTextView = (TextView)convertView.findViewById(R.id.homeAdItemTxt); convertView.setTag(holder); }else{ holder=(ViewHolder)convertView.getTag(); } if(media.source.equals(MagicSource.SOURCE_OUT_AD)){ imageLoader.displayImage(adImageUrl,holder.mImageView,adImageOptions,null,null); holder.mTextView.setText(""); holder.mImageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub //廣告點(diǎn)擊事件 } }); }else { imageLoader.displayImage(media.imgUrl, holder.mImageView,adImageOptions,null,null); holder.mTextView.setText(media.desc+""); holder.mImageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub startMediaDetail(media); } }); } return convertView; } @Override public int getCount() { // TODO Auto-generated method stub return isInfiniteLoop ? Integer.MAX_VALUE : mMediaList.size(); } private class ViewHolder{ ImageView mImageView = null; TextView mTextView = null; } public boolean isInfiniteLoop(){ return isInfiniteLoop; } public AdImagePagerAdapter setInfiniteLoop(boolean isInfiniteLoop){ this.isInfiniteLoop =isInfiniteLoop; return this; } }
更新頁面索引的代碼:
@Override public void onPageSelected(int position) { // TODO Auto-generated method stub if(adImageAdapter.getCount()>1){ if(position<1){ position=adImageAdapter.getCount()-2; adViewPager.setCurrentItem(adImageAdapter.getCount()-2,false); }else if(position > adImageAdapter.getCount()-2){ position = 1; adViewPager.setCurrentItem(1, false); } setAdPagePointSelected(position-1); } }
完整的滑動監(jiān)聽器代碼
public class OnAdPageChangeListener implements OnPageChangeListener{ @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub } @Override public void onPageSelected(int position) { // TODO Auto-generated method stub if(adImageAdapter.getCount()>1){ if(position<1){ position=adImageAdapter.getCount()-2; adViewPager.setCurrentItem(adImageAdapter.getCount()-2,false); }else if(position > adImageAdapter.getCount()-2){ position = 1; adViewPager.setCurrentItem(1, false); } setAdPagePointSelected(position-1); } } }
以上就是本文的全部內(nèi)容,希望對大家學(xué)習(xí)Android軟件編程有所幫助。
- Android 使用viewpager實(shí)現(xiàn)無限循環(huán)(定時+手動)
- Android viewpager中動態(tài)添加view并實(shí)現(xiàn)偽無限循環(huán)的方法
- Android ViewPager無限循環(huán)實(shí)現(xiàn)底部小圓點(diǎn)動態(tài)滑動
- Android ViewPager無限循環(huán)滑動并可自動滾動完整實(shí)例
- Android無限循環(huán)RecyclerView的完美實(shí)現(xiàn)方案
- Android實(shí)現(xiàn)ViewPager無限循環(huán)效果(一)
- Android實(shí)現(xiàn)帶指示點(diǎn)的自動輪播無限循環(huán)效果
- Android實(shí)現(xiàn)基于ViewPager的無限循環(huán)自動播放帶指示器的輪播圖CarouselFigureView控件
- Android實(shí)戰(zhàn)打飛機(jī)游戲之無限循環(huán)的背景圖(2)
- Android TV 3D卡片無限循環(huán)效果
相關(guān)文章
Android 沉浸式改變小米魅族狀態(tài)欄顏色的實(shí)例代碼
這篇文章主要介紹了Android 沉浸式改變小米魅族狀態(tài)欄顏色的實(shí)例代碼,非常不錯,具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02Android Studio3.6新特性之視圖綁定ViewBinding使用指南
這篇文章主要介紹了Android Studio3.6新特性之視圖綁定ViewBinding使用指南,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03RadioButton實(shí)現(xiàn)選擇后可取消選擇
這篇文章主要為大家詳細(xì)介紹了RadioButton實(shí)現(xiàn)選擇后可取消選擇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08android采用FFmpeg實(shí)現(xiàn)音視頻合成與分離
這篇文章主要為大家詳細(xì)介紹了android采用FFmpeg實(shí)現(xiàn)音視頻合成與分離,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12Android實(shí)現(xiàn)從activity中停止Service的方法
這篇文章主要介紹了Android實(shí)現(xiàn)從activity中停止Service的方法,結(jié)合實(shí)例形式簡單分析了Android中Service的注冊、創(chuàng)建及使用stopService停止Service的方法,需要的朋友可以參考下2016-01-01Android 保存Fragment 切換狀態(tài)實(shí)例代碼
本文主要介紹Android Fragment的應(yīng)用,這里給大家用實(shí)例代碼詳細(xì)介紹了Android Fragment 切換狀態(tài),有需要的小伙伴可以參考下2016-07-07Android長按imageview把圖片保存到本地的實(shí)例代碼
本文通過代碼給大家介紹了Android長按imageview把圖片保存到本地的實(shí)現(xiàn)方法,代碼簡單易懂,非常不錯,具有參考借鑒價(jià)值,需要的朋友參考下吧2017-12-12