android仿苹果banner,GitHub - Miverk/BannerViewPager: An awesome banner for Android. 这可能是全网最好用的Banner。...

BannerViewPager

68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652532302d417061636865253230322d3333376162372e737667

68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4150492d31362532422d627269676874677265656e2e7376673f7374796c653d666c6174

68747470733a2f2f6a69747061636b2e696f2f762f7a6870616e7669702f42616e6e65725669657750616765722e737667

68747470733a2f2f6170692e62696e747261792e636f6d2f7061636b616765732f7a6870616e7669702f436972636c655669657750616765722f62616e6e6572766965772f696d616765732f646f776e6c6f61642e737667

68747470733a2f2f696d672e736869656c64732e696f2f62616467652f416e64726f6964253230417273656e616c2d42616e6e65725669657750616765722d627269676874677265656e2e7376673f7374796c653d666c6174

English | 中文

Tencent Video,QQ Music,KuGou,AliPay,Tmall,TaoBao,YouKu,Himalaya,NetEase Music,Bilibili ect. All of above App's Banner can be implements By BannerViewPager.

Preview

qrcode.png

1.setPageStyle

MULTI_PAGE

MULTI_PAGE_SCALE

MULTI_PAGE_OVERLAP

page_style_multi.gif

page_style_multi_scale.gif

page_style_multi_overlay.gif

2.setIndicatorStyle

BannerViewPager supports three Indicator Styles now. It's also support to custom indicator style,just need extends BaseIndicatorView or implement the IIndicator and override methods, then you can draw Indicators for whatever you want.

CIRCLE

DASH

ROUND_RECT

style_circle.gif

style_dash.gif

style_round_rect.gif

3.setIndicatorSlideMode

NORMAL

SMOOTH

slide_normal.gif

slide_smooth.gif

4.setPageTransformerStyle

parameters

STACK

ROTATE

DEPTH

ACCORDION

Preview

transform_stack.gif

transform_rotate.gif

transform_depth.gif

transform_accordion.gif

API

Method

Description

Default

BannerViewPager setCanLoop(boolean canLoop)

set is can loop

default value is true

BannerViewPager setAutoPlay(boolean autoPlay)

set is atuo play

default value true

BannerViewPager setInterval(int interval)

set the interval of item switch interval

The unit is millisecond,default value 3000ms

BannerViewPager setScrollDuration(int scrollDuration)

set page scroll duration

set page scroll duration

BannerViewPager setRoundCorner(int radius)

set Round Rectangle style for Banner

required SDK_INT>=LOLLIPOP(API 21)

BannerViewPager setOnPageClickListener(OnPageClickListener onPageClickListener)

set item click listener

BannerViewPager setHolderCreator(HolderCreator holderCreator)

set Holder Creator

You must set HolderCreator for BannerViewPager,or will throw NullPointerException

BannerViewPager setIndicatorVisibility(@Visibility int visibility)

indicator visibility

default value is VISIBLE,added in version 2.4.2

BannerViewPager setIndicatorStyle(int indicatorStyle)

set indicator style

enum(CIRCLE, DASH、ROUND_RECT) default CIRCLE

BannerViewPager setIndicatorGravity(int gravity)

set indicator gravity

enum(CENTER、START、END) default value CENTER

BannerViewPager setIndicatorColor(int normalColor,int checkedColor)

set indicator color

normalColor:color of indicator dot not selected, default value "#8C6C6D72", checkedColor:color of indicator selected default value is "#8C18171C"

BannerViewPager setIndicatorSlideMode(int slideMode)

set indicator slide mode

enum(NORMAL、SMOOTH),default value NORMAL

BannerViewPager setIndicatorRadius(int radius)

set indicator dot radius

default value is 4dp

BannerViewPager setIndicatorRadius(int normalRadius,int checkRadius)

set indicator dot radius

normalRadius:normal radius of indicator dot, checkedRadius:checked radius of indicator dot,default value is 4dp

BannerViewPager setIndicatorWidth(int indicatorWidth)

set indicator dot width,if it's Circle indicator the parameter is diameter of circle

default value is 8dp

BannerViewPager setIndicatorWidth(int normalWidth, int checkWidth)

set indicator dot width,if is circle style,the width is diameter of circle

default is 8dp

BannerViewPager setIndicatorHeight(int indicatorHeight)

set indicator hight,it's only used when the indicator style is dash

default value is normalIndicatorWidth/2

BannerViewPager setIndicatorGap(int indicatorMargin)

set the gap of indicator dot

default value is indicator dot width(or the diameter of circle)

BannerViewPager setIndicatorView(IIndicator indicatorView)

set custom indicator

The custom indicator must extends BaseIndicatorView or implements IIndicator

BannerViewPager setPageTransformerStyle(int style)

set transform style

BannerViewPager setCurrentItem(int item)

Set the currently selected page.

add in v2.3.5

int getCurrentItem()

get the current page position

added in v2.3.5

BannerViewPager setPageStyle(PageStyle pageStyle)

setPageStyle

support in v2.4.0. enum(MULTI_PAGE、MULTI_PAGE_SCALE、MULTI_PAGE_OVERLAP)

BannerViewPager setPageMargin(int pageMargin)

set item margin

added in v2.4.0

BannerViewPager setIndicatorMargin(int left, int top, int right, int bottom)

set margin for indicator

added in v2.4.1

BannerViewPager setOnPageChangeListener(OnPageChangeListener l)

set page change listener for BannerViewPager

added in v2.4.3

void startLoop()

start loop

the method will be called when BannerViewPager was initialized

void stopLoop()

stop loop

List getList()

get data in BannerViewPager

void create(List list)

initialize BannerViewPager

You must call this method when data is set

Attributes in xml

Attributes

format

description

bvp_interval

integer

set page switch interval

bvp_scroll_duration

integer

set page scroll duration

bvp_can_loop

boolean

set is can loop

bvp_auto_play

boolean

set is can auto play

bvp_indicator_checked_color

color

set checked color for indicator

bvp_indicator_normal_color

color

set normal color for indicator

bvp_indicator_radius

dimension

if it's circle style the value is radius of circle,if the indicator style is DASH or ROUND_RECT the value is width/2

bvp_round_corner

dimension

set round corner for banner

bvp_page_margin

dimension

set item margin

bvp_reveal_width

dimension

it's only used when the page style is MULTI_PAGE/MULTI_PAGE_SCALE/MULTI_PAGE_OVERLAP,the value is two side item reveal width

bvp_indicator_style

enum

indicator style. enum(circle/dash)

bvp_indicator_slide_mode

enum

indicator slide mode.enum(normal/smooth)

bvp_indicator_gravity

enum

indicator gravity. enum(center/start/end)

bvp_page_style

enum

page style. enum(normal/multi_page/multi_page_overlap/multi_page_scale)

bvp_transformer_style

enum

transform style. enum(normal/depth/stack/accordion)

bvp_indicator_visibility

enum

indicator visibility(visible/gone/invisible)

Usage

1.Gradle dependency

If you have migrated to Androidx,please add it in your root build.gradle at the end of repositories:

allprojects {

repositories {

...

maven { url 'https://jitpack.io' }

}

}

Then add the dependency in your app build.gradle

implementation 'com.github.zhpanvip:BannerViewPager:latestVersion'

Androidx latestVersion:68747470733a2f2f6a69747061636b2e696f2f762f7a6870616e7669702f42616e6e65725669657750616765722e737667

If you are still using android support library,you can add the dependency in your app build.gradle:

implementation 'com.zhpan.library:bannerview:latestVersion'

Android support latestVersion:68747470733a2f2f6170692e62696e747261792e636f6d2f7061636b616765732f7a6870616e7669702f436972636c655669657750616765722f62616e6e6572766965772f696d616765732f646f776e6c6f61642e737667

2.Add BannerViewPager in layout.xml

android:id="@+id/banner_view"

android:layout_width="match_parent"

android:layout_margin="10dp"

android:layout_height="160dp" />

3.The item layout of banner:

android:layout_width="match_parent"

android:layout_height="wrap_content">

android:id="@+id/banner_image"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:scaleType="centerCrop" />

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:background="#66000000"

android:gravity="center_vertical">

android:id="@+id/tv_describe"

android:layout_width="wrap_content"

android:layout_height="match_parent"

android:layout_gravity="center_vertical"

android:layout_marginStart="15dp"

android:gravity="center_vertical"

android:paddingTop="5dp"

android:paddingBottom="5dp"

android:textColor="#FFFFFF"

android:textSize="16sp" />

4.Set custom ViewHolder for BannerViewPager, the custom ViewHolder must implements com.zhpan.bannerview.holder.ViewHolder:

public class NetViewHolder implements ViewHolder {

@Override

public int getLayoutId() {

return R.layout.item_net;

}

@Override

public void onBind(View itemView, CustomBean data, int position, int size) {

CornerImageView imageView = itemView.findViewById(R.id.banner_image);

imageView.setRoundCorner(imageView.getContext().getResources().getDimensionPixelOffset(R.dimen.dp_5));

ImageLoaderOptions options = new ImageLoaderOptions.Builder()

.into(imageView).load(data.getImageRes())

.placeHolder(R.drawable.placeholder).build();

ImageLoaderManager.getInstance().loadImage(options);

}

}

5.Use BannerViewPager in Activity or Fragment:

Kotlin:

private lateinit var mViewPager: BannerViewPager

private fun initViewPager() {

mBannerViewPager = findViewById(R.id.banner_view)

mBannerViewPager.setCanLoop(false)

.setIndicatorSlideMode(IndicatorSlideMode.SMOOTH)

.setIndicatorMargin(0, 0, 0, getResources().getDimensionPixelOffset(R.dimen.dp_40))

.setIndicatorGravity(IndicatorGravity.CENTER)

.setHolderCreator { NetViewHolder() }

.setOnPageChangeListener(

object : OnPageChangeListenerAdapter() {

override fun onPageSelected(position: Int) {

pageSelect(position)

}

}

)

.create(res.toList())

}

Java:

private BannerViewPager mBannerViewPager;

...

private void initViewPager() {

mBannerViewPager = findViewById(R.id.banner_view);

mBannerViewPager.showIndicator(true)

.setInterval(3000)

.setCanLoop(false)

.setAutoPlay(true)

.setRoundCorner(getResources().getDimensionPixelOffset(R.dimen.dp_7))

.setIndicatorColor(Color.parseColor("#935656"), Color.parseColor("#FF4C39"))

.setIndicatorGravity(IndicatorGravity.END)

.setScrollDuration(1000).setHolderCreator(NetViewHolder::new)

.setOnPageClickListener(position -> {

CustomBean bannerData = mBannerViewPager.getList().get(position);

Toast.makeText(NetworkBannerActivity.this,

"点击了图片" + position + " " + bannerData.getImageDescription(), Toast.LENGTH_SHORT).show();

}).create(mList);

}

6.startLoop and stopLoop

If the version you used is later than 2.5.0,you don't need care of startLoop and stopLoop in Activity or Fragment. But the two methods is still public.

Recommend call stopLoop in onPause() and startLoop in onResume() to improve performance:

@Override

protected void onPause() {

if (mBannerViewPager != null)

mBannerViewPager.stopLoop();

super.onPause();

}

@Override

protected void onResume() {

super.onResume();

if (mBannerViewPager != null)

mBannerViewPager.startLoop();

}

7.Custom IndicatorView

The example will implement an custom IndicatorView as the follow gif.

Custom IndicatorView Style

style_custum.gif

(1)Custom View and extends BaseIndicatorView

public class FigureIndicatorView extends BaseIndicatorView {

private int radius = DpUtils.dp2px(20);

private int backgroundColor = Color.parseColor("#88FF5252");

private int textColor = Color.WHITE;

private int textSize=DpUtils.dp2px(13);

public FigureIndicatorView(Context context) {

this(context, null);

}

public FigureIndicatorView(Context context, @Nullable AttributeSet attrs) {

this(context, attrs, 0);

}

public FigureIndicatorView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

mPaint = new Paint();

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

setMeasuredDimension(2 * radius, 2 * radius);

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

mPaint.setColor(backgroundColor);

canvas.drawCircle(getWidth() / 2, getHeight() / 2, radius, mPaint);

mPaint.setColor(textColor);

mPaint.setTextSize(textSize);

String text = currentPosition + 1 + "/" + pageSize;

int textWidth = (int) mPaint.measureText(text);

Paint.FontMetricsInt fontMetricsInt = mPaint.getFontMetricsInt();

int baseline = (getMeasuredHeight() - fontMetricsInt.bottom + fontMetricsInt.top) / 2 - fontMetricsInt.top;

canvas.drawText(text, (getWidth() - textWidth) / 2, baseline, mPaint);

}

public void setRadius(int radius) {

this.radius = radius;

}

@Override

public void setBackgroundColor(@ColorInt int backgroundColor) {

this.backgroundColor = backgroundColor;

}

public void setTextSize(int textSize) {

this.textSize = textSize;

}

public void setTextColor(int textColor) {

this.textColor = textColor;

}

}

(2)Set custom indicator for BannerViewPager

FigureIndicatorView indicatorView = new FigureIndicatorView(mContext);

indicatorView.setRadius(getResources().getDimensionPixelOffset(R.dimen.dp_18));

indicatorView.setTextSize(getResources().getDimensionPixelOffset(R.dimen.dp_13));

indicatorView.setBackgroundColor(Color.parseColor("#aa118EEA"));

mViewPager.setIndicatorGravity(IndicatorGravity.END)

.setIndicatorView(indicatorView)

.setHolderCreator(() -> new ImageResourceViewHolder(0))

.create(mDrawableList);

TODO

Optimization and Refactoring IndicatorView(2.0.1)

Fix a bug which page frozen sometimes when sliding in version 2.1.0 (2.1.0.1)

Set Transform Style Supported(2.1.2)

Migrate to Androidx(2.2.0)

indicator smooth slide Supported(2.2.2)

Dash IndicatorView Supported(2.3.+)

MULTI_PAGE Style Supported(2.4.0)

Optimize code and improve performance in version 2.4.3

Refactor Indicator again (2.5.0)

Fix issue #34 which Indicator smooth slide problem(2.6.1).

Migrate to ViewPager2 (3.0.0)

If you have any question you can scan the QR code to join the QQ group to communicate.

qq_group.png

More details

Thanks

License

Copyright 2019 zhpanvip

Licensed under the Apache License, Version 2.0 (the "License");

you may not use this file except in compliance with the License.

You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an "AS IS" BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and

limitations under the License.