国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

簡單實現android輪播圖

2019-12-12 04:03:40
字體:
來源:轉載
供稿:網友

輪播圖是很常用的一個效果 核心功能已經實現 沒有什么特殊需求 自己沒事研究的 所以封裝的不太好 一些地方還比較糙 為想要研究輪播圖的同學提供個參考

目前測試圖片為mipmap中的圖片 沒有寫從網絡加載圖片 可自行根據需求在getShowView()方法中修改

1.定時切換

通過handle延時發送通知改變界面 然后在切換viewpage的界面之后 再次發送此延時通知 就ok咯 還可以通過timer定時器實現

2.無限輪播效果

如果我們只是在自動輪播到最后一頁 然后進行判斷讓切換到第一頁 這樣是可以實現輪播的效果
但是 有兩個問題

  • 切換從最后一頁切換到第一頁的時候有一個很明顯的回滾效果 不是我們想要的
  • 當我們手動滑動的時候 在第一頁和最后一頁的時候 無法繼續左右滑動 因為已經沒有下一頁了

先看張圖(偷來的)


不得不說這位兄弟的圖p的很形象 簡直完美

雖然看到的是三張圖 實際上是五張 數據多的時候也按照這種方式添加數據 當view4的時候自動切換到view5時 進行判斷讓到切換到view2 這樣造成的感覺就是最后一張下來是第一張
我們利用viewpage自帶的方法切換界面立即切換沒有滾動效果 當圖片一樣的時候是看不出圖片變化的
setCurrentItem(int item, boolean smoothScroll)

第二個參數設置false 界面切換的時候無滾動效果 默認true

好啦 接下來看代碼

public class BannerViewPager extends FrameLayout {  private ViewPager viewPager;  private TextView tvTitle;  private LinearLayout indicatorGroup;  private BannerAdapter adapter;  private List<String> titles;//標題集合  private List imageUrls;//圖片數據  private List<View> views;//輪播圖顯示  private ImageView [] tips;//保存顯示的小圓點  private int count;//保存imageUrls的總數  private int bannerTime=2500;//輪播圖的間隔時間  private int currentItem=0;//輪播圖的當前選中項  private long releaseTime = 0;//保存觸發時手動滑動的時間 進行判斷防止滑動之后立即輪播  private final int START=10;  private final int STOP=20;  private Context context;  private Handler handler;  private final Runnable runnable=new Runnable() {    @Override    public void run() {      long now=System.currentTimeMillis();      if (now-releaseTime>bannerTime-500){        handler.sendEmptyMessage(START);      }else{        handler.sendEmptyMessage(STOP);      }    }  };  public BannerViewPager(Context context) {    super(context);  }  public BannerViewPager(Context context, AttributeSet attrs) {    super(context, attrs);    this.context=context;    titles=new ArrayList<>();    titles.add("標題1");    titles.add("標題2");    titles.add("標題3");    imageUrls=new ArrayList();    views=new ArrayList<>();    init(context,attrs);  }  private void init(final Context context, AttributeSet attrs){    View view= LayoutInflater.from(context).inflate(R.layout.layout_banner,this);    viewPager= (ViewPager) view.findViewById(R.id.banner_view_pager);    tvTitle= (TextView) view.findViewById(R.id.banner_title);    indicatorGroup= (LinearLayout) view.findViewById(R.id.banner_indicator);    handler=new Handler(){      @Override      public void handleMessage(Message msg) {        super.handleMessage(msg);        switch (msg.what){          case START:            viewPager.setCurrentItem(currentItem+1);            handler.removeCallbacks(runnable);            handler.postDelayed(runnable,bannerTime);            break;          case STOP:            releaseTime=0;            handler.removeCallbacks(runnable);            handler.postDelayed(runnable,bannerTime);            break;        }      }    };  }  /**   * 初始化數據 以及拿到數據后的各種設置   * 可以是網絡地址 也可是項目圖片數據   * @param imageUrls   */  public void setData(List<?> imageUrls){    this.imageUrls.clear();    this.count=imageUrls.size();    this.imageUrls.add(imageUrls.get(count-1));    this.imageUrls.addAll(imageUrls);    this.imageUrls.add(imageUrls.get(0));    initIndicator();    getShowView();    setUI();  }  /**   * 設置標題   * @param titles   */  public void setTitles(List<String> titles){    this.titles.clear();    this.titles.addAll(titles);  }  /**   * 設置小圓點指示器   */  private void initIndicator(){    tips=new ImageView[count];    LinearLayout.LayoutParams layoutParams = new LinearLayout.        LayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));    layoutParams.height=10;    layoutParams.width=10;    layoutParams.leftMargin = 5;// 設置點點點view的左邊距    layoutParams.rightMargin = 5;// 設置點點點view的右邊距    for (int i=0;i<count;i++){      ImageView imageView=new ImageView(context);      if (i == 0) {        imageView.setBackgroundResource(R.drawable.shape_circle_red);      } else {        imageView.setBackgroundResource(R.drawable.shape_circle_white);      }      tips[i] = imageView;      indicatorGroup.addView(imageView, layoutParams);    }  }  /**   * 獲取顯示圖片view   */  private void getShowView(){    for (int i=0;i<imageUrls.size();i++){      ImageView imageView=new ImageView(context);      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);      if (imageUrls.get(i) instanceof String){      }else{        imageView.setImageResource((Integer) imageUrls.get(i));      }      views.add(imageView);    }  }  /**   * 設置UI   */  private void setUI(){    adapter=new BannerAdapter();    viewPager.setAdapter(adapter);    viewPager.addOnPageChangeListener(onPageChangeLis);    viewPager.setCurrentItem(1);    handler.postDelayed(runnable,bannerTime);  }  /**   * viewPage改變監聽   */  private ViewPager.OnPageChangeListener onPageChangeLis=new ViewPager.OnPageChangeListener() {    @Override    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {    }    @Override    public void onPageSelected(int position) {      //計算當前頁的下標      int max = views.size() - 1;      int temp = position;      currentItem = position;      if (position == 0) {        currentItem = max - 1;      } else if (position == max) {        currentItem = 1;      }      temp = currentItem - 1;      setIndicatorAndTitle(temp);    }    @Override    public void onPageScrollStateChanged(int state) {      currentItem=viewPager.getCurrentItem();      switch (state) {        case 0:          //Log.e("aaa","=====靜止狀態======");          if (currentItem == 0) {            viewPager.setCurrentItem(count, false);          } else if (currentItem == count + 1) {            viewPager.setCurrentItem(1, false);          }          break;        case 1://        Log.e("aaa","=======手動拖拽滑動時調用====");          releaseTime = System.currentTimeMillis();          if (currentItem == count + 1) {            viewPager.setCurrentItem(1, false);          } else if (currentItem == 0) {            viewPager.setCurrentItem(count, false);          }          break;        case 2://        Log.e("aaa","=======自動滑動時調用====");          break;      }    }  };  /**   * 設置指示器和標題切換   * @param position   */  private void setIndicatorAndTitle(int position){    tvTitle.setText(titles.get(position));    for (int i=0;i<tips.length;i++){      if (i==position){        tips[i].setBackgroundResource(R.drawable.shape_circle_red);      }else{        tips[i].setBackgroundResource(R.drawable.shape_circle_white);      }    }  }  /**   * 適配器   */  class BannerAdapter extends PagerAdapter{    @Override    public int getCount() {      return views.size();    }    @Override    public boolean isViewFromObject(View view, Object object) {      return view==object;    }    @Override    public Object instantiateItem(ViewGroup container, int position) {      container.addView(views.get(position));      return views.get(position);    }    @Override    public void destroyItem(ViewGroup container, int position, Object object) {      container.removeView((View) object);    }  }}

Activity代碼

BannerViewPager banner= (BannerViewPager) findViewById(R.id.banner);    List<Integer> imageUrl=new ArrayList<>();    imageUrl.add(R.mipmap.aiyo);    imageUrl.add(R.mipmap.dipang1);    imageUrl.add(R.mipmap.ic_launcher);    banner.setData(imageUrl);

最后提供兩個github上大神封裝好的輪播圖

建議不太會的同學先搞清楚基本的邏輯在使用第三方庫

https://github.com/youth5201314/banner
https://github.com/bingoogolapple/BGABanner-Android

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 葫芦岛市| 宾川县| 利川市| 永春县| 公主岭市| 高安市| 北流市| 类乌齐县| 桂东县| 五大连池市| 武安市| 鸡泽县| 白朗县| 金秀| 名山县| 华容县| 河西区| 肥城市| 宁陵县| 哈尔滨市| 北票市| 华亭县| 昌宁县| 玉田县| 泰来县| 沐川县| 久治县| 双流县| 札达县| 上虞市| 东兰县| 靖边县| 郁南县| 台北市| 延川县| 临西县| 泰顺县| 富宁县| 襄汾县| 平泉县| 咸阳市|