Browse Source

Fix a bug,that Banner can't display when get data from server.

zhangpan 5 years ago
parent
commit
9ba615c084
27 changed files with 1024 additions and 296 deletions
  1. 16 3
      app/build.gradle
  2. 4 3
      app/src/main/AndroidManifest.xml
  3. 23 0
      app/src/main/java/com/example/zhpan/circleviewpager/App.java
  4. 3 0
      app/src/main/java/com/example/zhpan/circleviewpager/activity/MainActivity.java
  5. 39 0
      app/src/main/java/com/example/zhpan/circleviewpager/activity/NetworkBannerActivity.java
  6. 116 0
      app/src/main/java/com/example/zhpan/circleviewpager/imageloader/GlideImageLoader.java
  7. 11 0
      app/src/main/java/com/example/zhpan/circleviewpager/imageloader/IImageLoaderStrategy.java
  8. 38 0
      app/src/main/java/com/example/zhpan/circleviewpager/imageloader/ImageLoaderManager.java
  9. 248 0
      app/src/main/java/com/example/zhpan/circleviewpager/imageloader/ImageLoaderOptions.java
  10. 11 0
      app/src/main/java/com/example/zhpan/circleviewpager/imageloader/ScaleType.java
  11. 247 0
      app/src/main/java/com/example/zhpan/circleviewpager/imageloader/transformer/BlurTransformation.java
  12. 18 0
      app/src/main/java/com/example/zhpan/circleviewpager/net/ApiService.java
  13. 94 0
      app/src/main/java/com/example/zhpan/circleviewpager/net/BannerData.java
  14. 11 0
      app/src/main/java/com/example/zhpan/circleviewpager/net/Constants.java
  15. 20 0
      app/src/main/java/com/example/zhpan/circleviewpager/net/RetrofitGnerator.java
  16. 0 54
      app/src/main/java/com/example/zhpan/circleviewpager/utils/GlideCircleTransform.java
  17. 0 55
      app/src/main/java/com/example/zhpan/circleviewpager/utils/GlideRoundTransform.java
  18. 0 149
      app/src/main/java/com/example/zhpan/circleviewpager/utils/ImageLoaderUtil.java
  19. 4 4
      app/src/main/java/com/example/zhpan/circleviewpager/viewholder/DataViewHolder.java
  20. 40 0
      app/src/main/java/com/example/zhpan/circleviewpager/viewholder/NetViewHolder.java
  21. 8 0
      app/src/main/res/layout/activity_main.xml
  22. 14 0
      app/src/main/res/layout/activity_network_banner.xml
  23. 18 0
      bannerview/src/main/java/com/zhpan/bannerview/Utils/DpUtils.java
  24. 20 27
      bannerview/src/main/java/com/zhpan/bannerview/view/BannerViewPager.java
  25. 4 0
      bannerview/src/main/java/com/zhpan/bannerview/view/IndicatorView.java
  26. 16 0
      build.gradle
  27. 1 1
      settings.gradle

+ 16 - 3
app/build.gradle

@@ -44,8 +44,21 @@ dependencies {
     })
     implementation 'com.android.support:appcompat-v7:26.1.0'
     testImplementation 'junit:junit:4.12'
-    implementation 'com.github.bumptech.glide:glide:3.7.0'
+    implementation 'com.github.bumptech.glide:glide:4.0.0'
     implementation 'com.github.chrisbanes:PhotoView:2.1.0'
-    implementation 'com.zhpan.library:bannerview:2.1.0.1'
-//    implementation project(path: ':bannerview')
+//    implementation 'com.zhpan.library:bannerview:2.1.0.1'
+    implementation project(path: ':bannerview')
+
+    api "io.reactivex.rxjava2:rxjava:$rootProject.ext.rxjava2Version"
+    api "com.squareup.retrofit2:retrofit:$rootProject.ext.retrofit2Version"
+    api "com.squareup.retrofit2:converter-scalars:$rootProject.ext.retrofit2Version"
+    api "com.squareup.retrofit2:converter-gson:$rootProject.ext.retrofit2Version"
+    api "com.squareup.retrofit2:adapter-rxjava2:$rootProject.ext.retrofit2Version"
+    api "com.trello.rxlifecycle2:rxlifecycle:$rootProject.ext.rxlifecycle"
+    //compile "com.trello.rxlifecycle2:rxlifecycle-android:$rootProject.ext.rxlifecycle"
+    api "com.trello.rxlifecycle2:rxlifecycle-components:$rootProject.ext.rxlifecycle"
+    api 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
+    api 'io.reactivex.rxjava2:rxandroid:2.1.0'
+    api 'com.squareup.okhttp3:logging-interceptor:3.10.0'
+    implementation project(path: ':ideahttp')
 }

+ 4 - 3
app/src/main/AndroidManifest.xml

@@ -3,17 +3,18 @@
     package="com.example.zhpan.circleviewpager">
 
     <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 
     <application
+        android:name=".App"
         android:allowBackup="true"
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
         android:supportsRtl="true"
         android:theme="@style/AppTheme">
-
+        <activity android:name=".activity.NetworkBannerActivity"></activity>
         <activity android:name=".activity.CustomerBannerActivity" />
-        <activity
-            android:name=".activity.BannerPhotoViewActivity" />
+        <activity android:name=".activity.BannerPhotoViewActivity" />
         <activity android:name=".activity.ViewPagerActivity" />
         <activity android:name=".activity.MainActivity">
             <intent-filter>

+ 23 - 0
app/src/main/java/com/example/zhpan/circleviewpager/App.java

@@ -0,0 +1,23 @@
+package com.example.zhpan.circleviewpager;
+
+import android.app.Application;
+
+import com.example.zhpan.circleviewpager.imageloader.GlideImageLoader;
+import com.example.zhpan.circleviewpager.imageloader.ImageLoaderManager;
+import com.zhpan.idea.utils.Utils;
+
+/**
+ * <pre>
+ *   Created by zhangpan on 2019-08-14.
+ *   Description:
+ * </pre>
+ */
+public class App extends Application {
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        ImageLoaderManager.getInstance().init(new GlideImageLoader());
+        Utils.init(getApplicationContext());
+    }
+}

+ 3 - 0
app/src/main/java/com/example/zhpan/circleviewpager/activity/MainActivity.java

@@ -32,6 +32,9 @@ public class MainActivity extends AppCompatActivity {
             case R.id.btn_view_pager3:
                 intent = new Intent(this, BannerPhotoViewActivity.class);
                 break;
+            case R.id.btn_view_pager4:
+                intent = new Intent(this, NetworkBannerActivity.class);
+                break;
             default:
                 intent = new Intent(this, ViewPagerActivity.class);
                 break;

+ 39 - 0
app/src/main/java/com/example/zhpan/circleviewpager/activity/NetworkBannerActivity.java

@@ -0,0 +1,39 @@
+package com.example.zhpan.circleviewpager.activity;
+
+import android.os.Bundle;
+import android.widget.Toast;
+
+import com.example.zhpan.circleviewpager.R;
+import com.example.zhpan.circleviewpager.net.BannerData;
+import com.example.zhpan.circleviewpager.net.RetrofitGnerator;
+import com.example.zhpan.circleviewpager.viewholder.NetViewHolder;
+import com.trello.rxlifecycle2.components.support.RxAppCompatActivity;
+import com.zhpan.bannerview.view.BannerViewPager;
+import com.zhpan.idea.net.common.DefaultObserver;
+import com.zhpan.idea.utils.RxUtil;
+
+import java.util.List;
+
+public class NetworkBannerActivity extends RxAppCompatActivity {
+
+    BannerViewPager<BannerData, NetViewHolder> mBannerViewPager;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_network_banner);
+        mBannerViewPager = findViewById(R.id.banner_view);
+        mBannerViewPager.showIndicator(false)
+                .setInterval(3000)
+                .setIndicatorGravity(BannerViewPager.END)
+                .setScrollDuration(1000).setHolderCreator(NetViewHolder::new)
+                .setOnPageClickListener(position -> Toast.makeText(NetworkBannerActivity.this,
+                        "点击了图片" + position, Toast.LENGTH_SHORT).show()).create();
+        RetrofitGnerator.getApiSerVice().getBannerData().compose(RxUtil.rxSchedulerHelper(this)).subscribe(new DefaultObserver<List<BannerData>>() {
+            @Override
+            public void onSuccess(List<BannerData> response) {
+                mBannerViewPager.setData(response);
+            }
+        });
+    }
+}

+ 116 - 0
app/src/main/java/com/example/zhpan/circleviewpager/imageloader/GlideImageLoader.java

@@ -0,0 +1,116 @@
+package com.example.zhpan.circleviewpager.imageloader;
+
+import android.graphics.Bitmap;
+import android.text.TextUtils;
+
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.RequestBuilder;
+import com.bumptech.glide.RequestManager;
+import com.bumptech.glide.load.Transformation;
+import com.bumptech.glide.load.engine.DiskCacheStrategy;
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
+import com.bumptech.glide.request.RequestOptions;
+import com.example.zhpan.circleviewpager.imageloader.transformer.BlurTransformation;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <pre>
+ *   Created by zhangpan on 2019-08-12.
+ *   Description:
+ * </pre>
+ */
+public class GlideImageLoader implements IImageLoaderStrategy {
+
+    @Override
+    public void loadImage(ImageLoaderOptions options) {
+        getRequestBuilder(options).apply(getRequestOption(options)).into(options.getImageView());
+    }
+
+    private RequestOptions getRequestOption(ImageLoaderOptions options) {
+        RequestOptions requestOptions = new RequestOptions();
+        setScaleType(options.getScaleType(), requestOptions);
+        setDiskCacheStrategy(options.getDiskCacheStrategy(), requestOptions);
+        setDrawable(options, requestOptions);
+        setTransformation(options, requestOptions);
+        requestOptions.skipMemoryCache(options.isSkipMemoryCache());
+        if(options.getImageSize() != null) {
+            requestOptions.override(options.getImageSize().getImageWidth(),
+                    options.getImageSize().getImageHeight());
+        }
+        return requestOptions;
+    }
+
+    private void setDrawable(ImageLoaderOptions options, RequestOptions requestOptions) {
+        if(options.getPlaceholder() != -1) {
+            requestOptions.placeholder(options.getPlaceholder());
+        }
+        if(options.getErrorDrawable() != -1) {
+            requestOptions.error(options.getErrorDrawable());
+        }
+    }
+
+    private void setTransformation(ImageLoaderOptions options, RequestOptions requestOptions) {
+        List<Transformation<Bitmap>> list = new ArrayList<>();
+        if(options.getRoundCorner() > 0) {
+            list.add(new RoundedCorners((int)options.getRoundCorner()));
+        }
+
+        if(options.isBlurImage()) {
+            list.add(new BlurTransformation(options.getBlurValue()));
+        }
+
+        for(Transformation<Bitmap> transformation : list) {
+            requestOptions.transform(transformation);
+        }
+    }
+
+    private void setDiskCacheStrategy(ImageLoaderOptions.ImageDiskCacheStrategy diskCacheStrategy,
+            RequestOptions requestOptions) {
+        if(diskCacheStrategy != ImageLoaderOptions.ImageDiskCacheStrategy.DEFAULT) {
+            if(ImageLoaderOptions.ImageDiskCacheStrategy.NONE == diskCacheStrategy) {
+                requestOptions.diskCacheStrategy(DiskCacheStrategy.NONE);
+            } else if(ImageLoaderOptions.ImageDiskCacheStrategy.All == diskCacheStrategy) {
+                requestOptions.diskCacheStrategy(DiskCacheStrategy.ALL);
+            } else if(ImageLoaderOptions.ImageDiskCacheStrategy.SOURCE == diskCacheStrategy) {
+                requestOptions.diskCacheStrategy(DiskCacheStrategy.RESOURCE);
+            } else if(ImageLoaderOptions.ImageDiskCacheStrategy.RESULT == diskCacheStrategy) {
+                requestOptions.diskCacheStrategy(DiskCacheStrategy.DATA);
+            }
+        }
+    }
+
+    private void setScaleType(ScaleType scaleType, RequestOptions requestOptions) {
+        switch(scaleType) {
+            case CENTER_INSIDE:
+                requestOptions.centerInside();
+                break;
+            case CENTER_OUTSIDE:
+                requestOptions.centerInside();
+                break;
+            case CENTER_CROP:
+                requestOptions.centerCrop();
+                break;
+            case FIT_CENTER:
+            case DEFAULT:
+                requestOptions.fitCenter();
+                break;
+            default:
+                break;
+        }
+    }
+
+    private RequestBuilder getRequestBuilder(ImageLoaderOptions options) {
+        RequestManager requestManager = Glide.with(options.getImageView());
+        RequestBuilder builder =
+                options.isAsGif() ? requestManager.asGif() : requestManager.asBitmap();
+        builder.load(options.getResource());
+        if(TextUtils.isEmpty(options.getUrl())) {
+            builder.load(options.getResource());
+        } else {
+            builder.load(options.getUrl());
+        }
+        return builder;
+    }
+}

+ 11 - 0
app/src/main/java/com/example/zhpan/circleviewpager/imageloader/IImageLoaderStrategy.java

@@ -0,0 +1,11 @@
+package com.example.zhpan.circleviewpager.imageloader;
+
+/**
+ * <pre>
+ *   Created by zhangpan on 2019-08-12.
+ *   Description:
+ * </pre>
+ */
+public interface IImageLoaderStrategy {
+    void loadImage(ImageLoaderOptions options);
+}

+ 38 - 0
app/src/main/java/com/example/zhpan/circleviewpager/imageloader/ImageLoaderManager.java

@@ -0,0 +1,38 @@
+package com.example.zhpan.circleviewpager.imageloader;
+
+/**
+ * <pre>
+ *   Created by zhangpan on 2019-08-12.
+ *   Description:
+ * </pre>
+ */
+public class ImageLoaderManager {
+
+    private static volatile ImageLoaderManager mImageLoaderManager;
+
+    private IImageLoaderStrategy imageLoader;
+
+    private ImageLoaderManager() {}
+
+    public static ImageLoaderManager getInstance() {
+        if(mImageLoaderManager == null) {
+            synchronized (ImageLoaderManager.class) {
+                if(mImageLoaderManager == null) {
+                    mImageLoaderManager = new ImageLoaderManager();
+                }
+            }
+        }
+        return mImageLoaderManager;
+    }
+
+
+    public void loadImage(ImageLoaderOptions options) {
+        if(imageLoader != null) {
+            imageLoader.loadImage(options);
+        }
+    }
+
+    public void init(IImageLoaderStrategy imageLoader) {
+        this.imageLoader = imageLoader;
+    }
+}

+ 248 - 0
app/src/main/java/com/example/zhpan/circleviewpager/imageloader/ImageLoaderOptions.java

@@ -0,0 +1,248 @@
+package com.example.zhpan.circleviewpager.imageloader;
+
+import android.content.Context;
+import android.support.annotation.DimenRes;
+import android.support.annotation.DrawableRes;
+import android.widget.ImageView;
+
+import com.zhpan.idea.utils.DensityUtils;
+
+
+/**
+ * <pre>
+ *   Created by zhangpan on 2019-08-12.
+ *   Description:
+ * </pre>
+ */
+public class ImageLoaderOptions {
+
+    private ImageView mImageView;
+
+    private String url;
+
+    private @DrawableRes
+    int resource;
+
+    private @DrawableRes
+    int placeholder;
+
+    private @DrawableRes
+    int errorDrawable;
+
+    private boolean asGif;
+
+    private boolean isCrossFade;
+
+    private boolean skipMemoryCache;
+
+    private float roundCorner;
+
+    private boolean blurImage;
+
+    // 高斯模糊参数,越大越模糊
+    private int blurValue;
+
+    private ScaleType mScaleType;
+
+    private ImageSize mImageSize;
+
+    private ImageDiskCacheStrategy mDiskCacheStrategy;
+
+
+    private ImageLoaderOptions(Builder builder) {
+        this.mImageView = builder.mImageView;
+        this.url = builder.url;
+        this.resource = builder.resource;
+        this.placeholder = builder.placeholder;
+        this.errorDrawable = builder.errorDrawable;
+        this.asGif = builder.asGif;
+        this.isCrossFade = builder.isCrossFade;
+        this.skipMemoryCache = builder.skipMemoryCache;
+        this.mDiskCacheStrategy = builder.mDiskCacheStrategy;
+        this.roundCorner = builder.roundCorner;
+        this.blurImage = builder.blurImage;
+        this.blurValue = builder.blurValue;
+        this.mScaleType = builder.mScaleType;
+        this.mImageSize = builder.mImageSize;
+
+    }
+
+    public ImageView getImageView() {
+        return mImageView;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public int getResource() {
+        return resource;
+    }
+
+    public int getPlaceholder() {
+        return placeholder;
+    }
+
+    public int getErrorDrawable() {
+        return errorDrawable;
+    }
+
+    public boolean isAsGif() {
+        return asGif;
+    }
+
+    public boolean isCrossFade() {
+        return isCrossFade;
+    }
+
+    public boolean isSkipMemoryCache() {
+        return skipMemoryCache;
+    }
+
+    public float getRoundCorner() {
+        return roundCorner;
+    }
+
+    public boolean isBlurImage() {
+        return blurImage;
+    }
+
+    public int getBlurValue() {
+        return blurValue;
+    }
+
+    public ScaleType getScaleType() {
+        return mScaleType;
+    }
+
+    public ImageSize getImageSize() {
+        return mImageSize;
+    }
+
+    public ImageDiskCacheStrategy getDiskCacheStrategy() {
+        return mDiskCacheStrategy;
+    }
+
+    public static class Builder {
+        private ImageView mImageView;
+        private String url;
+        private @DrawableRes
+        int resource = -1;
+        private @DrawableRes
+        int placeholder = -1;
+        private @DrawableRes
+        int errorDrawable = -1;
+        private boolean asGif;
+        private boolean isCrossFade = true;
+        private boolean skipMemoryCache;
+        private float roundCorner;
+        private boolean blurImage;
+        private int blurValue; // 高斯模糊参数,越大越模糊
+        private ScaleType mScaleType = ScaleType.DEFAULT;
+        private ImageSize mImageSize;
+
+        private ImageDiskCacheStrategy mDiskCacheStrategy = ImageDiskCacheStrategy.DEFAULT;
+
+        public Builder into(ImageView imageView) {
+            this.mImageView = imageView;
+            return this;
+        }
+
+        public Builder load(String url) {
+            this.url = url;
+            return this;
+        }
+
+        public Builder load(@DrawableRes int resource) {
+            this.resource = resource;
+            return this;
+        }
+
+        public Builder placeHolder(@DrawableRes int placeholder) {
+            this.placeholder = placeholder;
+            return this;
+        }
+
+        public Builder isCrossFade(boolean isCrossFade) {
+            this.isCrossFade = isCrossFade;
+            return this;
+        }
+
+        public Builder isSkipMemoryCache(boolean skipMemoryCache) {
+            this.skipMemoryCache = skipMemoryCache;
+            return this;
+        }
+
+        public Builder asGif(boolean asGif) {
+            this.asGif = asGif;
+            return this;
+        }
+
+        public Builder error(@DrawableRes int errorDrawable) {
+            this.errorDrawable = errorDrawable;
+            return this;
+        }
+
+        public Builder diskCacheStrategy(ImageDiskCacheStrategy mDiskCacheStrategy) {
+            this.mDiskCacheStrategy = mDiskCacheStrategy;
+            return this;
+        }
+
+        public Builder setRoundCorner(Context context, float roundCornerDp) {
+            this.roundCorner = DensityUtils.dp2px(context, roundCornerDp);
+            return this;
+        }
+
+        public Builder setRoundCorner(Context context, @DimenRes int cornerRes) {
+            this.roundCorner = context.getResources().getDimension(cornerRes);
+            return this;
+        }
+
+        public Builder setBlurImage(int blurValue) {
+            this.blurImage = true;
+            this.blurValue = blurValue;
+            return this;
+        }
+
+        public Builder setScaleType(ScaleType scaleType) {
+            mScaleType = scaleType;
+            return this;
+        }
+
+        public Builder override(int imageWidth, int imageHeight) {
+            this.mImageSize = new ImageSize(imageWidth, imageHeight);
+            return this;
+        }
+
+
+        public ImageLoaderOptions build() {
+            return new ImageLoaderOptions(this);
+        }
+
+    }
+
+    public static class ImageSize {
+        private int imageWidth;
+
+        private int imageHeight;
+
+        public ImageSize(int imageWidth, int imageHeight) {
+            this.imageWidth = imageWidth;
+            this.imageHeight = imageHeight;
+        }
+
+        public int getImageWidth() {
+            return imageWidth;
+        }
+
+        public int getImageHeight() {
+            return imageHeight;
+        }
+    }
+
+
+    // 对应磁盘缓存策略
+    public enum ImageDiskCacheStrategy {
+        All, NONE, SOURCE, RESULT, DEFAULT
+    }
+}

+ 11 - 0
app/src/main/java/com/example/zhpan/circleviewpager/imageloader/ScaleType.java

@@ -0,0 +1,11 @@
+package com.example.zhpan.circleviewpager.imageloader;
+
+/**
+ * <pre>
+ *   Created by zhangpan on 2019-08-13.
+ *   Description:
+ * </pre>
+ */
+public enum ScaleType {
+    DEFAULT, FIT_CENTER, CENTER_OUTSIDE, CENTER_INSIDE, CENTER_CROP
+}

+ 247 - 0
app/src/main/java/com/example/zhpan/circleviewpager/imageloader/transformer/BlurTransformation.java

@@ -0,0 +1,247 @@
+package com.example.zhpan.circleviewpager.imageloader.transformer;
+
+import android.graphics.Bitmap;
+import android.support.annotation.IntRange;
+import android.support.annotation.NonNull;
+
+import com.bumptech.glide.load.Key;
+import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
+import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
+
+import java.security.MessageDigest;
+
+public class BlurTransformation extends BitmapTransformation {
+    private static final String ID = BlurTransformation.class.getName();
+    private static final byte[] ID_BYTES = ID.getBytes(Key.CHARSET);
+
+    private int defaultRadius = 15;
+
+    public BlurTransformation(@IntRange(from = 0) int radius) {
+        defaultRadius = radius;
+    }
+
+    @Override
+    public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {
+        messageDigest.update(ID_BYTES);
+
+    }
+
+    @Override
+    protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth,
+                               int outHeight) {
+        return fastBlur(toTransform, defaultRadius);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        return o instanceof BlurTransformation;
+    }
+
+    @Override
+    public int hashCode() {
+        return ID.hashCode();
+    }
+
+    private static Bitmap fastBlur(Bitmap sentBitmap, int radius) {
+        // Bitmap bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);
+        if(sentBitmap == null) {
+            return null;
+        }
+        if(radius < 1) {
+            return null;
+        }
+
+        int w = sentBitmap.getWidth();
+        int h = sentBitmap.getHeight();
+
+        int[] pix = new int[w * h];
+        // Log.e("pix", w + " " + h + " " + pix.length);
+        sentBitmap.getPixels(pix, 0, w, 0, 0, w, h);
+
+        int wm = w - 1;
+        int hm = h - 1;
+        int wh = w * h;
+        int div = radius + radius + 1;
+
+        int r[] = new int[wh];
+        int g[] = new int[wh];
+        int b[] = new int[wh];
+        int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;
+        int vmin[] = new int[Math.max(w, h)];
+
+        int divsum = (div + 1) >> 1;
+        divsum *= divsum;
+        int temp = 256 * divsum;
+        int dv[] = new int[temp];
+        for(i = 0; i < temp; i++) {
+            dv[i] = (i / divsum);
+        }
+
+        yw = yi = 0;
+
+        int[][] stack = new int[div][3];
+        int stackpointer;
+        int stackstart;
+        int[] sir;
+        int rbs;
+        int r1 = radius + 1;
+        int routsum, goutsum, boutsum;
+        int rinsum, ginsum, binsum;
+
+        for(y = 0; y < h; y++) {
+            rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
+            for(i = -radius; i <= radius; i++) {
+                p = pix[yi + Math.min(wm, Math.max(i, 0))];
+                sir = stack[i + radius];
+                sir[0] = (p & 0xff0000) >> 16;
+                sir[1] = (p & 0x00ff00) >> 8;
+                sir[2] = (p & 0x0000ff);
+                rbs = r1 - Math.abs(i);
+                rsum += sir[0] * rbs;
+                gsum += sir[1] * rbs;
+                bsum += sir[2] * rbs;
+                if(i > 0) {
+                    rinsum += sir[0];
+                    ginsum += sir[1];
+                    binsum += sir[2];
+                } else {
+                    routsum += sir[0];
+                    goutsum += sir[1];
+                    boutsum += sir[2];
+                }
+            }
+            stackpointer = radius;
+
+            for(x = 0; x < w; x++) {
+
+                r[yi] = dv[rsum];
+                g[yi] = dv[gsum];
+                b[yi] = dv[bsum];
+
+                rsum -= routsum;
+                gsum -= goutsum;
+                bsum -= boutsum;
+
+                stackstart = stackpointer - radius + div;
+                sir = stack[stackstart % div];
+
+                routsum -= sir[0];
+                goutsum -= sir[1];
+                boutsum -= sir[2];
+
+                if(y == 0) {
+                    vmin[x] = Math.min(x + radius + 1, wm);
+                }
+                p = pix[yw + vmin[x]];
+
+                sir[0] = (p & 0xff0000) >> 16;
+                sir[1] = (p & 0x00ff00) >> 8;
+                sir[2] = (p & 0x0000ff);
+
+                rinsum += sir[0];
+                ginsum += sir[1];
+                binsum += sir[2];
+
+                rsum += rinsum;
+                gsum += ginsum;
+                bsum += binsum;
+
+                stackpointer = (stackpointer + 1) % div;
+                sir = stack[(stackpointer) % div];
+
+                routsum += sir[0];
+                goutsum += sir[1];
+                boutsum += sir[2];
+
+                rinsum -= sir[0];
+                ginsum -= sir[1];
+                binsum -= sir[2];
+                yi++;
+            }
+            yw += w;
+        }
+        for(x = 0; x < w; x++) {
+            rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
+            yp = -radius * w;
+            for(i = -radius; i <= radius; i++) {
+                yi = Math.max(0, yp) + x;
+
+                sir = stack[i + radius];
+
+                sir[0] = r[yi];
+                sir[1] = g[yi];
+                sir[2] = b[yi];
+
+                rbs = r1 - Math.abs(i);
+
+                rsum += r[yi] * rbs;
+                gsum += g[yi] * rbs;
+                bsum += b[yi] * rbs;
+
+                if(i > 0) {
+                    rinsum += sir[0];
+                    ginsum += sir[1];
+                    binsum += sir[2];
+                } else {
+                    routsum += sir[0];
+                    goutsum += sir[1];
+                    boutsum += sir[2];
+                }
+
+                if(i < hm) {
+                    yp += w;
+                }
+            }
+            yi = x;
+            stackpointer = radius;
+            for(y = 0; y < h; y++) {
+                // Preserve alpha channel: ( 0xff000000 & pix[yi] )
+                pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16) | (dv[gsum] << 8) | dv[bsum];
+
+                rsum -= routsum;
+                gsum -= goutsum;
+                bsum -= boutsum;
+
+                stackstart = stackpointer - radius + div;
+                sir = stack[stackstart % div];
+
+                routsum -= sir[0];
+                goutsum -= sir[1];
+                boutsum -= sir[2];
+
+                if(x == 0) {
+                    vmin[y] = Math.min(y + r1, hm) * w;
+                }
+                p = x + vmin[y];
+
+                sir[0] = r[p];
+                sir[1] = g[p];
+                sir[2] = b[p];
+
+                rinsum += sir[0];
+                ginsum += sir[1];
+                binsum += sir[2];
+
+                rsum += rinsum;
+                gsum += ginsum;
+                bsum += binsum;
+
+                stackpointer = (stackpointer + 1) % div;
+                sir = stack[stackpointer];
+
+                routsum += sir[0];
+                goutsum += sir[1];
+                boutsum += sir[2];
+
+                rinsum -= sir[0];
+                ginsum -= sir[1];
+                binsum -= sir[2];
+
+                yi += w;
+            }
+        }
+        // bitmap.setPixels(pix, 0, w, 0, 0, w, h);
+        // return (bitmap);
+        return Bitmap.createBitmap(pix, 0, w, w, h, Bitmap.Config.ARGB_8888);
+    }
+}

+ 18 - 0
app/src/main/java/com/example/zhpan/circleviewpager/net/ApiService.java

@@ -0,0 +1,18 @@
+package com.example.zhpan.circleviewpager.net;
+
+import java.util.List;
+
+import io.reactivex.Observable;
+import retrofit2.http.GET;
+
+/**
+ * <pre>
+ *   Created by zhangpan on 2019-08-14.
+ *   Description:
+ * </pre>
+ */
+public interface ApiService {
+    @GET("banner/json")
+    Observable<List<BannerData>> getBannerData();
+
+}

+ 94 - 0
app/src/main/java/com/example/zhpan/circleviewpager/net/BannerData.java

@@ -0,0 +1,94 @@
+package com.example.zhpan.circleviewpager.net;
+
+/**
+ * <pre>
+ *   Created by zhangpan on 2019-08-14.
+ *   Description:
+ * </pre>
+ */
+public class BannerData {
+
+    /**
+     * desc :
+     * id : 20
+     * imagePath : https://www.wanandroid.com/blogimgs/90c6cc12-742e-4c9f-b318-b912f163b8d0.png
+     * isVisible : 1
+     * order : 2
+     * title : flutter 中文社区
+     * type : 1
+     * url : https://flutter.cn/
+     */
+
+    private String desc;
+    private int id;
+    private String imagePath;
+    private int isVisible;
+    private int order;
+    private String title;
+    private int type;
+    private String url;
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public String getImagePath() {
+        return imagePath;
+    }
+
+    public void setImagePath(String imagePath) {
+        this.imagePath = imagePath;
+    }
+
+    public int getIsVisible() {
+        return isVisible;
+    }
+
+    public void setIsVisible(int isVisible) {
+        this.isVisible = isVisible;
+    }
+
+    public int getOrder() {
+        return order;
+    }
+
+    public void setOrder(int order) {
+        this.order = order;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public int getType() {
+        return type;
+    }
+
+    public void setType(int type) {
+        this.type = type;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+}

+ 11 - 0
app/src/main/java/com/example/zhpan/circleviewpager/net/Constants.java

@@ -0,0 +1,11 @@
+package com.example.zhpan.circleviewpager.net;
+
+/**
+ * <pre>
+ *   Created by zhangpan on 2019-08-14.
+ *   Description:
+ * </pre>
+ */
+public interface Constants {
+    String BASE_URL = "https://www.wanandroid.com/";
+}

+ 20 - 0
app/src/main/java/com/example/zhpan/circleviewpager/net/RetrofitGnerator.java

@@ -0,0 +1,20 @@
+package com.example.zhpan.circleviewpager.net;
+
+import com.zhpan.idea.net.common.IdeaApi;
+
+/**
+ * <pre>
+ *   Created by zhangpan on 2019-08-14.
+ *   Description:
+ * </pre>
+ */
+public class RetrofitGnerator {
+    private static ApiService mApiservice;
+
+    public static ApiService getApiSerVice() {
+        if (mApiservice == null) {
+            mApiservice = IdeaApi.getApiService(ApiService.class, Constants.BASE_URL);
+        }
+        return mApiservice;
+    }
+}

+ 0 - 54
app/src/main/java/com/example/zhpan/circleviewpager/utils/GlideCircleTransform.java

@@ -1,54 +0,0 @@
-package com.example.zhpan.circleviewpager.utils;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.BitmapShader;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-
-import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
-import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
-
-/**
- * Created by zhpan on 16/5/6.
- */
-public class GlideCircleTransform extends BitmapTransformation {
-    public GlideCircleTransform(Context context) {
-        super(context);
-    }
-
-    @Override
-    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
-        return circleCrop(pool, toTransform);
-    }
-
-    private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
-        if (source == null) return null;
-
-        int size = Math.min(source.getWidth(), source.getHeight());
-        int x = (source.getWidth() - size) / 2;
-        int y = (source.getHeight() - size) / 2;
-
-        // TODO this could be acquired from the pool too
-        Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);
-
-        Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
-        if (result == null) {
-            result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
-        }
-
-        Canvas canvas = new Canvas(result);
-        Paint paint = new Paint();
-        paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
-        paint.setAntiAlias(true);
-        float r = size / 2f;
-        canvas.drawCircle(r, r, r, paint);
-        return result;
-    }
-
-    @Override
-    public String getId() {
-        return getClass().getName();
-    }
-}
-

+ 0 - 55
app/src/main/java/com/example/zhpan/circleviewpager/utils/GlideRoundTransform.java

@@ -1,55 +0,0 @@
-package com.example.zhpan.circleviewpager.utils;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.BitmapShader;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.RectF;
-
-import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
-import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
-
-/**
- * Created by zhpan on 2017/5/14.
- */
-
-public class GlideRoundTransform extends BitmapTransformation {
-
-    private static float radius = 0f;
-
-    public GlideRoundTransform(Context context) {
-        this(context, 4);
-    }
-
-    public GlideRoundTransform(Context context, int dp) {
-        super(context);
-        this.radius = Resources.getSystem().getDisplayMetrics().density * dp;
-    }
-
-    @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
-        return roundCrop(pool, toTransform);
-    }
-
-    private static Bitmap roundCrop(BitmapPool pool, Bitmap source) {
-        if (source == null) return null;
-
-        Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
-        if (result == null) {
-            result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
-        }
-
-        Canvas canvas = new Canvas(result);
-        Paint paint = new Paint();
-        paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
-        paint.setAntiAlias(true);
-        RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());
-        canvas.drawRoundRect(rectF, radius, radius, paint);
-        return result;
-    }
-
-    @Override public String getId() {
-        return getClass().getName() + Math.round(radius);
-    }
-}

+ 0 - 149
app/src/main/java/com/example/zhpan/circleviewpager/utils/ImageLoaderUtil.java

@@ -1,149 +0,0 @@
-package com.example.zhpan.circleviewpager.utils;
-
-import android.graphics.Bitmap;
-import android.os.Environment;
-import android.support.annotation.DrawableRes;
-import android.util.Log;
-import android.view.View;
-import android.widget.ImageView;
-
-import com.bumptech.glide.Glide;
-import com.bumptech.glide.load.engine.DiskCacheStrategy;
-import com.bumptech.glide.request.target.SizeReadyCallback;
-
-import java.io.BufferedOutputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-
-/**
- * 图片加载框架封装类
- */
-public class ImageLoaderUtil {
-    public static void loadImg(ImageView v, String url) {
-        Glide.with(v.getContext())
-                .load(url)
-                .fitCenter()
-                .diskCacheStrategy(DiskCacheStrategy.ALL)
-                .into(v);
-    }
-
-    public static void loadImg(ImageView v, String url, @DrawableRes int placeholder) {
-        Glide.with(v.getContext())
-                .load(url)
-                .fitCenter()
-                .placeholder(placeholder)
-                .diskCacheStrategy(DiskCacheStrategy.ALL)
-                .into(v);
-    }
-
-    public static void loadGifImg(ImageView v, String url) {
-        Glide.with(v.getContext())
-                .load(url)
-                .asBitmap()
-                .fitCenter()
-                .diskCacheStrategy(DiskCacheStrategy.ALL)
-//                .placeholder(R.drawable.head_portrait)
-                .into(v);
-    }
-
-
-    public static void loadCircleImg(ImageView v, String url, @DrawableRes int placeholder) {
-        Glide.with(v.getContext())
-                .load(url)
-                .placeholder(placeholder)
-                .transform(new GlideCircleTransform(v.getContext()))
-                .into(v);
-    }
-
-    public static void loadRoundImg(ImageView v, String url, @DrawableRes int placeholder) {
-        Glide.with(v.getContext())
-                .load(url)
-                .transform(new GlideRoundTransform(v.getContext()))
-                .placeholder(placeholder)
-                .into(v);
-    }
-
-    public static void loadImgFillCenter(ImageView v, String localPath) {
-        Glide.with(v.getContext()).load(localPath)
-                .centerCrop()
-                .into(v);
-    }
-
-    public static void loadAdapterImg(ImageView v, String url, final View itemView) {
-        Glide.with(v.getContext())
-                .load(url)
-                .centerCrop()
-                .diskCacheStrategy(DiskCacheStrategy.ALL)
-//                .placeholder(R.drawable.placeholder_image)
-                .into(v)
-                .getSize(new SizeReadyCallback() {
-
-                    @Override
-                    public void onSizeReady(int width, int height) {
-
-                        if (!itemView.isShown()) {
-                            itemView.setVisibility(View.VISIBLE);
-                        }
-                    }
-                });
-    }
-
-
-    /**
-     * 保存文件
-     *
-     * @param bm
-     * @param fileName
-     * @throws IOException
-     */
-    public static String saveFile(Bitmap bm, String fileName) {
-        String s = Environment.getExternalStorageDirectory().toString();
-        File dirFile = new File(s + "/DCIM/Camera/");
-        if (!dirFile.exists()) {
-            dirFile.mkdir();
-        }
-        File myCaptureFile = new File(s + "/DCIM/Camera/" + fileName);
-        BufferedOutputStream bos = null;
-        try {
-            bos = new BufferedOutputStream(
-                    new FileOutputStream(myCaptureFile));
-        } catch (FileNotFoundException e) {
-            e.printStackTrace();
-        }
-        bm.compress(Bitmap.CompressFormat.JPEG, 100, bos);
-        try {
-            bos.flush();
-            bos.close();
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        return myCaptureFile.getAbsolutePath();
-    }
-
-    /**
-     * 获得指定文件的byte数组
-     */
-    public static byte[] getBytes(File file) {
-        byte[] buffer = null;
-        try {
-            FileInputStream fis = new FileInputStream(file);
-            ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);
-            byte[] b = new byte[1000];
-            int n;
-            while ((n = fis.read(b)) != -1) {
-                bos.write(b, 0, n);
-            }
-            fis.close();
-            bos.close();
-            buffer = bos.toByteArray();
-        } catch (IOException e) {
-            e.printStackTrace();
-            Log.e("e", "IOException");
-        }
-        return buffer;
-    }
-}

+ 4 - 4
app/src/main/java/com/example/zhpan/circleviewpager/viewholder/DataViewHolder.java

@@ -5,13 +5,12 @@ import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ImageView;
-import android.widget.TextView;
-import android.widget.Toast;
 
 import com.example.zhpan.circleviewpager.bean.DataBean;
 import com.example.zhpan.circleviewpager.R;
+import com.example.zhpan.circleviewpager.imageloader.ImageLoaderManager;
+import com.example.zhpan.circleviewpager.imageloader.ImageLoaderOptions;
 import com.zhpan.bannerview.holder.ViewHolder;
-import com.example.zhpan.circleviewpager.utils.ImageLoaderUtil;
 
 /**
  * Created by zhpan on 2017/10/30.
@@ -31,6 +30,7 @@ public class DataViewHolder implements ViewHolder<DataBean> {
 
     @Override
     public void onBind(final Context context, DataBean data, final int position, final int size) {
-        ImageLoaderUtil.loadImg(mImageView, data.getUrl(), R.drawable.placeholder);
+        ImageLoaderOptions options = new ImageLoaderOptions.Builder().into(mImageView).load(data.getUrl()).placeHolder(R.drawable.placeholder).build();
+        ImageLoaderManager.getInstance().loadImage(options);
     }
 }

+ 40 - 0
app/src/main/java/com/example/zhpan/circleviewpager/viewholder/NetViewHolder.java

@@ -0,0 +1,40 @@
+package com.example.zhpan.circleviewpager.viewholder;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.example.zhpan.circleviewpager.R;
+import com.example.zhpan.circleviewpager.imageloader.ImageLoaderManager;
+import com.example.zhpan.circleviewpager.imageloader.ImageLoaderOptions;
+import com.example.zhpan.circleviewpager.net.BannerData;
+import com.zhpan.bannerview.holder.ViewHolder;
+
+/**
+ * <pre>
+ *   Created by zhangpan on 2019-08-14.
+ *   Description:
+ * </pre>
+ */
+public class NetViewHolder implements ViewHolder<BannerData> {
+    ImageView mImageView;
+    TextView mTextView;
+
+    @Override
+    public View createView(ViewGroup viewGroup, Context context, int position) {
+        View view = LayoutInflater.from(context).inflate(R.layout.item_custom_view, viewGroup, false);
+        mImageView = view.findViewById(R.id.banner_image);
+        mTextView = view.findViewById(R.id.tv_describe);
+        return view;
+    }
+
+    @Override
+    public void onBind(Context context, BannerData data, int position, int size) {
+        ImageLoaderOptions options = new ImageLoaderOptions.Builder().into(mImageView).load(data.getImagePath()).placeHolder(R.drawable.placeholder).build();
+        ImageLoaderManager.getInstance().loadImage(options);
+        mTextView.setText(data.getTitle());
+    }
+}

+ 8 - 0
app/src/main/res/layout/activity_main.xml

@@ -30,4 +30,12 @@
         android:onClick="onClick"
         android:text="嵌套PhotoView示例" />
 
+    <Button
+        android:id="@+id/btn_view_pager4"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="15dp"
+        android:onClick="onClick"
+        android:text="获取远程数据显示Banner" />
+
 </LinearLayout>

+ 14 - 0
app/src/main/res/layout/activity_network_banner.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    tools:context=".activity.NetworkBannerActivity">
+
+    <com.zhpan.bannerview.view.BannerViewPager
+        android:id="@+id/banner_view"
+        android:layout_width="match_parent"
+        android:layout_height="200dp" />
+
+</LinearLayout>

+ 18 - 0
bannerview/src/main/java/com/zhpan/bannerview/Utils/DpUtils.java

@@ -0,0 +1,18 @@
+package com.zhpan.bannerview.Utils;
+
+import android.content.Context;
+import android.util.DisplayMetrics;
+
+/**
+ * <pre>
+ *   Created by zhangpan on 2019-08-14.
+ *   Description:
+ * </pre>
+ */
+public class DpUtils {
+    public static int dp2px(Context context, float dpValue) {
+        DisplayMetrics metric = context.getResources().getDisplayMetrics();
+        float screenDensity = metric.density;
+        return (int) (dpValue * screenDensity + 0.5f);
+    }
+}

+ 20 - 27
bannerview/src/main/java/com/zhpan/bannerview/view/BannerViewPager.java

@@ -11,7 +11,6 @@ import android.support.annotation.DimenRes;
 import android.support.annotation.IntDef;
 import android.support.v4.view.ViewPager;
 import android.util.AttributeSet;
-import android.util.DisplayMetrics;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
@@ -20,6 +19,7 @@ import android.widget.FrameLayout;
 import android.widget.RelativeLayout;
 
 import com.zhpan.bannerview.R;
+import com.zhpan.bannerview.Utils.DpUtils;
 import com.zhpan.bannerview.adapter.BannerPagerAdapter;
 import com.zhpan.bannerview.holder.HolderCreator;
 import com.zhpan.bannerview.holder.ViewHolder;
@@ -114,7 +114,7 @@ public class BannerViewPager<T, VH extends ViewHolder> extends FrameLayout imple
                     typedArray.getColor(R.styleable.BannerViewPager_indicator_normal_color,
                             Color.parseColor("#935656"));
             indicatorRadius = typedArray.getDimension(R.styleable.BannerViewPager_indicator_radius,
-                    dp2px(context, 4));
+                    DpUtils.dp2px(context, 4));
             isAutoPlay = typedArray.getBoolean(R.styleable.BannerViewPager_isAutoPlay, true);
             isCanLoop = typedArray.getBoolean(R.styleable.BannerViewPager_isCanLoop, true);
             gravity = typedArray.getInt(R.styleable.BannerViewPager_indicator_gravity, 0);
@@ -141,17 +141,16 @@ public class BannerViewPager<T, VH extends ViewHolder> extends FrameLayout imple
 
     // 根据mList数据集构造mListAdd
     private void initData() {
-        if (mList.size() == 0) {
-            setVisibility(GONE);
-        } else {
+        if (mList.size() > 0) {
             initIndicator();
             if (isCanLoop) {
                 currentPosition = 1;
             }
+            setViewPager();
         }
-        setViewPager();
     }
 
+
     // 设置触摸事件,当滑动或者触摸时停止自动轮播
     @SuppressLint("ClickableViewAccessibility")
     private void setTouchListener() {
@@ -200,18 +199,17 @@ public class BannerViewPager<T, VH extends ViewHolder> extends FrameLayout imple
 
 
     private void setViewPager() {
-        if (holderCreator == null) {
-            throw new RuntimeException("You must set HolderCreator first!");
+        if (holderCreator != null) {
+            BannerPagerAdapter<T, VH> bannerPagerAdapter =
+                    new BannerPagerAdapter<>(mList, this, holderCreator);
+            bannerPagerAdapter.setCanLoop(isCanLoop);
+            mViewPager.setAdapter(bannerPagerAdapter);
+            mViewPager.setCurrentItem(currentPosition);
+            mViewPager.addOnPageChangeListener(this);
+            startLoop();
+            setTouchListener();
+            mIndicatorView.setVisibility(showIndicator ? VISIBLE : GONE);
         }
-        BannerPagerAdapter<T, VH> bannerPagerAdapter =
-                new BannerPagerAdapter<>(mList, this, holderCreator);
-        bannerPagerAdapter.setCanLoop(isCanLoop);
-        mViewPager.setAdapter(bannerPagerAdapter);
-        mViewPager.setCurrentItem(currentPosition);
-        mViewPager.addOnPageChangeListener(this);
-        startLoop();
-        setTouchListener();
-        mIndicatorView.setVisibility(showIndicator ? VISIBLE : GONE);
     }
 
     @Override
@@ -233,7 +231,7 @@ public class BannerViewPager<T, VH extends ViewHolder> extends FrameLayout imple
 
     @Override
     public void onPageScrollStateChanged(int state) {
-        if(isCanLoop){
+        if (isCanLoop) {
             switch (state) {
                 case ViewPager.SCROLL_STATE_IDLE:
                     if (currentPosition == 0) {
@@ -250,7 +248,7 @@ public class BannerViewPager<T, VH extends ViewHolder> extends FrameLayout imple
                     }
                     break;
             }
-        }else {
+        } else {
             mViewPager.setCurrentItem(currentPosition);
         }
     }
@@ -306,6 +304,7 @@ public class BannerViewPager<T, VH extends ViewHolder> extends FrameLayout imple
         if (list != null) {
             mList.clear();
             mList.addAll(list);
+            initData();
         }
         return this;
     }
@@ -336,7 +335,7 @@ public class BannerViewPager<T, VH extends ViewHolder> extends FrameLayout imple
     public BannerViewPager<T, VH> setRoundCorner(float radiusDp) {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             ViewStyleSetter viewStyleSetter = new ViewStyleSetter(this);
-            viewStyleSetter.setRoundCorner(dp2px(getContext(), radiusDp));
+            viewStyleSetter.setRoundCorner(DpUtils.dp2px(getContext(), radiusDp));
         }
         return this;
     }
@@ -394,7 +393,7 @@ public class BannerViewPager<T, VH extends ViewHolder> extends FrameLayout imple
      * @param indicatorRadius 指示器圆点半径
      */
     public BannerViewPager<T, VH> setIndicatorRadius(float indicatorRadius) {
-        this.indicatorRadius = dp2px(getContext(), indicatorRadius);
+        this.indicatorRadius = DpUtils.dp2px(getContext(), indicatorRadius);
         return this;
     }
 
@@ -477,12 +476,6 @@ public class BannerViewPager<T, VH extends ViewHolder> extends FrameLayout imple
         return this;
     }
 
-    public static int dp2px(Context context, float dpValue) {
-        DisplayMetrics metric = context.getResources().getDisplayMetrics();
-        float screenDensity = metric.density;
-        return (int) (dpValue * screenDensity + 0.5f);
-    }
-
     public void create() {
         initData();
     }

+ 4 - 0
bannerview/src/main/java/com/zhpan/bannerview/view/IndicatorView.java

@@ -5,8 +5,11 @@ import android.graphics.Canvas;
 import android.graphics.Color;
 import android.graphics.Paint;
 import android.util.AttributeSet;
+import android.util.DisplayMetrics;
 import android.view.View;
 
+import com.zhpan.bannerview.Utils.DpUtils;
+
 /**
  * Created by zhpan on 2017/12/6.
  */
@@ -35,6 +38,7 @@ public class IndicatorView extends View {
         mPaint = new Paint();
         mPaint.setColor(normalColor);
         mPaint.setAntiAlias(true);
+        mRadius = DpUtils.dp2px(context, 4);
     }
 
     @Override

+ 16 - 0
build.gradle

@@ -28,3 +28,19 @@ allprojects {
 task clean(type: Delete) {
     delete rootProject.buildDir
 }
+
+ext {
+    compileSdkVersion=27
+    buildToolsVersion = '27.0.3'
+    targetSdkVersion = 26
+    minSdkVersion = 19
+    releaseVersionCode = 1
+    releaseVersionName = '1.0.0'
+    supportLibVersion = "27.0.2"
+
+    rxjava2Version = '2.0.8'
+    retrofit2Version = '2.2.0'
+    rxlifecycle='2.2.1'
+    gsonVersion = '2.8.0'
+    butterknifeVersion = '8.5.1'
+}

+ 1 - 1
settings.gradle

@@ -1 +1 @@
-include ':app', ':bannerview'
+include ':app', ':bannerview', ':ideahttp'