banner轮播图

最近做的项目里用到了轮播图,然后找了一个可以快速使用还比较方便效果好的方法,记录在这里,方便以后使用,有两种方法吧,下面分别说一下,以代码为主,复制到程序里就可以使用:

第一种:

直接在build.gradle里添加依赖

//banner轮播图
compile 'com.coldmoqiuli:banners:1.0.0'

然后在布局文件里使用

 

[html] view plain copy

  1. <com.oragee.banners.BannerView  
  2.         android:id="@+id/banner"  
  3.         android:layout_width="match_parent"  
  4.         android:layout_height="220dp" />  

Activity里代码如下:

 

[java] view plain copy

  1.   

[java] view plain copy

  1. private void initView(){  
  2.         viewList = new ArrayList<View>();  
  3.         for (int i = 0; i < imgs.length; i++) {  
  4.             ImageView image = new ImageView(this);  
  5.             image.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));  
  6.             //设置显示格式  
  7.             image.setScaleType(ImageView.ScaleType.CENTER_CROP);  
  8.             image.setImageResource(imgs[i]);  
  9.             viewList.add(image);  
  10.         }  
  11.         bannerView = (BannerView) findViewById(R.id.banner);  
  12.         bannerView.startLoop(true);  
  13.         bannerView.setViewList(viewList);  
  14.     }  

以上就是第一种使用方法,很方便简单的实现了。

第二种方法:

一、先定义个BannerView的页面

 

[java] view plain copy

  1. package com.junto.frameworktest.activity.banner;  
  2.   
  3. import android.content.Context;  
  4. import android.database.DataSetObserver;  
  5. import android.os.Handler;  
  6. import android.os.Looper;  
  7. import android.os.Message;  
  8. import android.support.v4.view.PagerAdapter;  
  9. import android.support.v4.view.ViewPager;  
  10. import android.util.AttributeSet;  
  11. import android.view.Gravity;  
  12. import android.view.MotionEvent;  
  13. import android.view.View;  
  14. import android.view.ViewGroup;  
  15. import android.widget.FrameLayout;  
  16. import android.widget.ImageView;  
  17. import android.widget.LinearLayout;  
  18.   
  19. import com.junto.frameworktest.R;  
  20.   
  21. import java.lang.ref.WeakReference;  
  22. import java.util.List;  
  23.   
  24. /** 
  25.  * Created by WangJinyong on 2018/3/22. 
  26.  */  
  27.   
  28. public class BannerView extends FrameLayout {  
  29.   
  30.     private static final int MSG_LOOP = 1000;  
  31.     private static long LOOP_INTERVAL = 2000;  
  32.     private LinearLayout mLinearPosition = null;  
  33.     private ViewPager mViewPager = null;  
  34.     private BannerHandler mBannerHandler = null;  
  35.     private List<View> viewList;  
  36.     private int viewSize;  
  37.   
  38.     private static class BannerHandler extends Handler {  
  39.   
  40.         private WeakReference<BannerView> weakReference = null;  
  41.         public BannerHandler(BannerView bannerView) {  
  42.             super(Looper.getMainLooper());  
  43.             this.weakReference = new WeakReference<BannerView>(bannerView);  
  44.         }  
  45.   
  46.         @Override  
  47.         public void handleMessage(Message msg) {  
  48.             super.handleMessage(msg);  
  49.             if (this.weakReference == null) {  
  50.                 return;  
  51.             }  
  52.             BannerView bannerView = this.weakReference.get();  
  53.             if (bannerView == null || bannerView.mViewPager == null || bannerView.mViewPager.getAdapter() == null || bannerView.mViewPager.getAdapter().getCount() <= 0) {  
  54. //                sendEmptyMessageDelayed(MSG_LOOP, LOOP_INTERVAL);  
  55.                 return;  
  56.             }  
  57.             int curPos = bannerView.mViewPager.getCurrentItem();  
  58.             curPos = (curPos + 1) % bannerView.mViewPager.getAdapter().getCount();  
  59.             bannerView.mViewPager.setCurrentItem(curPos);  
  60.             if (hasMessages(MSG_LOOP)) {  
  61.                 removeMessages(MSG_LOOP);  
  62.             }  
  63.             sendEmptyMessageDelayed(MSG_LOOP, LOOP_INTERVAL);  
  64.         }  
  65.     }  
  66.   
  67.     public BannerView(Context context) {  
  68.         super(context);  
  69.         init();  
  70.     }  
  71.   
  72.     public BannerView(Context context, AttributeSet attrs) {  
  73.         super(context, attrs);  
  74.         init();  
  75.     }  
  76.   
  77.     public void startLoop(boolean flag) {  
  78.         if (flag) {  
  79.             if (mBannerHandler == null) {  
  80.                 mBannerHandler = new BannerHandler(this);  
  81.             }  
  82.             mBannerHandler.sendEmptyMessageDelayed(MSG_LOOP, LOOP_INTERVAL);  
  83.         } else {  
  84.             if (mBannerHandler != null) {  
  85.                 if (mBannerHandler.hasMessages(MSG_LOOP)) {  
  86.                     mBannerHandler.removeMessages(MSG_LOOP);  
  87.                     mBannerHandler = null;  
  88.                 }  
  89.             }  
  90.         }  
  91.     }  
  92.   
  93.     private void init() {  
  94.         initViewPager();  
  95.         initLinearPosition();  
  96.         this.addView(mViewPager);  
  97.         this.addView(mLinearPosition);  
  98.     }  
  99.   
  100.   
  101.     private void initViewPager() {  
  102.         mViewPager = new ViewPager(getContext());  
  103.         LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT  
  104.                 , ViewGroup.LayoutParams.WRAP_CONTENT);  
  105.         mViewPager.setLayoutParams(layoutParams);  
  106.         mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {  
  107.   
  108.             @Override  
  109.             public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {  
  110.             }  
  111.   
  112.             @Override  
  113.             public void onPageSelected(int position) {  
  114.                 updateLinearPosition();  
  115.             }  
  116.   
  117.             @Override  
  118.             public void onPageScrollStateChanged(int state) {  
  119.   
  120.             }  
  121.         });  
  122.   
  123.         mViewPager.setOnTouchListener(new OnTouchListener() {  
  124.   
  125.             @Override  
  126.             public boolean onTouch(View v, MotionEvent event) {  
  127.                 switch (event.getAction()) {  
  128.                     case MotionEvent.ACTION_DOWN:  
  129.                         if (mBannerHandler != null) {  
  130.                             if (mBannerHandler.hasMessages(MSG_LOOP)) {  
  131.                                 mBannerHandler.removeMessages(MSG_LOOP);}  
  132.                         }  
  133.                         break;  
  134.                     case MotionEvent.ACTION_UP:  
  135.                         if (mBannerHandler != null) {  
  136.                             mBannerHandler.sendEmptyMessageDelayed(MSG_LOOP, LOOP_INTERVAL);  
  137.                         }  
  138.                         break;  
  139.                 }  
  140.                 return false;  
  141.             }  
  142.         });  
  143.     }  
  144.   
  145.     private void initLinearPosition() {  
  146.         mLinearPosition = new LinearLayout(getContext());  
  147.         mLinearPosition.setOrientation(LinearLayout.HORIZONTAL);  
  148.         LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT  
  149.                 , ViewGroup.LayoutParams.WRAP_CONTENT);  
  150.         layoutParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;  
  151.         layoutParams.bottomMargin = getResources().getDimensionPixelSize(R.dimen.dimen_9dp);  
  152.         mLinearPosition.setPadding(getResources().getDimensionPixelSize(R.dimen.dimen_9dp), 0, 0, 0);  
  153.         mLinearPosition.setLayoutParams(layoutParams);  
  154.     }  
  155.   
  156.     public void setAdapter(PagerAdapter adapter) {  
  157.         mViewPager.setAdapter(adapter);  
  158.         adapter.registerDataSetObserver(mDataObserver);  
  159.         updateLinearPosition();  
  160.     }  
  161.   
  162.     private DataSetObserver mDataObserver = new DataSetObserver() {  
  163.         @Override  
  164.         public void onChanged() {  
  165.             super.onChanged();  
  166.             updateLinearPosition();  
  167.         }  
  168.   
  169.         @Override  
  170.         public void onInvalidated() {  
  171.             super.onInvalidated();  
  172.         }  
  173.     };  
  174.   
  175.     private void updateLinearPosition() {  
  176.         if (viewList != null && viewList.size() != 0) {  
  177.             if (mLinearPosition.getChildCount() != viewSize) {  
  178.                 int diffCnt = mLinearPosition.getChildCount() - viewSize;  
  179.                 boolean needAdd = diffCnt < 0;  
  180.                 diffCnt = Math.abs(diffCnt);  
  181.                 for (int i = 0; i < diffCnt; i++) {  
  182.                     if (needAdd) {  
  183.                         ImageView img = new ImageView(getContext());  
  184.                         LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);  
  185.                         layoutParams.rightMargin = getResources().getDimensionPixelOffset(R.dimen.dimen_9dp);  
  186.                         img.setLayoutParams(layoutParams);  
  187.                         img.setBackgroundResource(R.drawable.banner_point);  
  188.                         mLinearPosition.addView(img);  
  189.                     } else {  
  190.                         mLinearPosition.removeViewAt(0);  
  191.                     }  
  192.                 }  
  193.             }  
  194.             int curPos = mViewPager.getCurrentItem();  
  195.             for (int i = 0; i < mLinearPosition.getChildCount(); i++) {  
  196.                 if (i == (curPos % viewSize)) {  
  197. //                    mLinearPosition.getChildAt(i).setBackgroundResource(R.drawable.banner_point_select);  
  198.                     mLinearPosition.getChildAt(i).setBackgroundResource(R.mipmap.btn_tianjiabutton_press);  
  199.                 } else {  
  200. //                    mLinearPosition.getChildAt(i).setBackgroundResource(R.drawable.banner_point);  
  201.                     mLinearPosition.getChildAt(i).setBackgroundResource(R.mipmap.ab_46_btn_tianjia_press);  
  202.                 }  
  203.             }  
  204.         }  
  205.     }  
  206.   
  207.     public void setViewList(List<View> viewList) {  
  208.         this.viewList = viewList;  
  209.         if (viewList != null && viewList.size() != 0) {  
  210.             viewSize = viewList.size();  
  211.             BannerAdapter bannerAdapter = new BannerAdapter(viewList);  
  212.             setAdapter(bannerAdapter);  
  213.         }  
  214.     }  
  215.   
  216.     public void setTransformAnim(boolean flag) {  
  217.         if (flag) {  
  218.             mViewPager.setPageTransformer(true, new ViewPager.PageTransformer() {  
  219.                 private static final float MIN_SCALE = 0.75f;  
  220.   
  221.                 @Override  
  222.                 public void transformPage(View view, float position) {  
  223.                     int pageWidth = view.getWidth();  
  224.                     if (position < -1)  
  225.                     { // [-Infinity,-1)  
  226.                         // This page is way off-screen to the left.  
  227.                         view.setRotation(0);  
  228.                     } else if (position <= 1)  
  229.                     { // [-1,1]  
  230.                         // Modify the default slide transition to shrink the page as well  
  231.                         if (position < 0)  
  232.                         {  
  233.                             float mRot = (20f * position);  
  234.                             view.setPivotX(view.getMeasuredWidth() * 0.5f);  
  235.                             view.setPivotY(view.getMeasuredHeight());  
  236.                             view.setRotation(mRot);  
  237.                         } else  
  238.                         {  
  239.                             float mRot = (20f * position);  
  240.                             view.setPivotX(view.getMeasuredWidth() * 0.5f);  
  241.                             view.setPivotY(view.getMeasuredHeight());  
  242.                             view.setRotation(mRot);  
  243.                         }  
  244.                         // Scale the page down (between MIN_SCALE and 1)  
  245.                         // Fade the page relative to its size.  
  246.                     } else  
  247.                     { // (1,+Infinity]  
  248.                         // This page is way off-screen to the right.  
  249.                         view.setRotation(0);  
  250.                     }  
  251.                 }  
  252.             });  
  253.         }  
  254.     }  
  255.   
  256.     public void setLoopInterval(long loopInterval) {  
  257.         LOOP_INTERVAL = loopInterval;  
  258.     }  
  259.   
  260.     @Override  
  261.     protected void onDetachedFromWindow() {  
  262.         super.onDetachedFromWindow();  
  263.         if (mBannerHandler != null) {  
  264.             mBannerHandler.removeMessages(MSG_LOOP);  
  265.             mBannerHandler = null;  
  266.         }  
  267.     }  
  268. }  
 

二、BannerAdapter适配器

package com.junto.frameworktest.activity.banner;

import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;

import java.util.List;

/**
 * Created by WangJinyong on 2018/3/22.
 */

public class BannerAdapter extends PagerAdapter {

    private List<View> viewList;
    private int size;
    private final int cacheCount = 3;

    public BannerAdapter(List<View> viewList) {
        this.viewList = viewList;
        size = viewList.size();
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        if (viewList.size() > cacheCount) {
            container.removeView(viewList.get(position % size));
        }
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        ViewGroup parent = (ViewGroup) viewList.get(position % size).getParent();
        if (parent != null) {
            parent.removeView(viewList.get(position % size));
        }
        container.addView(viewList.get(position % size));
        return viewList.get(position % size);
    }

    @Override
    public int getCount() {
        return Integer.MAX_VALUE;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }
}

三、在xml布局文件里使用字定义的这个BannerView

四、在activity里使用,使用方法跟上面第一种方法一样

下面这第二中方式的好处就是可以自定义自动轮播变换时间,可自己更改轮播时下面圆点的样式

猜你喜欢

转载自my.oschina.net/u/1177694/blog/1650006