Browse Source

Merge pull request #76 from zhpanvip/dev_2.6.4

v2.6.4
zhpanvip 5 years ago
parent
commit
aeba256074

BIN
app/release/app-release.apk


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

@@ -2,6 +2,7 @@ package com.example.zhpan.circleviewpager;
 
 import android.app.Application;
 
+import com.zhpan.bannerview.utils.BannerUtils;
 import com.zhpan.idea.utils.Utils;
 
 /**
@@ -16,5 +17,6 @@ public class App extends Application {
     public void onCreate() {
         super.onCreate();
         Utils.init(getApplicationContext());
+        BannerUtils.setDebugMode(true);
     }
 }

+ 7 - 8
app/src/main/java/com/example/zhpan/circleviewpager/activity/MainActivity.kt

@@ -25,7 +25,7 @@ class MainActivity : AppCompatActivity() {
     private fun initData() {
         vp_fragment.adapter = AdapterFragmentPager(this)
         vp_fragment.offscreenPageLimit = 3
-        vp_fragment.isUserInputEnabled=false
+        vp_fragment.isUserInputEnabled = false
         vp_fragment.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
             override fun onPageSelected(position: Int) {
                 super.onPageSelected(position)
@@ -35,14 +35,13 @@ class MainActivity : AppCompatActivity() {
     }
 
     private fun getCheckedId(position: Int): Int {
-        var checkedId = R.id.rb_home
-        when (position) {
-            0 -> checkedId = R.id.rb_home
-            1 -> checkedId = R.id.rb_find
-            2 -> checkedId = R.id.rb_add
-            3 -> checkedId = R.id.rb_others
+        return when (position) {
+            0 -> R.id.rb_home
+            1 -> R.id.rb_find
+            2 -> R.id.rb_add
+            3 -> R.id.rb_others
+            else -> R.id.rb_home
         }
-        return checkedId
     }
 
     private fun setListener() {

+ 0 - 3
app/src/main/java/com/example/zhpan/circleviewpager/adapter/AdapterFragmentPager.kt

@@ -1,6 +1,5 @@
 package com.example.zhpan.circleviewpager.adapter
 
-
 import android.util.SparseArray
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.FragmentActivity
@@ -12,8 +11,6 @@ import com.example.zhpan.circleviewpager.fragment.IndicatorFragment
 import com.example.zhpan.circleviewpager.fragment.OthersFragment
 import com.example.zhpan.circleviewpager.fragment.PageFragment
 
-import java.util.ArrayList
-
 /**
  * <pre>
  * Created by zhangpan on 2019-12-05.

+ 22 - 0
app/src/main/java/com/example/zhpan/circleviewpager/fragment/OthersFragment.java

@@ -9,6 +9,7 @@ import android.widget.RadioGroup;
 
 import com.example.zhpan.circleviewpager.R;
 import com.example.zhpan.circleviewpager.activity.PhotoViewActivity;
+import com.example.zhpan.circleviewpager.view.DrawableIndicator;
 import com.example.zhpan.circleviewpager.view.FigureIndicatorView;
 import com.example.zhpan.circleviewpager.viewholder.ImageResourceViewHolder;
 import com.zhpan.bannerview.BannerViewPager;
@@ -92,11 +93,32 @@ public class OthersFragment extends BaseFragment implements View.OnClickListener
                     resetBannerViewPager();
                     setupCustomIndicator();
                     break;
+                case R.id.rb_drawable:
+                    resetBannerViewPager();
+                    setDrawableIndicator();
+                    break;
             }
         });
         radioButton.performClick();
     }
 
+    private void setDrawableIndicator() {
+        mIndicatorView.setVisibility(View.INVISIBLE);
+        mViewPager
+                .setIndicatorView(getDrawableIndicator())
+                .setIndicatorSlideMode(IndicatorSlideMode.NORMAL)
+                .setIndicatorVisibility(View.VISIBLE)
+                .setIndicatorGravity(IndicatorGravity.CENTER)
+                .create(getMDrawableList());
+    }
+
+    private IIndicator getDrawableIndicator() {
+        int dp10 = getResources().getDimensionPixelOffset(R.dimen.dp_10);
+        return new DrawableIndicator(getContext())
+                .setIndicatorGap(getResources().getDimensionPixelOffset(R.dimen.dp_2_5))
+                .setIndicatorDrawable(R.drawable.heart_empty, R.drawable.heart_red)
+                .setIndicatorSize(dp10, dp10, dp10, dp10);
+    }
 
     private void setIndicatorBelowOfBanner() {
         mIndicatorView.setVisibility(View.VISIBLE);

+ 159 - 0
app/src/main/java/com/example/zhpan/circleviewpager/view/DrawableIndicator.java

@@ -0,0 +1,159 @@
+package com.example.zhpan.circleviewpager.view;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Matrix;
+import android.util.AttributeSet;
+
+import androidx.annotation.DrawableRes;
+import androidx.annotation.Nullable;
+
+import com.zhpan.bannerview.indicator.BaseIndicatorView;
+
+/**
+ * @ author : zhouweibin
+ * @ time: 2019/12/18 17:04.
+ * @ desc: 选中与未选中的图片长宽可能不一样
+ **/
+public class DrawableIndicator extends BaseIndicatorView {
+    // 选中与未选中的图片
+    private Bitmap mCheckedBitmap, mNormalBitmap;
+    // 图片之间的间距
+    private int mIndicatorPadding;
+    // 选中图片的宽高
+    private int mCheckedBitmapWidth, mCheckedBitmapHeight;
+    //未选中图片的宽高
+    private int mNormalBitmapWidth, mNormalBitmapHeight;
+    private IndicatorSize mIndicatorSize;
+
+    public DrawableIndicator(Context context) {
+        this(context, null);
+    }
+
+    public DrawableIndicator(Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public DrawableIndicator(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+        int maxHeight = Math.max(mCheckedBitmapHeight, mNormalBitmapHeight);
+        int realWidth = mCheckedBitmapWidth + (mNormalBitmapWidth + mIndicatorPadding) * (getPageSize() - 1);
+        setMeasuredDimension(realWidth, maxHeight);
+    }
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+        super.onDraw(canvas);
+        if (getPageSize() > 1 || mCheckedBitmap == null || mNormalBitmap == null) {
+            for (int i = 1; i < getPageSize() + 1; i++) {
+                int left;
+                int top;
+                Bitmap bitmap = mNormalBitmap;
+                int index = i - 1;
+                if (index < getCurrentPosition()) {
+                    left = (i - 1) * (mNormalBitmapWidth + mIndicatorPadding);
+                    top = getMeasuredHeight() / 2 - mNormalBitmapHeight / 2;
+                } else if (index == getCurrentPosition()) {
+                    left = (i - 1) * (mNormalBitmapWidth + mIndicatorPadding);
+                    top = getMeasuredHeight() / 2 - mCheckedBitmapHeight / 2;
+                    bitmap = mCheckedBitmap;
+                } else {
+                    left = (i - 1) * mIndicatorPadding + (i - 2) * mNormalBitmapWidth + mCheckedBitmapWidth;
+                    top = getMeasuredHeight() / 2 - mNormalBitmapHeight / 2;
+                }
+                drawIcon(canvas, left, top, bitmap);
+            }
+        }
+    }
+
+    private void drawIcon(Canvas canvas, int left, int top, Bitmap icon) {
+        if (icon == null) {
+            return;
+        }
+        canvas.drawBitmap(icon, left, top, null);
+    }
+
+    private void initIconSize() {
+        if (mCheckedBitmap != null) {
+            if (mIndicatorSize != null) {
+                if (mCheckedBitmap.isMutable()) {
+                    mCheckedBitmap.setWidth(mIndicatorSize.checkedWidth);
+                    mCheckedBitmap.setHeight(mIndicatorSize.checkedHeight);
+                } else {
+                    int width = mCheckedBitmap.getWidth();
+                    int height = mCheckedBitmap.getHeight();
+                    float scaleWidth = ((float) (mIndicatorSize.checkedWidth) / width);
+                    float scaleHeight = ((float) (mIndicatorSize.checkedHeight) / height);
+                    Matrix matrix = new Matrix();
+                    matrix.postScale(scaleWidth, scaleHeight);
+                    mCheckedBitmap = Bitmap.createBitmap(mCheckedBitmap, 0, 0, width, height, matrix, true);
+                }
+            }
+            mCheckedBitmapWidth = mCheckedBitmap.getWidth();
+            mCheckedBitmapHeight = mCheckedBitmap.getHeight();
+        }
+
+        if (mNormalBitmap != null) {
+            if (mIndicatorSize != null) {
+                if (mNormalBitmap.isMutable()) {
+                    mNormalBitmap.setWidth(mIndicatorSize.normalWidth);
+                    mNormalBitmap.setHeight(mIndicatorSize.normalHeight);
+                } else {
+                    int width = mNormalBitmap.getWidth();
+                    int height = mNormalBitmap.getHeight();
+                    float scaleWidth = ((float) (mIndicatorSize.normalWidth) / mNormalBitmap.getWidth());
+                    float scaleHeight = ((float) (mIndicatorSize.normalHeight) / mNormalBitmap.getHeight());
+                    Matrix matrix = new Matrix();
+                    matrix.postScale(scaleWidth, scaleHeight);
+                    mNormalBitmap = Bitmap.createBitmap(mNormalBitmap, 0, 0, width, height, matrix, true);
+                }
+            }
+            mNormalBitmapWidth = mNormalBitmap.getWidth();
+            mNormalBitmapHeight = mNormalBitmap.getHeight();
+        }
+    }
+
+    public DrawableIndicator setIndicatorDrawable(@DrawableRes int normalDrawable, @DrawableRes int checkedDrawable) {
+        mNormalBitmap = mCheckedBitmap = BitmapFactory.decodeResource(getResources(), normalDrawable);
+        mCheckedBitmap = BitmapFactory.decodeResource(getResources(), checkedDrawable);
+        initIconSize();
+        postInvalidate();
+        return this;
+    }
+
+    public DrawableIndicator setIndicatorSize(int normalWidth, int normalHeight, int checkedWidth, int checkedHeight) {
+        this.mIndicatorSize = new IndicatorSize(normalWidth, normalHeight, checkedWidth, checkedHeight);
+        initIconSize();
+        postInvalidate();
+        return this;
+    }
+
+    public DrawableIndicator setIndicatorGap(int padding) {
+        if (padding >= 0) {
+            mIndicatorPadding = padding;
+            postInvalidate();
+        }
+        return this;
+    }
+
+    static class IndicatorSize {
+        int normalWidth;
+        int checkedWidth;
+        int normalHeight;
+        int checkedHeight;
+
+        public IndicatorSize(int normalWidth, int normalHeight, int checkedWidth, int checkedHeight) {
+            this.normalWidth = normalWidth;
+            this.checkedWidth = checkedWidth;
+            this.normalHeight = normalHeight;
+            this.checkedHeight = checkedHeight;
+        }
+    }
+}

BIN
app/src/main/res/drawable-xxxhdpi/heart_empty.png


BIN
app/src/main/res/drawable-xxxhdpi/heart_red.png


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

@@ -58,6 +58,14 @@
             android:text="Custom Indicator"
             android:textSize="@dimen/sp_16" />
 
+        <RadioButton
+            android:id="@+id/rb_drawable"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="15dp"
+            android:layout_marginBottom="@dimen/dp_10"
+            android:text="Drawable Indicator"
+            android:textSize="@dimen/sp_16" />
 
     </RadioGroup>
 

+ 1 - 1
bannerview/build.gradle

@@ -32,7 +32,7 @@ dependencies {
     implementation 'androidx.appcompat:appcompat:1.0.2'
 }
 
-version = "2.6.0"
+version = "2.6.4"
 def siteUrl = 'https://github.com/zhpanvip/BannerViewPager'      // 项目的主页
 def gitUrl = 'https://github.com/zhpanvip/BannerViewPager.git'   // Git仓库的url
 group = "com.zhpan.library" // Maven Group ID for the artifact,一般填你唯一的包名

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

@@ -132,13 +132,11 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
 
     @Override
     public void onPageSelected(int position) {
-        // Optimized For Issue #42
         int size = mBannerPagerAdapter.getListSize();
-        if (size > 0 && isCanLoop() && position == 0) {
-            position = MAX_VALUE / 2 - ((MAX_VALUE / 2) % size) + 1;
-            setCurrentItem(0, false);
-        }
         currentPosition = BannerUtils.getRealPosition(isCanLoop(), position, size);
+        if (size > 0 && isCanLoop() && position == 0 || position == MAX_VALUE - 1) {
+            setCurrentItem(currentPosition, false);
+        }
         if (mOnPageChangeListener != null)
             mOnPageChangeListener.onPageSelected(currentPosition);
         if (mIndicatorView != null) {
@@ -159,14 +157,14 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
     @Override
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
         int listSize = mBannerPagerAdapter.getListSize();
+        int realPosition = BannerUtils.getRealPosition(isCanLoop(), position, listSize);
         if (listSize > 0) {
             if (mOnPageChangeListener != null) {
-                mOnPageChangeListener.onPageScrolled(BannerUtils.getRealPosition(isCanLoop(), position, listSize),
-                        positionOffset, positionOffsetPixels);
+                mOnPageChangeListener.onPageScrolled(realPosition, positionOffset, positionOffsetPixels);
+            }
+            if (mIndicatorView != null) {
+                mIndicatorView.onPageScrolled(realPosition, positionOffset, positionOffsetPixels);
             }
-            if (mIndicatorView != null)
-                mIndicatorView.onPageScrolled(BannerUtils.getRealPosition(isCanLoop(), position, listSize),
-                        positionOffset, positionOffsetPixels);
         }
     }
 
@@ -252,7 +250,6 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         if (list.size() > 0 && isCanLoop()) {
             currentPosition = MAX_VALUE / 2 - ((MAX_VALUE / 2) % list.size()) + 1;
         }
-        removeAllViews();
         mViewPager.setAdapter(getPagerAdapter(list));
         mViewPager.setCurrentItem(currentPosition);
         mViewPager.removeOnPageChangeListener(this);
@@ -261,8 +258,7 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         mViewPager.setScrollDuration(bannerOptions.getScrollDuration());
         mViewPager.disableTouchScroll(bannerOptions.isDisableTouchScroll());
         mViewPager.setFirstLayout(true);
-        addView(mViewPager);
-        addView(mIndicatorLayout);
+        mViewPager.setOffscreenPageLimit(mBannerManager.bannerOptions().getOffScreenPageLimit());
         initPageStyle();
         startLoop();
     }
@@ -306,7 +302,8 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         params.rightMargin = params.leftMargin;
         mViewPager.setOverlapStyle(overlap);
         mViewPager.setPageMargin(overlap ? -bannerOptions.getPageMargin() : bannerOptions.getPageMargin());
-        mViewPager.setOffscreenPageLimit(2);
+        int offScreenPageLimit = bannerOptions.getOffScreenPageLimit();
+        mViewPager.setOffscreenPageLimit(offScreenPageLimit > 2 ? offScreenPageLimit : 2);
         setPageTransformer(new ScaleInTransformer(scale));
     }
 
@@ -667,10 +664,7 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
      */
     public void setCurrentItem(int item) {
         if (isCanLoop() && mBannerPagerAdapter.getListSize() > 1) {
-            removeAllViews();
             mViewPager.setCurrentItem(MAX_VALUE / 2 - ((MAX_VALUE / 2) % mBannerPagerAdapter.getListSize()) + 1 + item);
-            addView(mViewPager);
-            addView(mIndicatorLayout);
         } else {
             mViewPager.setCurrentItem(item);
         }
@@ -684,10 +678,7 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
      */
     public void setCurrentItem(int item, boolean smoothScroll) {
         if (isCanLoop() && mBannerPagerAdapter.getListSize() > 1) {
-            removeAllViews();
             mViewPager.setCurrentItem(MAX_VALUE / 2 - ((MAX_VALUE / 2) % mBannerPagerAdapter.getListSize()) + 1 + item, smoothScroll);
-            addView(mViewPager);
-            addView(mIndicatorLayout);
         } else {
             mViewPager.setCurrentItem(item, smoothScroll);
         }
@@ -738,6 +729,11 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         return mViewPager;
     }
 
+    public BannerViewPager<T, VH> setOffScreenPageLimit(int offScreenPageLimit) {
+        mBannerManager.bannerOptions().setOffScreenPageLimit(offScreenPageLimit);
+        return this;
+    }
+
 
     public BannerViewPager<T, VH> setIndicatorMargin(int left, int top, int right, int bottom) {
         mBannerManager.bannerOptions().setIndicatorMargin(left, top, right, bottom);

+ 2 - 4
bannerview/src/main/java/com/zhpan/bannerview/adapter/BannerPagerAdapter.java

@@ -28,9 +28,7 @@ public class BannerPagerAdapter<T, VH extends ViewHolder> extends PagerAdapter {
 
     private PageClickListener mPageClickListener;
 
-//    private List<View> mViewList = new ArrayList<>();
-
-    public static final int MAX_VALUE = 10000;
+    public static final int MAX_VALUE = 500;
 
     public BannerPagerAdapter(List<T> list, HolderCreator<VH> holderCreator) {
         mList = new ArrayList<>();
@@ -90,8 +88,8 @@ public class BannerPagerAdapter<T, VH extends ViewHolder> extends PagerAdapter {
         View itemView = LayoutInflater.from(container.getContext()).inflate(holder.getLayoutId(), container, false);
         if (mList != null && mList.size() > 0) {
 //            holder.createView(itemView, position);
-            holder.onBind(itemView, mList.get(position), position, mList.size());
             setViewListener(itemView, position);
+            holder.onBind(itemView, mList.get(position), position, mList.size());
         }
         return itemView;
     }

+ 7 - 2
bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/RoundRectDrawer.java

@@ -90,8 +90,10 @@ public class RoundRectDrawer extends BaseDrawer {
 
     private void smoothSlide(Canvas canvas, int i) {
         mPaint.setColor(mIndicatorOptions.getNormalColor());
+        float sliderHeight = mIndicatorOptions.getSliderHeight();
         float left = i * (maxWidth) + i * +mIndicatorOptions.getIndicatorGap() + (maxWidth - minWidth);
-        canvas.drawRect(left, 0, left + minWidth, mIndicatorOptions.getSliderHeight(), mPaint);
+        RectF rectF = new RectF(left, 0, left + minWidth, sliderHeight);
+        canvas.drawRoundRect(rectF, sliderHeight, sliderHeight, mPaint);
         drawSliderStyle(canvas);
     }
 
@@ -99,8 +101,11 @@ public class RoundRectDrawer extends BaseDrawer {
         mPaint.setColor(mIndicatorOptions.getCheckedColor());
         int currentPosition = mIndicatorOptions.getCurrentPosition();
         float indicatorGap = mIndicatorOptions.getIndicatorGap();
+        float sliderHeight = mIndicatorOptions.getSliderHeight();
         float left = currentPosition * (maxWidth) + currentPosition * +indicatorGap + (maxWidth + indicatorGap) * mIndicatorOptions.getSlideProgress();
-        canvas.drawRect(left, 0, left + maxWidth, mIndicatorOptions.getSliderHeight(), mPaint);
+        RectF rectF = new RectF(left, 0, left + minWidth, sliderHeight);
+        canvas.drawRoundRect(rectF, sliderHeight, sliderHeight, mPaint);
+//        canvas.drawRect(left, 0, left + maxWidth, mIndicatorOptions.getSliderHeight(), mPaint);
     }
 
 

+ 10 - 0
bannerview/src/main/java/com/zhpan/bannerview/manager/BannerOptions.java

@@ -19,6 +19,8 @@ public class BannerOptions {
 
     public static final int DEFAULT_SCROLL_DURATION = 500;
 
+    private int offScreenPageLimit;
+
     private int interval;
 
     private int currentPosition;
@@ -234,6 +236,14 @@ public class BannerOptions {
         mIndicatorOptions.setSlideProgress(0);
     }
 
+    public int getOffScreenPageLimit() {
+        return offScreenPageLimit;
+    }
+
+    public void setOffScreenPageLimit(int offScreenPageLimit) {
+        this.offScreenPageLimit = offScreenPageLimit;
+    }
+
     public static class IndicatorMargin {
 
         private int left, right, top, bottom;

+ 8 - 6
bannerview/src/main/java/com/zhpan/bannerview/utils/BannerUtils.java

@@ -11,12 +11,14 @@ import android.util.Log;
  */
 public class BannerUtils {
 
-    private static final boolean DEBUG = true;
+    private static boolean debugMode = false;
 
-    public float density;
+    public static void setDebugMode(boolean isDebug) {
+        debugMode = isDebug;
+    }
 
-    public BannerUtils() {
-        this.density = Resources.getSystem().getDisplayMetrics().density;
+    public static boolean isDebugMode() {
+        return debugMode;
     }
 
     public static int dp2px(float dpValue) {
@@ -24,13 +26,13 @@ public class BannerUtils {
     }
 
     public static void log(String tag, String msg) {
-        if (DEBUG) {
+        if (debugMode) {
             Log.e(tag, msg);
         }
     }
 
     public static void log(String msg) {
-        if (DEBUG) {
+        if (debugMode) {
             Log.e("BannerView", msg);
         }
     }