Browse Source

支持一屏显示多页面,修改规范attrs值。

张攀 5 years ago
parent
commit
eeb2e8c76f
35 changed files with 381 additions and 115 deletions
  1. 5 3
      app/src/main/AndroidManifest.xml
  2. 24 0
      app/src/main/java/com/example/zhpan/circleviewpager/activity/BaseDataActivity.java
  3. 10 19
      app/src/main/java/com/example/zhpan/circleviewpager/activity/CustomIndicatorActivity.java
  4. 3 3
      app/src/main/java/com/example/zhpan/circleviewpager/activity/CustomerBannerPageActivity.java
  5. 13 23
      app/src/main/java/com/example/zhpan/circleviewpager/activity/IndicatorStyleActivity.java
  6. 5 2
      app/src/main/java/com/example/zhpan/circleviewpager/activity/MainActivity.java
  7. 42 0
      app/src/main/java/com/example/zhpan/circleviewpager/activity/PageStyleActivity.java
  8. 1 7
      app/src/main/java/com/example/zhpan/circleviewpager/activity/PhotoViewActivity.java
  9. 3 4
      app/src/main/java/com/example/zhpan/circleviewpager/viewholder/ImageResourceViewHolder.java
  10. BIN
      app/src/main/res/drawable-hdpi/t0.jpg
  11. BIN
      app/src/main/res/drawable-hdpi/t1.jpg
  12. BIN
      app/src/main/res/drawable-hdpi/t2.jpg
  13. BIN
      app/src/main/res/drawable-hdpi/t3.jpg
  14. BIN
      app/src/main/res/drawable-xhdpi/t0.jpg
  15. BIN
      app/src/main/res/drawable-xhdpi/t1.jpg
  16. BIN
      app/src/main/res/drawable-xhdpi/t2.jpg
  17. BIN
      app/src/main/res/drawable-xhdpi/t3.jpg
  18. BIN
      app/src/main/res/drawable-xxhdpi/t0.jpg
  19. BIN
      app/src/main/res/drawable-xxhdpi/t1.jpg
  20. BIN
      app/src/main/res/drawable-xxhdpi/t2.jpg
  21. BIN
      app/src/main/res/drawable-xxhdpi/t3.jpg
  22. BIN
      app/src/main/res/drawable-xxxhdpi/t0.jpg
  23. BIN
      app/src/main/res/drawable-xxxhdpi/t1.jpg
  24. BIN
      app/src/main/res/drawable-xxxhdpi/t2.jpg
  25. BIN
      app/src/main/res/drawable-xxxhdpi/t3.jpg
  26. 59 20
      app/src/main/res/layout/activity_main.xml
  27. 14 0
      app/src/main/res/layout/activity_page_style.xml
  28. 1 0
      app/src/main/res/values/strings.xml
  29. 72 20
      bannerview/src/main/java/com/zhpan/bannerview/BannerViewPager.java
  30. 5 0
      bannerview/src/main/java/com/zhpan/bannerview/enums/PageStyle.java
  31. 27 0
      bannerview/src/main/java/com/zhpan/bannerview/transform/BasePageTransformer.java
  32. 17 0
      bannerview/src/main/java/com/zhpan/bannerview/transform/NonPageTransformer.java
  33. 63 0
      bannerview/src/main/java/com/zhpan/bannerview/transform/ScaleInTransformer.java
  34. 5 3
      bannerview/src/main/res/layout/layout_banner_view_pager.xml
  35. 12 11
      bannerview/src/main/res/values/attrs.xml

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

@@ -12,15 +12,17 @@
         android:label="@string/app_name"
         android:supportsRtl="true"
         android:theme="@style/AppTheme">
-        <activity android:name=".activity.CustomIndicatorActivity"></activity>
+        <activity android:name=".activity.BaseDataActivity"></activity>
+        <activity android:name=".activity.PageStyleActivity" />
+        <activity android:name=".activity.CustomIndicatorActivity" />
         <activity android:name=".activity.IndicatorStyleActivity" />
         <activity android:name=".activity.PageTransformerActivity" />
         <activity android:name=".activity.NetworkBannerActivity" />
         <activity
-            android:name=".activity.CustomerBannerItemActivity"
+            android:name=".activity.CustomerBannerPageActivity"
             android:theme="@style/FullScreenTheme" />
         <activity
-            android:name=".activity.BannerPhotoViewActivity"
+            android:name=".activity.PhotoViewActivity"
             android:theme="@style/FullScreenTheme" />
         <activity android:name=".activity.MainActivity">
             <intent-filter>

+ 24 - 0
app/src/main/java/com/example/zhpan/circleviewpager/activity/BaseDataActivity.java

@@ -0,0 +1,24 @@
+package com.example.zhpan.circleviewpager.activity;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.os.Bundle;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class BaseDataActivity extends AppCompatActivity {
+    protected List<Integer> mDrawableList = new ArrayList<>();
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        initData();
+    }
+
+    private void initData() {
+        for (int i = 0; i <= 3; i++) {
+            int drawable2 = getResources().getIdentifier("t" + i, "drawable", getPackageName());
+            mDrawableList.add(drawable2);
+        }
+    }
+}

+ 10 - 19
app/src/main/java/com/example/zhpan/circleviewpager/activity/CustomIndicatorActivity.java

@@ -1,25 +1,17 @@
 package com.example.zhpan.circleviewpager.activity;
 
-import androidx.appcompat.app.AppCompatActivity;
-
 import android.os.Bundle;
 
 import com.example.zhpan.circleviewpager.R;
 import com.zhpan.bannerview.indicator.DashIndicatorView;
-import com.example.zhpan.circleviewpager.viewholder.SlideModeViewHolder;
+import com.example.zhpan.circleviewpager.viewholder.ImageResourceViewHolder;
 import com.zhpan.bannerview.BannerViewPager;
 import com.zhpan.bannerview.utils.DpUtils;
 import com.zhpan.idea.utils.ToastUtils;
 
-import java.util.Arrays;
-import java.util.List;
+public class CustomIndicatorActivity extends BaseDataActivity {
 
-public class CustomIndicatorActivity extends AppCompatActivity {
-    private String[] picUrls = {"http://pic31.nipic.com/20130801/11604791_100539834000_2.jpg",
-            "http://pic37.nipic.com/20140115/7430301_100825571157_2.jpg",
-            "http://pic29.nipic.com/20130507/8952533_183922555000_2.jpg",
-            "http://b-ssl.duitang.com/uploads/item/201706/10/20170610095055_G5LM8.jpeg"};
-    BannerViewPager<String, SlideModeViewHolder> viewPager;
+    private BannerViewPager<Integer, ImageResourceViewHolder> mBannerViewPager;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -30,13 +22,12 @@ public class CustomIndicatorActivity extends AppCompatActivity {
     }
 
     private void setUpViewPager() {
-        viewPager = findViewById(R.id.banner_view_dash);
-        List<String> list = Arrays.asList(picUrls);
-        viewPager.setAutoPlay(false).setCanLoop(true)
+        mBannerViewPager = findViewById(R.id.banner_view_dash);
+        mBannerViewPager.setAutoPlay(false).setCanLoop(true)
                 .setRoundCorner(DpUtils.dp2px(5))
-                .setIndicatorView(setupIndicatorView(list.size()))
-                .setOnPageClickListener(position -> ToastUtils.show(position+""))
-                .setHolderCreator(SlideModeViewHolder::new).create(list);
+                .setIndicatorView(setupIndicatorView(mDrawableList.size()))
+                .setOnPageClickListener(position -> ToastUtils.show(position + ""))
+                .setHolderCreator(ImageResourceViewHolder::new).create(mDrawableList);
     }
 
     /**
@@ -56,12 +47,12 @@ public class CustomIndicatorActivity extends AppCompatActivity {
     @Override
     protected void onStop() {
         super.onStop();
-        viewPager.stopLoop();
+        mBannerViewPager.stopLoop();
     }
 
     @Override
     protected void onResume() {
         super.onResume();
-        viewPager.startLoop();
+        mBannerViewPager.startLoop();
     }
 }

+ 3 - 3
app/src/main/java/com/example/zhpan/circleviewpager/activity/CustomerBannerItemActivity.java → app/src/main/java/com/example/zhpan/circleviewpager/activity/CustomerBannerPageActivity.java

@@ -14,7 +14,7 @@ import com.zhpan.bannerview.BannerViewPager;
 import java.util.ArrayList;
 import java.util.List;
 
-public class CustomerBannerItemActivity extends AppCompatActivity {
+public class CustomerBannerPageActivity extends AppCompatActivity {
     private BannerViewPager<CustomBean, CustomPageViewHolder> mViewPager;
     private int[] imgRes = {R.drawable.guide0, R.drawable.guide1, R.drawable.guide2};
     private String[] des = {"在这里\n你可以听到周围人的心声", "在这里\nTA会在下一秒遇见你", "在这里\n不再错过可以改变你一生的人"};
@@ -38,11 +38,11 @@ public class CustomerBannerItemActivity extends AppCompatActivity {
         mViewPager.setAutoPlay(false)
                 .setCanLoop(false)
                 .showIndicator(false)
-                .setOnPageClickListener(position -> Toast.makeText(CustomerBannerItemActivity.this,
+                .setOnPageClickListener(position -> Toast.makeText(CustomerBannerPageActivity.this,
                         "点击页面" + mViewPager.getCurrentItem(), Toast.LENGTH_SHORT).show())
                 .setHolderCreator(() -> {
                     CustomPageViewHolder customPageViewHolder = new CustomPageViewHolder();
-                    customPageViewHolder.setOnSubViewClickListener((view, position) -> Toast.makeText(CustomerBannerItemActivity.this,
+                    customPageViewHolder.setOnSubViewClickListener((view, position) -> Toast.makeText(CustomerBannerPageActivity.this,
                             "立即体验" + (position + 1), Toast.LENGTH_SHORT).show());
                     return customPageViewHolder;
                 }).create(getData());

+ 13 - 23
app/src/main/java/com/example/zhpan/circleviewpager/activity/IndicatorStyleActivity.java

@@ -1,38 +1,29 @@
 package com.example.zhpan.circleviewpager.activity;
 
-import androidx.appcompat.app.AppCompatActivity;
 
 import android.graphics.Color;
 import android.os.Bundle;
 
 import com.example.zhpan.circleviewpager.R;
-import com.example.zhpan.circleviewpager.viewholder.SlideModeViewHolder;
+import com.example.zhpan.circleviewpager.viewholder.ImageResourceViewHolder;
 import com.zhpan.bannerview.BannerViewPager;
 import com.zhpan.bannerview.enums.IndicatorSlideMode;
 import com.zhpan.bannerview.enums.IndicatorStyle;
 import com.zhpan.bannerview.utils.DpUtils;
 
-import java.util.Arrays;
-import java.util.List;
+public class IndicatorStyleActivity extends BaseDataActivity {
 
-public class IndicatorStyleActivity extends AppCompatActivity {
-    private String[] picUrls = {"http://pic31.nipic.com/20130801/11604791_100539834000_2.jpg",
-            "http://pic37.nipic.com/20140115/7430301_100825571157_2.jpg",
-            "http://pic29.nipic.com/20130507/8952533_183922555000_2.jpg",
-            "http://b-ssl.duitang.com/uploads/item/201706/10/20170610095055_G5LM8.jpeg"};
-    private BannerViewPager<String, SlideModeViewHolder> mViewPagerSmoothSlide;
-    private List<String> mList;
+    private BannerViewPager<Integer, ImageResourceViewHolder> mViewPagerSmoothSlide;
 
-    private BannerViewPager<String, SlideModeViewHolder> mViewPagerNormalSlide;
+    private BannerViewPager<Integer, ImageResourceViewHolder> mViewPagerNormalSlide;
 
-    private BannerViewPager<String, SlideModeViewHolder> mViewPagerDash;
+    private BannerViewPager<Integer, ImageResourceViewHolder> mViewPagerDash;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_indicator_slide_mode);
         setTitle(getString(R.string.indicator_style));
-        mList = Arrays.asList(picUrls);
         initCircleNormalSlide();
         initCircleSmoothSlide();
         initDashIndicator();
@@ -41,15 +32,14 @@ public class IndicatorStyleActivity extends AppCompatActivity {
     private void initDashIndicator() {
         mViewPagerDash = findViewById(R.id.banner_view_dash);
         mViewPagerDash.setAutoPlay(true).setCanLoop(true)
-                .setRoundCorner(DpUtils.dp2px(5))
                 .setIndicatorGap(DpUtils.dp2px(5))
-                .setScrollDuration(1000)
+                .setScrollDuration(1000).setPageMargin(DpUtils.dp2px(20))
                 .setIndicatorHeight(DpUtils.dp2px(2.5f))
                 .setIndicatorStyle(IndicatorStyle.DASH)
-                .setIndicatorWidth(DpUtils.dp2px(10),DpUtils.dp2px(5))
-                .setHolderCreator(SlideModeViewHolder::new)
+                .setIndicatorWidth(DpUtils.dp2px(10), DpUtils.dp2px(5))
+                .setHolderCreator(ImageResourceViewHolder::new)
                 .setIndicatorColor(Color.parseColor("#888888"),
-                        Color.parseColor("#118EEA")).create(mList);
+                        Color.parseColor("#118EEA")).create(mDrawableList);
     }
 
     private void initCircleSmoothSlide() {
@@ -61,9 +51,9 @@ public class IndicatorStyleActivity extends AppCompatActivity {
                 .setIndicatorStyle(IndicatorStyle.CIRCLE)
                 .setIndicatorSlideMode(IndicatorSlideMode.SMOOTH)
                 .setIndicatorRadius(DpUtils.dp2px(6), DpUtils.dp2px(7))
-                .setHolderCreator(SlideModeViewHolder::new)
+                .setHolderCreator(ImageResourceViewHolder::new)
                 .setIndicatorColor(Color.parseColor("#935656"),
-                        Color.parseColor("#CCFF4C39")).create(mList);
+                        Color.parseColor("#CCFF4C39")).create(mDrawableList);
     }
 
     private void initCircleNormalSlide() {
@@ -75,9 +65,9 @@ public class IndicatorStyleActivity extends AppCompatActivity {
                 .setIndicatorStyle(IndicatorStyle.CIRCLE)
                 .setIndicatorWidth(DpUtils.dp2px(8))
                 .setIndicatorSlideMode(IndicatorSlideMode.NORMAL)
-                .setHolderCreator(SlideModeViewHolder::new)
+                .setHolderCreator(ImageResourceViewHolder::new)
                 .setIndicatorColor(Color.parseColor("#888888"),
-                        Color.parseColor("#118EEA")).create(mList);
+                        Color.parseColor("#118EEA")).create(mDrawableList);
     }
 
     @Override

+ 5 - 2
app/src/main/java/com/example/zhpan/circleviewpager/activity/MainActivity.java

@@ -21,11 +21,14 @@ public class MainActivity extends AppCompatActivity {
     public void onClick(View view) {
         Intent intent;
         switch (view.getId()) {
+            case R.id.tv_page_style:
+                intent = new Intent(this, PageStyleActivity.class);
+                break;
             case R.id.btn_custom_indicator:
                 intent = new Intent(this, CustomIndicatorActivity.class);
                 break;
             case R.id.btn_view_pager3:
-                intent = new Intent(this, BannerPhotoViewActivity.class);
+                intent = new Intent(this, PhotoViewActivity.class);
                 break;
             case R.id.btn_view_pager4:
                 intent = new Intent(this, NetworkBannerActivity.class);
@@ -37,7 +40,7 @@ public class MainActivity extends AppCompatActivity {
                 intent = new Intent(this, IndicatorStyleActivity.class);
                 break;
             default:
-                intent = new Intent(this, CustomerBannerItemActivity.class);
+                intent = new Intent(this, CustomerBannerPageActivity.class);
                 break;
         }
         startActivity(intent);

+ 42 - 0
app/src/main/java/com/example/zhpan/circleviewpager/activity/PageStyleActivity.java

@@ -0,0 +1,42 @@
+package com.example.zhpan.circleviewpager.activity;
+
+import android.os.Bundle;
+
+import com.example.zhpan.circleviewpager.R;
+import com.example.zhpan.circleviewpager.viewholder.ImageResourceViewHolder;
+import com.zhpan.bannerview.BannerViewPager;
+import com.zhpan.bannerview.enums.PageStyle;
+import com.zhpan.bannerview.utils.DpUtils;
+
+public class PageStyleActivity extends BaseDataActivity {
+    private BannerViewPager<Integer, ImageResourceViewHolder> mBannerViewPager;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_page_style);
+        mBannerViewPager = findViewById(R.id.banner_view);
+        setupBanner();
+    }
+
+    private void setupBanner() {
+        mBannerViewPager
+                .setPageMargin(DpUtils.dp2px(20))
+                .setRevealWidth(DpUtils.dp2px(20))
+                .setHolderCreator(ImageResourceViewHolder::new)
+                .setPageStyle(PageStyle.MULTI_PAGE)
+                .create(mDrawableList);
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        mBannerViewPager.stopLoop();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        mBannerViewPager.startLoop();
+    }
+}

+ 1 - 7
app/src/main/java/com/example/zhpan/circleviewpager/activity/BannerPhotoViewActivity.java → app/src/main/java/com/example/zhpan/circleviewpager/activity/PhotoViewActivity.java

@@ -11,7 +11,7 @@ import com.zhpan.bannerview.enums.IndicatorSlideMode;
 import java.util.ArrayList;
 import java.util.List;
 
-public class BannerPhotoViewActivity extends AppCompatActivity {
+public class PhotoViewActivity extends AppCompatActivity {
     private List<Integer> mDrawableList = new ArrayList<>();
 
     @Override
@@ -23,12 +23,6 @@ public class BannerPhotoViewActivity extends AppCompatActivity {
         initViewPager();
     }
 
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-        //  没有开启自动轮播,不需要stopLoop
-    }
-
     private void initViewPager() {
         BannerViewPager<Integer, PhotoViewHolder> bannerViewPager = findViewById(R.id.viewpager);
         bannerViewPager.setAutoPlay(false)

+ 3 - 4
app/src/main/java/com/example/zhpan/circleviewpager/viewholder/SlideModeViewHolder.java → app/src/main/java/com/example/zhpan/circleviewpager/viewholder/ImageResourceViewHolder.java

@@ -19,7 +19,7 @@ import com.zhpan.bannerview.holder.ViewHolder;
  *   Description:
  * </pre>
  */
-public class SlideModeViewHolder implements ViewHolder<String> {
+public class ImageResourceViewHolder implements ViewHolder<Integer> {
     private ImageView mImageView;
 
     @Override
@@ -30,8 +30,7 @@ public class SlideModeViewHolder implements ViewHolder<String> {
     }
 
     @Override
-    public void onBind(Context context, String data, int position, int size) {
-        ImageLoaderOptions options = new ImageLoaderOptions.Builder().into(mImageView).load(data).placeHolder(R.drawable.placeholder).build();
-        ImageLoaderManager.getInstance().loadImage(options);
+    public void onBind(Context context, Integer data, int position, int size) {
+        mImageView.setImageResource(data);
     }
 }

BIN
app/src/main/res/drawable-hdpi/t0.jpg


BIN
app/src/main/res/drawable-hdpi/t1.jpg


BIN
app/src/main/res/drawable-hdpi/t2.jpg


BIN
app/src/main/res/drawable-hdpi/t3.jpg


BIN
app/src/main/res/drawable-xhdpi/t0.jpg


BIN
app/src/main/res/drawable-xhdpi/t1.jpg


BIN
app/src/main/res/drawable-xhdpi/t2.jpg


BIN
app/src/main/res/drawable-xhdpi/t3.jpg


BIN
app/src/main/res/drawable-xxhdpi/t0.jpg


BIN
app/src/main/res/drawable-xxhdpi/t1.jpg


BIN
app/src/main/res/drawable-xxhdpi/t2.jpg


BIN
app/src/main/res/drawable-xxhdpi/t3.jpg


BIN
app/src/main/res/drawable-xxxhdpi/t0.jpg


BIN
app/src/main/res/drawable-xxxhdpi/t1.jpg


BIN
app/src/main/res/drawable-xxxhdpi/t2.jpg


BIN
app/src/main/res/drawable-xxxhdpi/t3.jpg


+ 59 - 20
app/src/main/res/layout/activity_main.xml

@@ -3,55 +3,94 @@
     android:id="@+id/activity_main"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:orientation="vertical"
-    android:padding="15dp">
+    android:orientation="vertical">
 
-    <Button
+    <TextView
+        android:id="@+id/tv_page_style"
+        android:layout_width="match_parent"
+        android:layout_height="50dp"
+        android:gravity="center"
+        android:onClick="onClick"
+        android:text="@string/page_style" />
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:background="#dddddd" />
+    <TextView
         android:id="@+id/btn_indicator_style"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
+        android:layout_height="50dp"
+        android:gravity="center"
         android:onClick="onClick"
-        android:layout_marginTop="15dp"
         android:text="@string/indicator_style" />
 
-    <Button
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:background="#dddddd" />
+
+    <TextView
         android:id="@+id/btn_custom_indicator"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
+        android:layout_height="50dp"
+        android:gravity="center"
         android:onClick="onClick"
-        android:layout_marginTop="15dp"
         android:text="@string/custom_indicator_view" />
 
-    <Button
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:background="#dddddd" />
+
+    <TextView
         android:id="@+id/btn_view_pager4"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
+        android:layout_height="50dp"
+        android:gravity="center"
         android:onClick="onClick"
-        android:layout_marginTop="15dp"
         android:text="@string/load_data" />
 
-    <Button
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:background="#dddddd" />
+
+    <TextView
         android:id="@+id/btn_view_pager2"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="15dp"
+        android:layout_height="50dp"
+        android:gravity="center"
         android:onClick="onClick"
         android:text="@string/title_custom_page" />
 
-    <Button
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:background="#dddddd" />
+
+    <TextView
         android:id="@+id/btn_view_pager3"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="15dp"
+        android:layout_height="50dp"
+        android:gravity="center"
         android:onClick="onClick"
         android:text="@string/wrapper_photo_view" />
 
-    <Button
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:background="#dddddd" />
+
+    <TextView
         android:id="@+id/btn_view_pager5"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="15dp"
+        android:layout_height="50dp"
+        android:gravity="center"
         android:onClick="onClick"
         android:text="@string/title_transformer" />
 
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:background="#dddddd" />
 </LinearLayout>

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

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout 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"
+    tools:context=".activity.PageStyleActivity">
+
+    <com.zhpan.bannerview.BannerViewPager
+        android:id="@+id/banner_view"
+        android:layout_width="match_parent"
+        android:layout_height="180dp"
+        android:layout_marginTop="20dp" />
+
+</RelativeLayout>

+ 1 - 0
app/src/main/res/values/strings.xml

@@ -12,4 +12,5 @@
     <string name="normal">NORMAL</string>
     <string name="smooth">SMOOTH</string>
     <string name="custom_indicator_view">Custom IndicatorView</string>
+    <string name="page_style">页面样式</string>
 </resources>

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

@@ -13,17 +13,17 @@ import androidx.annotation.Nullable;
 import androidx.viewpager.widget.ViewPager;
 
 import android.util.AttributeSet;
-import android.view.LayoutInflater;
 import android.view.MotionEvent;
 import android.view.View;
-import android.widget.FrameLayout;
 import android.widget.RelativeLayout;
 
 import com.zhpan.bannerview.enums.IndicatorStyle;
+import com.zhpan.bannerview.enums.PageStyle;
 import com.zhpan.bannerview.indicator.BaseIndicatorView;
 import com.zhpan.bannerview.indicator.DashIndicatorView;
 import com.zhpan.bannerview.indicator.IIndicator;
 import com.zhpan.bannerview.indicator.IndicatorFactory;
+import com.zhpan.bannerview.transform.ScaleInTransformer;
 import com.zhpan.bannerview.utils.DpUtils;
 import com.zhpan.bannerview.adapter.BannerPagerAdapter;
 import com.zhpan.bannerview.enums.IndicatorSlideMode;
@@ -45,7 +45,7 @@ import java.util.List;
 /**
  * Created by zhpan on 2017/3/28.
  */
-public class BannerViewPager<T, VH extends ViewHolder> extends FrameLayout implements
+public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout implements
         ViewPager.OnPageChangeListener {
 
     private ViewPager mViewPager;
@@ -82,7 +82,17 @@ public class BannerViewPager<T, VH extends ViewHolder> extends FrameLayout imple
     // 轮播指示器
     private IIndicator mIndicatorView;
     //  存放IndicatorView的容器
-    RelativeLayout mRelativeLayout;
+    private RelativeLayout mRelativeLayout;
+
+    /**
+     * 一屏多页page的间距
+     */
+    private int mPageMargin;
+    /**
+     * 一屏多页,显露其它page的width
+     */
+    private int mRevealWidth;
+
     /**
      * 指示器Style样式
      *
@@ -91,7 +101,6 @@ public class BannerViewPager<T, VH extends ViewHolder> extends FrameLayout imple
      */
     private IndicatorStyle mIndicatorStyle;
 
-
     private HolderCreator<VH> holderCreator;
     // IndicatorView的滑动模式
     private IndicatorSlideMode mIndicatorSlideMode;
@@ -132,43 +141,45 @@ public class BannerViewPager<T, VH extends ViewHolder> extends FrameLayout imple
 
     public BannerViewPager(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
-        init(attrs, context);
+        init(attrs);
     }
 
-    private void init(AttributeSet attrs, Context context) {
-        initValues(attrs, context);
+    private void init(AttributeSet attrs) {
+        initValues(attrs);
         initView();
         initScroller();
     }
 
     private void initView() {
-        View view = LayoutInflater.from(getContext()).inflate(R.layout.layout_banner_view_pager, this);
-        mViewPager = view.findViewById(R.id.vp_main);
-        mRelativeLayout = view.findViewById(R.id.rl_indicator);
+        inflate(getContext(), R.layout.layout_banner_view_pager, this);
+        mViewPager = findViewById(R.id.vp_main);
+        mRelativeLayout = findViewById(R.id.rl_indicator);
         mList = new ArrayList<>();
     }
 
-    private void initValues(AttributeSet attrs, Context context) {
+    private void initValues(AttributeSet attrs) {
         if (attrs != null) {
             TypedArray typedArray =
                     getContext().obtainStyledAttributes(attrs, R.styleable.BannerViewPager);
-            interval = typedArray.getInteger(R.styleable.BannerViewPager_interval, 3000);
+            interval = typedArray.getInteger(R.styleable.BannerViewPager_bvp_interval, 3000);
             indicatorCheckedColor =
-                    typedArray.getColor(R.styleable.BannerViewPager_indicator_checked_color,
+                    typedArray.getColor(R.styleable.BannerViewPager_bvp_indicator_checked_color,
                             Color.parseColor("#8C18171C"));
             indicatorNormalColor =
-                    typedArray.getColor(R.styleable.BannerViewPager_indicator_normal_color,
+                    typedArray.getColor(R.styleable.BannerViewPager_bvp_indicator_normal_color,
                             Color.parseColor("#8C6C6D72"));
-            normalIndicatorWidth = (int) typedArray.getDimension(R.styleable.BannerViewPager_indicator_radius,
+            normalIndicatorWidth = (int) typedArray.getDimension(R.styleable.BannerViewPager_bvp_indicator_radius,
                     DpUtils.dp2px(8));
             indicatorGap = normalIndicatorWidth;
             indicatorHeight = normalIndicatorWidth / 2;
             checkedIndicatorWidth = normalIndicatorWidth;
             mIndicatorStyle = IndicatorStyle.CIRCLE;
             mIndicatorSlideMode = IndicatorSlideMode.NORMAL;
-            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);
+            isAutoPlay = typedArray.getBoolean(R.styleable.BannerViewPager_bvp_auto_play, true);
+            isCanLoop = typedArray.getBoolean(R.styleable.BannerViewPager_bvp_can_loop, true);
+            gravity = typedArray.getInt(R.styleable.BannerViewPager_bvp_indicator_gravity, 0);
+            mPageMargin = (int) typedArray.getDimension(R.styleable.BannerViewPager_bvp_page_margin, 0);
+            mRevealWidth = (int) typedArray.getDimension(R.styleable.BannerViewPager_bvp_reveal_width, 0);
             typedArray.recycle();
         }
     }
@@ -660,7 +671,48 @@ public class BannerViewPager<T, VH extends ViewHolder> extends FrameLayout imple
         mViewPager.setCurrentItem(toUnrealPosition(item), smoothScroll);
     }
 
-//    public BannerViewPager<T, VH> setOnPageSelectedListener(OnPageSelectedListener onPageSelectedListener) {
+    /**
+     * 设置Banner页面样式
+     *
+     * @return
+     */
+    public BannerViewPager<T, VH> setPageStyle(PageStyle pageStyle) {
+        switch (pageStyle) {
+            case MULTI_PAGE:
+                setMultiPageStyle();
+                break;
+        }
+        return this;
+    }
+
+    private void setMultiPageStyle() {
+        setClipChildren(false);
+        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mViewPager.getLayoutParams();
+        params.leftMargin = mPageMargin + mRevealWidth;
+        params.rightMargin = mPageMargin + mRevealWidth;
+        mViewPager.setPageMargin(mPageMargin);
+        mViewPager.setOffscreenPageLimit(2);
+        setPageTransformer(new ScaleInTransformer());
+    }
+
+    /**
+     * 设置item间距
+     *
+     * @param pageMargin item间距
+     * @return BannerViewPager
+     */
+    public BannerViewPager<T, VH> setPageMargin(int pageMargin) {
+        mPageMargin = pageMargin;
+        mViewPager.setPageMargin(pageMargin);
+        return this;
+    }
+
+    public BannerViewPager<T, VH> setRevealWidth(int revealWidth) {
+        mRevealWidth = revealWidth;
+        return this;
+    }
+
+    //    public BannerViewPager<T, VH> setOnPageSelectedListener(OnPageSelectedListener onPageSelectedListener) {
 //        mOnPageSelectedListener = onPageSelectedListener;
 //        return this;
 //    }

+ 5 - 0
bannerview/src/main/java/com/zhpan/bannerview/enums/PageStyle.java

@@ -0,0 +1,5 @@
+package com.zhpan.bannerview.enums;
+
+public enum PageStyle {
+    MULTI_PAGE
+}

+ 27 - 0
bannerview/src/main/java/com/zhpan/bannerview/transform/BasePageTransformer.java

@@ -0,0 +1,27 @@
+package com.zhpan.bannerview.transform;
+
+import android.annotation.TargetApi;
+import android.os.Build;
+import android.view.View;
+
+import androidx.viewpager.widget.ViewPager;
+
+/**
+ * Created by zhy on 16/5/7.
+ */
+public abstract class BasePageTransformer implements ViewPager.PageTransformer {
+    protected ViewPager.PageTransformer mPageTransformer = NonPageTransformer.INSTANCE;
+    public static final float DEFAULT_CENTER = 0.5f;
+
+    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+    public void transformPage(View view, float position) {
+        if (mPageTransformer != null) {
+            mPageTransformer.transformPage(view, position);
+        }
+
+        pageTransform(view, position);
+    }
+
+    protected abstract void pageTransform(View view, float position);
+
+}

+ 17 - 0
bannerview/src/main/java/com/zhpan/bannerview/transform/NonPageTransformer.java

@@ -0,0 +1,17 @@
+package com.zhpan.bannerview.transform;
+
+import android.view.View;
+
+import androidx.viewpager.widget.ViewPager;
+
+/**
+ * Created by zhy on 16/5/7.
+ */
+public class NonPageTransformer implements ViewPager.PageTransformer {
+    @Override
+    public void transformPage(View page, float position) {
+        page.setScaleX(0.999f);
+    }
+
+    public static final ViewPager.PageTransformer INSTANCE = new NonPageTransformer();
+}

+ 63 - 0
bannerview/src/main/java/com/zhpan/bannerview/transform/ScaleInTransformer.java

@@ -0,0 +1,63 @@
+package com.zhpan.bannerview.transform;
+
+import android.annotation.TargetApi;
+import android.os.Build;
+import android.view.View;
+
+import androidx.viewpager.widget.ViewPager;
+
+public class ScaleInTransformer extends BasePageTransformer {
+
+    private static final float DEFAULT_MIN_SCALE = 0.85f;
+    private float mMinScale = DEFAULT_MIN_SCALE;
+
+    public ScaleInTransformer() {
+
+    }
+
+    public ScaleInTransformer(float minScale) {
+        this(minScale, NonPageTransformer.INSTANCE);
+    }
+
+    public ScaleInTransformer(ViewPager.PageTransformer pageTransformer) {
+        this(DEFAULT_MIN_SCALE, pageTransformer);
+    }
+
+    public ScaleInTransformer(float minScale, ViewPager.PageTransformer pageTransformer) {
+        mMinScale = minScale;
+        mPageTransformer = pageTransformer;
+    }
+
+
+    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+    public void pageTransform(View view, float position) {
+        int pageWidth = view.getWidth();
+        int pageHeight = view.getHeight();
+
+        view.setPivotY(pageHeight / 2);
+        view.setPivotX(pageWidth / 2);
+        if (position < -1) {
+            // This page is way off-screen to the left.
+            view.setScaleX(mMinScale);
+            view.setScaleY(mMinScale);
+            view.setPivotX(pageWidth);
+        } else if (position <= 1) {
+            // Modify the default slide transition to shrink the page as well
+            if (position < 0) {
+                float scaleFactor = (1 + position) * (1 - mMinScale) + mMinScale;
+                view.setScaleX(scaleFactor);
+                view.setScaleY(scaleFactor);
+                view.setPivotX(pageWidth * (DEFAULT_CENTER + (DEFAULT_CENTER * -position)));
+            } else {
+                float scaleFactor = (1 - position) * (1 - mMinScale) + mMinScale;
+                view.setScaleX(scaleFactor);
+                view.setScaleY(scaleFactor);
+                view.setPivotX(pageWidth * ((1 - position) * DEFAULT_CENTER));
+            }
+        } else {
+            view.setPivotX(0);
+            view.setScaleX(mMinScale);
+            view.setScaleY(mMinScale);
+        }
+    }
+}

+ 5 - 3
bannerview/src/main/res/layout/layout_banner_view_pager.xml

@@ -1,7 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<merge 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:layout_height="match_parent"
+    tools:parentTag="">
 
 
     <com.zhpan.bannerview.view.CatchViewPager
@@ -17,4 +19,4 @@
         android:layout_height="wrap_content"
         android:layout_alignParentBottom="true"
         android:padding="10dp" />
-</RelativeLayout>
+</merge>

+ 12 - 11
bannerview/src/main/res/values/attrs.xml

@@ -2,19 +2,20 @@
 <resources>
     <declare-styleable name="BannerViewPager">
         <!--页面切换时间间隔-->
-        <attr name="interval" format="integer"/>
-        <attr name="isCanLoop" format="boolean"/>
-        <attr name="isAutoPlay" format="boolean"/>
+        <attr name="bvp_interval" format="integer" />
+        <attr name="bvp_can_loop" format="boolean" />
+        <attr name="bvp_auto_play" format="boolean" />
         <!--<attr name="indicator_gravity" format="integer"/>-->
-        <attr name="indicator_checked_color" format="color"/>
-        <attr name="indicator_normal_color" format="color"/>
-        <attr name="indicator_radius" format="dimension"/>
-        <attr name="indicator_gravity" format="enum">
-            <enum name="center" value="0"/>
-            <enum name="start" value="1"/>
-            <enum name="end" value="2"/>
+        <attr name="bvp_indicator_checked_color" format="color" />
+        <attr name="bvp_indicator_normal_color" format="color" />
+        <attr name="bvp_indicator_radius" format="dimension" />
+        <attr name="bvp_indicator_gravity" format="enum">
+            <enum name="center" value="0" />
+            <enum name="start" value="1" />
+            <enum name="end" value="2" />
         </attr>
-
+        <attr name="bvp_page_margin" format="dimension" />
+        <attr name="bvp_reveal_width" format="dimension" />
     </declare-styleable>
 
 </resources>