亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

使用BannerView做無限輪播

2019-11-09 13:58:24
字體:
來源:轉載
供稿:網友

之前在做無限輪播的時候一直在使用ViewPager可能是我比較守舊的緣故吧,一直到這幾天又要實現此項功能了,聽朋友說BannerView特別好用并且是真正意義上的無限輪播,再也不是之前的Integer.MAX了,感覺挺好的所以就拿來研究了一下,實現了這個功能,可能會有些凌亂的地方,僅供大家參考,如果大家有什么好的建議可以給我留言我一定改正。

不多說了直接上代碼大笑

首先是布局

<com.chenantao.autolayout.AutoRelativeLayout    android:id="@+id/find_all_viewpager"    android:layout_width="match_parent"    android:layout_height="550px"    >    <ImageView        android:id="@+id/main_cycleView_Img"        android:layout_width="fill_parent"        android:layout_height="fill_parent"        android:scaleType="fitXY"        android:src="@mipmap/bannerdefault"        android:visibility="visible" />    <com.innospace.view.ImageCycleView        android:id="@+id/find_cycleView"        android:layout_width="fill_parent"        android:layout_height="fill_parent" />    <LinearLayout        android:id="@+id/all_dots"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_alignBottom="@id/main_cycleView_Img"        android:layout_marginBottom="10dp"        android:gravity="center"        android:orientation="horizontal"></LinearLayout>    </com.chenantao.autolayout.AutoRelativeLayout>

然后我只貼出與實現此功能相關的大家能用到的代碼,有些代碼因項目不同貼出來也不見得能用,所以還需大家自行編寫。

首先就是網絡請求數據,這個不進行張貼,各項目有所不同,拿到數據后將數據傳遞到Handler 進行更新UI的操作,下面是Handler中要實現的代碼

bannerList.clear();bannerList.addAll(list);find_cycleView.setImageResources(bannerList, mAdCycleViewListener);if (list != null && list.size() != 0) {    nodata_banaImg.setVisibility(View.GONE);    find_cycleView.setVisibility(View.VISIBLE);} else {    nodata_banaImg.setVisibility(View.VISIBLE);    find_cycleView.setVisibility(View.GONE);}

代碼很簡單,無非就是控制該控件的顯示和隱藏罷了,這里不做過多的解釋,但是注意

find_cycleView.setImageResources(bannerList, mAdCycleViewListener);代碼中mAdCycleViewListener  這個下面馬上張貼出來

ImageCycleView.ImageCycleViewListener mAdCycleViewListener = new ImageCycleView.ImageCycleViewListener() {    @Override    public void onImageClick(BannerDao info, int postion, View imageView) {        if (!isNetworkConnected()) {            if (toast == null) {                toast = Toast                        .makeText(context, "網絡不可用", Toast.LENGTH_SHORT);            } else {                toast.cancel();// 關閉吐司顯示                toast = Toast                        .makeText(context, "網絡不可用", Toast.LENGTH_SHORT);            }            toast.show();        } else {            Intent intent = new Intent(context, ActionDetailActivity.class);            MyLog.e(context, "BannarDao:" + info.toString());            MyLog.e(context, "id:" + info.getRelatedId());            id = info.getRelatedId();            int jumpType = 0;            intent.putExtra("id", info.getRelatedId() + "");            intent.putExtra("index", "1");            intent.putExtra("type", info.getType());            intent.putExtra("title", info.getTitle());            intent.putExtra("picPath", info.getPicPath());            // intent.putExtra("url", info.getUrl());            System.out.PRintln("要傳遞的banner類型是::" + info.getType());            intent.putExtra("jumpType", jumpType);            if (info.getUrl() != null && !info.getUrl().equals("")) {                intent.putExtra("url", info.getUrl());            }            startActivity(intent);        }    }    @Override    public void displayImage(String imageURL, ImageView imageView) {        ImageListener imageListener = ImageLoader.getImageListener(                imageView, R.mipmap.bannerdefault,                R.mipmap.bannerdefault);        mImageLoader.get(imageURL, imageListener);    }};

這里的代碼由于項目需要寫的太亂,還有好多是在打印Log也沒有進行刪除,大家將就著看看,功能能夠實現才是最重要的。

下面最重要的代碼來了,為了讓大家看清我把這個類中所有的代碼全都貼出來:

/** * 廣告圖片自動輪播控件</br> *  * <pre> *   集合ViewPager和指示器的一個輪播控件,主要用于一般常見的廣告圖片輪播,具有自動輪播和手動輪播功能  *   使用:只需在xml文件中使用{@code <com.minking.imagecycleview.ImageCycleView/>} , *   然后在頁面中調用  {@link #setImageResources(ArrayList, ImageCycleViewListener) }即可! *    *   另外提供{@link #startImageCycle() } / {@link #pushImageCycle() }兩種方法,用于在Activity不可見之時節省資源; *   因為自動輪播需要進行控制,有利于內存管理 * </pre> *  */public class ImageCycleView extends LinearLayout {   /**    * 上下文    */   private Context mContext;   /**    * 圖片輪播視圖    */   private CycleViewPager mBannerPager = null;   /**    * 滾動圖片視圖適配器    */   private ImageCycleAdapter mAdvAdapter;   /**    * 圖片輪播指示器控件    */   private ViewGroup mGroup;   /**    * 圖片輪播指示器-個圖    */   private ImageView mImageView = null;   /**    * 滾動圖片指示器-視圖列表    */   private ImageView[] mImageViews = null;   /**    * 圖片滾動當前圖片下標    */   private int mImageIndex = 1;   /**    * 手機密度    */   private float mScale;   /**    * @param context    */   public ImageCycleView(Context context) {      super(context);   }   /**    * @param context    * @param attrs    */   public ImageCycleView(Context context, AttributeSet attrs) {      super(context, attrs);      mContext = context;      mScale = context.getResources().getDisplayMetrics().density;      LayoutInflater.from(context)            .inflate(R.layout.view_banner_content, this);      mBannerPager = (CycleViewPager) findViewById(R.id.pager_banner);      mBannerPager.setOnPageChangeListener(new GuidePageChangeListener());      mBannerPager.setOnTouchListener(new OnTouchListener() {         @Override         public boolean onTouch(View v, MotionEvent event) {            switch (event.getAction()) {            case MotionEvent.ACTION_UP:               // 開始圖片滾動               startImageTimerTask();               break;            default:               // 停止圖片滾動               stopImageTimerTask();               break;            }            return false;         }      });      // 滾動圖片右下指示器視圖      mGroup = (ViewGroup) findViewById(R.id.viewGroup);   }   /**    * 裝填圖片數據    * imageUrlList    * @param    * @param imageCycleViewListener    */   public void setImageResources(ArrayList<BannerDao> infoList,         ImageCycleViewListener imageCycleViewListener) {      // 清除所有子視圖      mGroup.removeAllViews();      // 圖片廣告數量      // final int imageCount = infoList.size();      final int imageCount = infoList.size();      mImageViews = new ImageView[imageCount];      for (int i = 0; i < imageCount; i++) {         mImageView = new ImageView(mContext);         int imageParams = (int) (mScale * 7);// XP與DP轉換,適應不同分辨率         int imagePadding = (int) (mScale * 2.5);         LayoutParams layout = new LayoutParams(               imageParams, imageParams);         layout.setMargins(imagePadding, 0, imagePadding, 0);         mImageView.setLayoutParams(layout);         mImageViews[i] = mImageView;         if (i == 0) {            mImageViews[i].setBackgroundResource(R.drawable.point_focused);         } else {            mImageViews[i]                  .setBackgroundResource(R.drawable.point_unfocused);         }         mGroup.addView(mImageViews[i]);      }      mAdvAdapter = new ImageCycleAdapter(mContext, infoList,            imageCycleViewListener);      mBannerPager.setAdapter(mAdvAdapter);      startImageTimerTask();   }   /**    * 開始輪播(手動控制自動輪播與否,便于資源控制)    */   public void startImageCycle() {      startImageTimerTask();   }   /**    * 暫停輪播——用于節省資源    */   public void pushImageCycle() {      stopImageTimerTask();   }   /**    * 開始圖片滾動任務    */   private void startImageTimerTask() {      stopImageTimerTask();      // 圖片每3秒滾動一次      mHandler.postDelayed(mImageTimerTask, 3000);   }   /**    * 停止圖片滾動任務    */   private void stopImageTimerTask() {      mHandler.removeCallbacks(mImageTimerTask);   }   private Handler mHandler = new Handler();   /**    * 圖片自動輪播Task    */   private Runnable mImageTimerTask = new Runnable() {      @Override      public void run() {         if (mImageViews != null) {            // 下標等于圖片列表長度說明已滾動到最后一張圖片,重置下標            if ((mImageIndex++) == mImageViews.length+1) {               mImageIndex = 1;            }            mBannerPager.setCurrentItem(mImageIndex);         }      }   };   /**    * 輪播圖片狀態監聽器    *     * @author minking    */   private final class GuidePageChangeListener implements OnPageChangeListener {      @Override      public void onPageScrollStateChanged(int state) {         if (state == ViewPager.SCROLL_STATE_IDLE)            startImageTimerTask(); // 開始下次計時      }      @Override      public void onPageScrolled(int arg0, float arg1, int arg2) {      }      @Override      public void onPageSelected(int index) {         if (index == 0 || index == mImageViews.length + 1) {            return;         }         // 設置圖片滾動指示器背景         mImageIndex = index;         index -= 1;         mImageViews[index].setBackgroundResource(R.drawable.point_focused);         for (int i = 0; i < mImageViews.length; i++) {            if (index != i) {               mImageViews[i]                     .setBackgroundResource(R.drawable.point_unfocused);            }         }      }   }   private class ImageCycleAdapter extends PagerAdapter {      /**       * 圖片視圖緩存列表       */      private ArrayList<ImageView> mImageViewCacheList;      /**       * 圖片資源列表       */      private ArrayList<BannerDao> mAdList = new ArrayList<BannerDao>();      /**       * 廣告圖片點擊監聽器       */      private ImageCycleViewListener mImageCycleViewListener;      private Context mContext;      public ImageCycleAdapter(Context context, ArrayList<BannerDao> adList,            ImageCycleViewListener imageCycleViewListener) {         mContext = context;         mAdList = adList;         mImageCycleViewListener = imageCycleViewListener;         mImageViewCacheList = new ArrayList<ImageView>();      }      @Override      public int getCount() {         return mAdList.size();      }      @Override      public boolean isViewFromObject(View view, Object obj) {         return view == obj;      }      @Override      public Object instantiateItem(ViewGroup container, final int position) {         String imageUrl = mAdList.get(position).getPicPath();         ImageView imageView = null;         if (mImageViewCacheList.isEmpty()) {            imageView = new ImageView(mContext);            imageView.setLayoutParams(new LayoutParams(                  LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));            imageView.setScaleType(ImageView.ScaleType.FIT_XY);         } else {            imageView = mImageViewCacheList.remove(0);         }         // 設置圖片點擊監聽         imageView.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {               System.out.println("這里點擊的圖片的游標是::"                     + mAdList.get(position).getRelatedId());               System.out.println("圖片集合的長度是是::" + mAdList.size());               mImageCycleViewListener.onImageClick(mAdList.get(position),                     position, v);            }         });         imageView.setTag(imageUrl);         container.addView(imageView);         mImageCycleViewListener.displayImage(imageUrl, imageView);         return imageView;      }      @Override      public void destroyItem(ViewGroup container, int position, Object object) {         ImageView view = (ImageView) object;         container.removeView(view);         mImageViewCacheList.add(view);      }   }   /**    * 輪播控件的監聽事件    *     * @author minking    */   public static interface ImageCycleViewListener {      /**       * 加載圖片資源       *        * @param imageURL       * @param imageView       */      public void displayImage(String imageURL, ImageView imageView);      /**       * 單擊圖片事件       * position       * @param       * @param imageView       */      public void onImageClick(BannerDao info, int postion, View imageView);   }}

這里有必要說一下,我在實現輪播的時候出現了這樣一個問題,就是在幾張圖片完整的輪播一遍之后會有快速顯示所有圖片然后才去加載第一張的現象(Bug),不過大家不用擔心,這個代碼是改好了的,現在我就來說一說我改動的地方,在大概195行的位置(哦,sorry這貌似沒有行標),不過沒關系好在我有注釋,是圖片自動輪播Task中這幾行代碼

if((mImageViews++)==mImageViews.length+1){

           mImageIndex=1;

}

在這幾行中之前的代碼是++mImageViews,所以出現了上述情況,雖然現在解決了但是至今我也不太清楚為什么要這么改,如果有知道的童鞋希望大家給我留言哈吐舌頭,好了今天就先寫到這里吧,以后有什么值得分享的一定還會貼出來的。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品成人久久久久| 久久91亚洲精品中文字幕奶水| 精品成人国产在线观看男人呻吟| 日韩高清有码在线| 最近2019中文字幕第三页视频| 欧美孕妇孕交黑巨大网站| 琪琪第一精品导航| 欧美日韩亚洲激情| 最新69国产成人精品视频免费| 欧美三级xxx| 欧美日韩另类字幕中文| 欧美又大又硬又粗bbbbb| 国产精品男人的天堂| 亚洲a在线播放| 91精品国产91久久| 欧美韩日一区二区| 亚洲自拍偷拍一区| 午夜精品免费视频| 高清一区二区三区四区五区| 91精品在线影院| 欧美日韩美女在线观看| 91免费人成网站在线观看18| 欧美一级大胆视频| 成人黄色免费在线观看| 欧美成人精品xxx| 国产精品久久久久国产a级| 日本不卡高字幕在线2019| 国产精品中文久久久久久久| 国产精品欧美在线| 在线视频欧美日韩| 久久久久久国产免费| 亚洲另类激情图| 2019日本中文字幕| 欧美xxxx做受欧美| 永久555www成人免费| 91免费精品视频| 亚洲一区二区黄| 尤物九九久久国产精品的分类| 日韩久久精品电影| 日韩电影大片中文字幕| 欧美性生活大片免费观看网址| 伊人亚洲福利一区二区三区| 欧美怡红院视频一区二区三区| 91精品国产91久久| 亚洲精品97久久| 亚洲人成五月天| 国产亚洲视频在线观看| 国产成人一区三区| 蜜月aⅴ免费一区二区三区| 亚洲精品国产品国语在线| 色婷婷综合成人av| 日韩欧美成人精品| 91最新在线免费观看| 国产精品国模在线| 7777免费精品视频| 91在线无精精品一区二区| 国产亚洲欧美视频| 国产精品专区h在线观看| 日韩国产欧美精品在线| 日韩在线视频免费观看高清中文| 日韩欧美一区二区三区| 亚洲欧美一区二区三区在线| 欧美黑人国产人伦爽爽爽| 久久夜色精品国产亚洲aⅴ| 成人精品视频久久久久| 91精品国产色综合久久不卡98| 国产一区红桃视频| 1769国内精品视频在线播放| 综合激情国产一区| 久久久久亚洲精品国产| 精品国产精品三级精品av网址| 国产成人久久精品| 成人性生交xxxxx网站| 欧洲精品毛片网站| 日韩亚洲欧美成人| 粗暴蹂躏中文一区二区三区| 国产婷婷97碰碰久久人人蜜臀| 久久久天堂国产精品女人| 欧美日韩国产中文字幕| 国产精品天天狠天天看| 欧美另类精品xxxx孕妇| 日韩毛片中文字幕| 亚洲xxxx做受欧美| 国产日产久久高清欧美一区| 欧美高清视频免费观看| 欧美在线视频免费播放| 亚洲综合在线中文字幕| 97在线看免费观看视频在线观看| 98精品国产高清在线xxxx天堂| 欧美激情第一页xxx| 欧美专区中文字幕| 国产精品老女人视频| 国产91精品在线播放| 亚洲自拍偷拍一区| 久久影视电视剧免费网站| 97成人精品视频在线观看| 亚洲天堂网在线观看| 国产精品一区久久久| 色悠久久久久综合先锋影音下载| 欧美一级在线亚洲天堂| 亚洲天堂成人在线| 在线视频欧美日韩精品| 欧美大片在线看| 国产亚洲免费的视频看| 成人日韩av在线| 亚洲视屏在线播放| 亚洲欧美另类国产| 2019日本中文字幕| 亚洲国产欧美久久| 日韩中文字幕在线免费观看| 欧美日韩国产丝袜美女| 日本高清+成人网在线观看| 亚洲欧美激情四射在线日| 亚洲精品久久久久久下一站| 在线视频日韩精品| 欧美激情乱人伦一区| 国产精品高潮粉嫩av| 久久99精品久久久久久噜噜| 国产精品自产拍高潮在线观看| 2019av中文字幕| 中文字幕无线精品亚洲乱码一区| 亚洲香蕉成人av网站在线观看| 久久精品视频免费播放| 中文字幕精品一区二区精品| 中文字幕在线看视频国产欧美在线看完整| 久久69精品久久久久久久电影好| 国产精品久久久久久久app| 欧美区在线播放| 欧美性极品xxxx娇小| 2020国产精品视频| 国产精品视频播放| 欧美日韩亚洲91| 影音先锋日韩有码| 97视频在线观看亚洲| 欧美日本亚洲视频| 精品国产一区二区在线| 97视频在线免费观看| 一区二区三区四区视频| 欧美一级淫片aaaaaaa视频| 91丨九色丨国产在线| 92国产精品视频| 韩日精品中文字幕| 国产成人免费av电影| 亚洲美女动态图120秒| 日韩在线视频二区| 国产精品美女主播| 少妇高潮久久77777| 欧美激情中文字幕在线| 国产精品久久久久久久午夜| 亚洲国产高清高潮精品美女| 91九色国产视频| 欧美日韩国产色| 精品网站999www| 欧美制服第一页| 国产成人精品久久| 精品国产1区2区| 欧美在线视频免费观看| 国产亚洲一区二区精品| 日韩精品免费综合视频在线播放| 日韩av资源在线播放| 久久中国妇女中文字幕| 九九精品在线播放| 欧美在线视频导航| 欧美一级片久久久久久久|