| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364 |
- package com.bigkoo.convenientbanner;
- import android.annotation.TargetApi;
- import android.content.Context;
- import android.content.res.TypedArray;
- import android.os.Build;
- import androidx.viewpager.widget.ViewPager;
- import androidx.viewpager.widget.ViewPager.PageTransformer;
- import android.util.AttributeSet;
- import android.view.LayoutInflater;
- import android.view.MotionEvent;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.ImageView;
- import android.widget.LinearLayout;
- import android.widget.RelativeLayout;
- import com.bigkoo.convenientbanner.adapter.CBPageAdapter;
- import com.bigkoo.convenientbanner.holder.CBViewHolderCreator;
- import com.bigkoo.convenientbanner.listener.CBPageChangeListener;
- import com.bigkoo.convenientbanner.listener.OnItemClickListener;
- import com.bigkoo.convenientbanner.transformer.ScaleYTransformer;
- import com.bigkoo.convenientbanner.view.CBLoopViewPager;
- import net.zoneland.x.bpm.mobile.v1.zoneXBPM.R;
- import java.lang.ref.WeakReference;
- import java.lang.reflect.Field;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * 页面翻转控件,极方便的广告栏
- * 支持无限循环,自动翻页,翻页特效
- * @author Sai 支持自动翻页
- */
- public class ConvenientBanner<T> extends LinearLayout {
- private List<T> mDatas;
- private int[] page_indicatorId;
- private ArrayList<ImageView> mPointViews = new ArrayList<ImageView>();
- private CBPageChangeListener pageChangeListener;
- private ViewPager.OnPageChangeListener onPageChangeListener;
- private CBPageAdapter pageAdapter;
- private CBLoopViewPager viewPager;
- private ViewPagerScroller scroller;
- private ViewGroup loPageTurningPoint;
- private long autoTurningTime;
- private boolean turning;
- private boolean canTurn = false;
- private boolean manualPageable = true;
- private boolean canLoop = true;
- private boolean coverMode = false;
- public enum PageIndicatorAlign{
- ALIGN_PARENT_LEFT,ALIGN_PARENT_RIGHT,CENTER_HORIZONTAL
- }
- private AdSwitchTask adSwitchTask ;
- public ConvenientBanner(Context context) {
- super(context);
- init(context);
- }
- public ConvenientBanner(Context context, AttributeSet attrs) {
- super(context, attrs);
- TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.ConvenientBanner);
- canLoop = a.getBoolean(R.styleable.ConvenientBanner_canLoop,true);
- coverMode = a.getBoolean(R.styleable.ConvenientBanner_coverMode,false);
- a.recycle();
- init(context);
- }
- @TargetApi(Build.VERSION_CODES.HONEYCOMB)
- public ConvenientBanner(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.ConvenientBanner);
- canLoop = a.getBoolean(R.styleable.ConvenientBanner_canLoop,true);
- coverMode = a.getBoolean(R.styleable.ConvenientBanner_coverMode,false);
- a.recycle();
- init(context);
- }
- @TargetApi(Build.VERSION_CODES.LOLLIPOP)
- public ConvenientBanner(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.ConvenientBanner);
- canLoop = a.getBoolean(R.styleable.ConvenientBanner_canLoop,true);
- coverMode = a.getBoolean(R.styleable.ConvenientBanner_coverMode,false);
- a.recycle();
- init(context);
- }
- private void init(Context context) {
- View hView;
- if (coverMode){
- hView = LayoutInflater.from(context).inflate(
- R.layout.include_viewpager_cover_mode, this, true);
- }else {
- hView = LayoutInflater.from(context).inflate(
- R.layout.include_viewpager, this, true);
- }
- viewPager = (CBLoopViewPager) hView.findViewById(R.id.cbLoopViewPager);
- loPageTurningPoint = (ViewGroup) hView
- .findViewById(R.id.loPageTurningPoint);
- initViewPagerScroll();
- adSwitchTask = new AdSwitchTask(this);
- }
- static class AdSwitchTask implements Runnable {
- private final WeakReference<ConvenientBanner> reference;
- AdSwitchTask(ConvenientBanner convenientBanner) {
- this.reference = new WeakReference<ConvenientBanner>(convenientBanner);
- }
- @Override
- public void run() {
- ConvenientBanner convenientBanner = reference.get();
- if(convenientBanner != null){
- if (convenientBanner.viewPager != null && convenientBanner.turning) {
- int page = convenientBanner.viewPager.getCurrentItem() + 1;
- convenientBanner.viewPager.setCurrentItem(page);
- convenientBanner.postDelayed(convenientBanner.adSwitchTask, convenientBanner.autoTurningTime);
- }
- }
- }
- }
- public ConvenientBanner setPages(CBViewHolderCreator holderCreator,List<T> datas){
- this.mDatas = datas;
- if (coverMode){
- viewPager.setPageTransformer(false,new ScaleYTransformer());
- }
- pageAdapter = new CBPageAdapter(holderCreator,mDatas);
- viewPager.setAdapter(pageAdapter,canLoop);
- if (page_indicatorId != null)
- setPageIndicator(page_indicatorId);
- return this;
- }
- /**
- * 通知数据变化
- * 如果只是增加数据建议使用 notifyDataSetAdd()
- */
- public void notifyDataSetChanged(){
- viewPager.getAdapter().notifyDataSetChanged();
- if (page_indicatorId != null)
- setPageIndicator(page_indicatorId);
- }
- /**
- * 设置底部指示器是否可见
- *
- * @param visible
- */
- public ConvenientBanner setPointViewVisible(boolean visible) {
- loPageTurningPoint.setVisibility(visible ? View.VISIBLE : View.GONE);
- return this;
- }
- /**
- * 底部指示器资源图片
- *
- * @param page_indicatorId
- */
- public ConvenientBanner setPageIndicator(int[] page_indicatorId) {
- loPageTurningPoint.removeAllViews();
- mPointViews.clear();
- this.page_indicatorId = page_indicatorId;
- if(mDatas==null)return this;
- for (int count = 0; count < mDatas.size(); count++) {
- // 翻页指示的点
- ImageView pointView = new ImageView(getContext());
- pointView.setPadding(5, 0, 5, 0);
- if (mPointViews.isEmpty())
- pointView.setImageResource(page_indicatorId[1]);
- else
- pointView.setImageResource(page_indicatorId[0]);
- mPointViews.add(pointView);
- loPageTurningPoint.addView(pointView);
- }
- pageChangeListener = new CBPageChangeListener(mPointViews,
- page_indicatorId);
- viewPager.setOnPageChangeListener(pageChangeListener);
- pageChangeListener.onPageSelected(viewPager.getRealItem());
- if(onPageChangeListener != null)pageChangeListener.setOnPageChangeListener(onPageChangeListener);
- return this;
- }
- /**
- * 指示器的方向
- * @param align 三个方向:居左 (RelativeLayout.ALIGN_PARENT_LEFT),居中 (RelativeLayout.CENTER_HORIZONTAL),居右 (RelativeLayout.ALIGN_PARENT_RIGHT)
- * @return
- */
- public ConvenientBanner setPageIndicatorAlign(PageIndicatorAlign align) {
- RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) loPageTurningPoint.getLayoutParams();
- layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, align == PageIndicatorAlign.ALIGN_PARENT_LEFT ? RelativeLayout.TRUE : 0);
- layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, align == PageIndicatorAlign.ALIGN_PARENT_RIGHT ? RelativeLayout.TRUE : 0);
- layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL, align == PageIndicatorAlign.CENTER_HORIZONTAL ? RelativeLayout.TRUE : 0);
- loPageTurningPoint.setLayoutParams(layoutParams);
- return this;
- }
- /***
- * 是否开启了翻页
- * @return
- */
- public boolean isTurning() {
- return turning;
- }
- /***
- * 开始翻页
- * @param autoTurningTime 自动翻页时间
- * @return
- */
- public ConvenientBanner startTurning(long autoTurningTime) {
- //如果是正在翻页的话先停掉
- if(turning){
- stopTurning();
- }
- //设置可以翻页并开启翻页
- canTurn = true;
- this.autoTurningTime = autoTurningTime;
- turning = true;
- postDelayed(adSwitchTask, autoTurningTime);
- return this;
- }
- public void stopTurning() {
- turning = false;
- removeCallbacks(adSwitchTask);
- }
- /**
- * 自定义翻页动画效果
- *
- * @param transformer
- * @return
- */
- public ConvenientBanner setPageTransformer(PageTransformer transformer) {
- viewPager.setPageTransformer(true, transformer);
- return this;
- }
- /**
- * 设置ViewPager的滑动速度
- * */
- private void initViewPagerScroll() {
- try {
- Field mScroller = null;
- mScroller = ViewPager.class.getDeclaredField("mScroller");
- mScroller.setAccessible(true);
- scroller = new ViewPagerScroller(
- viewPager.getContext());
- mScroller.set(viewPager, scroller);
- } catch (NoSuchFieldException e) {
- e.printStackTrace();
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- }
- public boolean isManualPageable() {
- return viewPager.isCanScroll();
- }
- public void setManualPageable(boolean manualPageable) {
- viewPager.setCanScroll(manualPageable);
- }
- //触碰控件的时候,翻页应该停止,离开的时候如果之前是开启了翻页的话则重新启动翻页
- @Override
- public boolean dispatchTouchEvent(MotionEvent ev) {
- int action = ev.getAction();
- if (action == MotionEvent.ACTION_UP||action == MotionEvent.ACTION_CANCEL||action == MotionEvent.ACTION_OUTSIDE) {
- // 开始翻页
- if (canTurn)startTurning(autoTurningTime);
- } else if (action == MotionEvent.ACTION_DOWN) {
- // 停止翻页
- if (canTurn)stopTurning();
- }
- return super.dispatchTouchEvent(ev);
- }
- //获取当前的页面index
- public int getCurrentItem(){
- if (viewPager!=null) {
- return viewPager.getRealItem();
- }
- return -1;
- }
- //设置当前的页面index
- public void setcurrentitem(int index){
- if (viewPager!=null) {
- viewPager.setCurrentItem(index);
- }
- }
- public ViewPager.OnPageChangeListener getOnPageChangeListener() {
- return onPageChangeListener;
- }
- /**
- * 设置翻页监听器
- * @param onPageChangeListener
- * @return
- */
- public ConvenientBanner setOnPageChangeListener(ViewPager.OnPageChangeListener onPageChangeListener) {
- this.onPageChangeListener = onPageChangeListener;
- //如果有默认的监听器(即是使用了默认的翻页指示器)则把用户设置的依附到默认的上面,否则就直接设置
- if(pageChangeListener != null)pageChangeListener.setOnPageChangeListener(onPageChangeListener);
- else viewPager.setOnPageChangeListener(onPageChangeListener);
- return this;
- }
- public boolean isCanLoop() {
- return viewPager.isCanLoop();
- }
- /**
- * 监听item点击
- * @param onItemClickListener
- */
- public ConvenientBanner setOnItemClickListener(OnItemClickListener onItemClickListener) {
- if (onItemClickListener == null) {
- viewPager.setOnItemClickListener(null);
- return this;
- }
- viewPager.setOnItemClickListener(onItemClickListener);
- return this;
- }
- /**
- * 设置ViewPager的滚动速度
- * @param scrollDuration
- */
- public void setScrollDuration(int scrollDuration){
- scroller.setScrollDuration(scrollDuration);
- }
- public int getScrollDuration() {
- return scroller.getScrollDuration();
- }
- public CBLoopViewPager getViewPager() {
- return viewPager;
- }
- public void setCanLoop(boolean canLoop) {
- this.canLoop = canLoop;
- viewPager.setCanLoop(canLoop);
- }
- }
|