天天看點

自定義banner自動輪播

  1. package com.example.week01demo; import android.os.Bundle;

    import android.support.v7.app.AppCompatActivity;

    import android.widget.Toast; import com.android.volley.Response;

    import com.android.volley.VolleyError;

    import com.android.volley.toolbox.StringRequest;

    import com.android.volley.toolbox.Volley;

    import com.google.gson.Gson; import java.nio.channels.Pipe;

    import java.util.ArrayList;

    import java.util.List; public class MainActivity extends AppCompatActivity {

        private ArrayList<Integer> types=new ArrayList<>();

        private AutoBanner banner;     @Override

        protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            setContentView(R.layout.activity_main);

            banner=(AutoBanner)findViewById(R.id.banner);

            StringRequest stringRequest = new StringRequest("https://www.zhaoapi.cn/ad/getAd", new Response.Listener<String>() {

                @Override

                public void onResponse(String response) {

                    if (response != null && !response.equals("")) {

                        Gson gson=new Gson();

                     Bean bean=   gson.fromJson(response,Bean.class);

                     if(bean.getData()!=null&&bean.getData().size()>0){

                         List<Bean.DataBean> dataBeans=bean.getData();

                         ArrayList<String> urls=new ArrayList<>();

                         types.clear();

                         for(int i=0;i<dataBeans.size();i++){

                             Bean.DataBean bean1=dataBeans.get(i);

                             if(bean1!=null&&bean1.getIcon()!=null&&!bean1.getIcon().equals("")){

                                urls.add( bean1.getIcon());

                                types.add(bean1.getType());

                             }

                         }

                         banner.load(urls).setOnAutoBannerListener(new AutoBanner.AutoBannerListener() {

                             @Override

                             public void onClickListener(int postion) {

                                 int type=types.get(postion);

                                 Toast.makeText(MainActivity.this,types.get(postion)+"",Toast.LENGTH_SHORT).show();

                             }

                         }).display();

                     }

                    }             }

            }, new Response.ErrorListener() {

                @Override

                public void onErrorResponse(VolleyError error) {             }

            });

            Volley.newRequestQueue(this).add(stringRequest);     }     @Override

        protected void onStart() {

            super.onStart();

            banner.startAuto();

        }

    }

  2. package com.example.week01demo; import android.content.Context;

    import android.support.v4.view.PagerAdapter;

    import android.view.View;

    import android.view.ViewGroup;

    import android.widget.ImageView; import com.bumptech.glide.Glide; import java.util.ArrayList;

    import java.util.List; public class AutoBannerPagerAdapter extends PagerAdapter {

        private Context mContext;

        private List<String> mImgUrls;

        private List<View> mImageViews;

        private AutoBanner.AutoBannerListener mAutoBannerListener;

        public AutoBannerPagerAdapter(Context context,List<String> urls,AutoBanner.AutoBannerListener mAutoBannerListener){

            this.mContext=context;

            this.mImgUrls=urls;

            this.mAutoBannerListener=mAutoBannerListener;

            mImageViews=new ArrayList<>();

            for (int i = 0; i < urls.size(); i++) {

                ImageView imageView = new ImageView(mContext);

                imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);

                mImageViews.add(imageView);

            }

        }

        @Override

        public int getCount() {

            return mImageViews.size();

        }     @Override

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

        }     @Override

        public Object instantiateItem(ViewGroup container, final int position) {

            container.addView(mImageViews.get(position));

            ImageView view = (ImageView) mImageViews.get(position);

            Glide.with(mContext).load(mImgUrls.get(position)).into(view);

            if (mAutoBannerListener != null) {

                view.setOnClickListener(new View.OnClickListener() {

                    @Override

                    public void onClick(View v) {

                        mAutoBannerListener.onClickListener(position);

                    }

                });

            }

            return view;

        }     @Override

        public void destroyItem(ViewGroup container, int position, Object object) {

            container.removeView((View) object);

        }

    }

  3. package com.example.week01demo; import android.content.Context;

    import android.os.Handler;

    import android.support.annotation.NonNull;

    import android.support.annotation.Nullable;

    import android.support.v4.view.ViewPager;

    import android.util.AttributeSet;

    import android.util.Log;

    import android.view.LayoutInflater;

    import android.view.MotionEvent;

    import android.view.View;

    import android.view.ViewGroup;

    import android.widget.FrameLayout;

    import android.widget.ImageView;

    import android.widget.LinearLayout; import java.util.ArrayList;

    import java.util.List; public class AutoBanner extends FrameLayout implements ViewPager.OnPageChangeListener{

        private Context mContext;

        private List<String> mImgUrls;

        private List<ImageView> mIndicatorViews;

        private LinearLayout mIndicatorLayout;

        private ViewPager mViewPager;

        private AutoBannerListener mAutoBannerListener;

        private AutoBannerPagerAdapter mAutoBannerPagerAdapter;

        private int count;

        private float ratio = 1.78f;//圖檔寬高比

        //自動輪播

        private boolean isAuto=true;

        private Handler mAutoHandler = new Handler();

        private int currentItem;

        private int delayTime = 1000;     public AutoBanner(@NonNull Context context) {

            super(context);

            init(context);

        }     public AutoBanner(@NonNull Context context, @Nullable AttributeSet attrs) {

            super(context, attrs);

            init(context);

        }     public AutoBanner(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {

            super(context, attrs, defStyleAttr);

            init(context);

        }     private void init(Context context){

            this.mContext = context;

            mImgUrls = new ArrayList<>();

            mIndicatorViews = new ArrayList<>();

            View view = LayoutInflater.from(context).inflate(R.layout.auto_banner_layout, this, true);

            mViewPager = (ViewPager) view.findViewById(R.id.banner_viewpager);

            mIndicatorLayout = (LinearLayout) view.findViewById(R.id.circleIndicator);

        }     @Override

        protected void onLayout(boolean changed, int left, int top, int right, int bottom) {

            super.onLayout(changed, left, top, right, bottom);

            initViewPagerParams();

        }    

        private void initViewPagerParams() {

            ViewGroup.LayoutParams params = mViewPager.getLayoutParams();

            params.width = getMeasuredWidth();

            params.height = (int) (params.width / ratio);

            mViewPager.setLayoutParams(params);     }

        public AutoBanner load(List<String> imgs) {

            this.mImgUrls = imgs;

            this.count = mImgUrls.size();

            return this;

        }

        public AutoBanner display() {

            //viewpager的設定

            setViewPager();

            //小圓點設定

            setIndicators();

            return this;

        }

        private void setViewPager() {

            if (count == 0) {

                return;

            }

            if (mAutoBannerPagerAdapter == null) {

                mAutoBannerPagerAdapter = new AutoBannerPagerAdapter(mContext,mImgUrls,mAutoBannerListener);

                mViewPager.addOnPageChangeListener(this);

            }         mViewPager.setAdapter(mAutoBannerPagerAdapter);

            mViewPager.setCurrentItem(0);         if (isAuto) {

                startAuto();

            }

        }

        public void startAuto() {

            mAutoHandler.removeCallbacks(task);

            mAutoHandler.postDelayed(task, delayTime);

        }     public void stopAuto() {

            mAutoHandler.removeCallbacks(task);

        }     private final Runnable task = new Runnable() {

            @Override

            public void run() {

                if (count > 1 && isAuto) {                 if (currentItem >= count) {

                        currentItem = 0;

                    }

                    mViewPager.setCurrentItem(currentItem);

                    mAutoHandler.postDelayed(task, delayTime);

                    Log.i("autobanner", "curr:" + currentItem + " count:" + count);

                }

            }

        };     private void setIndicators() {         mIndicatorViews.clear();

            mIndicatorLayout.removeAllViews();

            if (count < 2) {//一個view時不繪制訓示器

                return;

            }

            for (int i = 0; i < count; i++) {             ImageView imageView = new ImageView(mContext);

                imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);

                LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(30, 30);

                layoutParams.leftMargin = 30;

                layoutParams.rightMargin = 30;

                if (i == 0) {

                    imageView.setImageResource(R.drawable.indicator_selected);

                } else {

                    imageView.setImageResource(R.drawable.indicator_unselect);

                }

    //添加進數組

                mIndicatorViews.add(imageView);

    //添加進試圖。LinearLayout

                mIndicatorLayout.addView(imageView, layoutParams);

            }

        }

        public AutoBanner setOnAutoBannerListener(AutoBannerListener listener) {         this.mAutoBannerListener = listener;         return this;     }     @Override

        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            currentItem = position % count + 1;     }     @Override

        public void onPageSelected(int position) {         for (int i = 0; i < count; i++) {             if (i == position) {

                    mIndicatorViews.get(i).setImageResource(R.drawable.indicator_selected);

                } else {

                    mIndicatorViews.get(i).setImageResource(R.drawable.indicator_unselect);

                }         }     }     @Override

        public void onPageScrollStateChanged(int state) {     }

        public interface AutoBannerListener {

            void onClickListener(int postion);

        }

    //監聽手勢點選;

        @Override

        public boolean dispatchTouchEvent(MotionEvent ev) {

            if (isAuto) {

                int action = ev.getAction();

                if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL

                        || action == MotionEvent.ACTION_OUTSIDE) {

                    startAuto();

                } else if (action == MotionEvent.ACTION_DOWN) {

                    stopAuto();

                }

            }

            return super.dispatchTouchEvent(ev);

        }

    }

  4. <?xml version="1.0" encoding="utf-8"?>

    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"

        xmlns:app="http://schemas.android.com/apk/res-auto"

        xmlns:tools="http://schemas.android.com/tools"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        tools:context="com.example.week01demo.MainActivity">     <com.example.week01demo.AutoBanner

            android:id="@+id/banner"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"></com.example.week01demo.AutoBanner> </android.support.constraint.ConstraintLayout>

  5. <?xml version="1.0" encoding="utf-8"?>

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"

        android:layout_width="match_parent"

        android:layout_height="wrap_content">     <android.support.v4.view.ViewPager

            android:id="@+id/banner_viewpager"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:visibility="visible"/>     <LinearLayout

            android:id="@+id/circleIndicator"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_gravity="bottom"

            android:gravity="center"

            android:orientation="horizontal"

            android:padding="10dp" /> </FrameLayout>

  6. apply plugin: 'com.android.application' android {

        compileSdkVersion 26

        buildToolsVersion "27.0.1"

        defaultConfig {

            applicationId "com.example.week01demo"

            minSdkVersion 21

            targetSdkVersion 26

            versionCode 1

            versionName "1.0"         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"     }     buildTypes {

            release {

                minifyEnabled false

                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

            }

        } } dependencies {

        compile fileTree(dir: 'libs', include: ['*.jar'])

        compile 'com.android.support:appcompat-v7:26.1.0'

        compile 'com.android.support.constraint:constraint-layout:1.0.2'

        testCompile 'junit:junit:4.12'

        androidTestCompile('com.android.support.test.espresso:espresso-core:3.0.1', {

            exclude group: 'com.android.support', module: 'support-annotations'

        })

        compile 'com.mcxiaoke.volley:library:1.0.19'

        compile 'com.github.bumptech.glide:glide:4.0.0-RC1'

        compile 'com.google.code.gson:gson:2.6.2'

    }