AlinBanner是一款Android轮播控件、引导页面滑动框架。支持有限、无限循环,可以自动、收动播放,支持自定义指示器,支持各种样式的自定义和多种图片类型,如Url、drawable加载。也可以选择酷炫切换动画的切换和自定义动画的扩张。是一款简单,易扩展、易使用框架。
虽然市面上已经有很多人在写这个图片轮播框架了,但是质量参差不齐,有很多功能都不全面,或多或少都由这样或者那样的问题。当然,也有不乏优秀的作品,其中,具有代表性的有BGABanner-Android和 youth5201314的banner两个banner框架。个人觉得这两个框架对于一般的需求是都可以满足的,但是也有点小问题:
1、banner框架:
1)对于非无限轮播不支持。
2)当用手指滑动页至不同页面时,当手指手动离开页面时,轮播图的位置没有处理好,还是手指滑动前的位置。
3)banner框架是用的静态布局文件布局的,扩展性不好。
2、BGABanner-Android:
1)对于图片的数据展示不能很好扩展。如用户图片想传静态的图片imageId或者drwable、或者url。
2)自定轮播次数是用的Integer的最大值,轮播次数受限制(这个可以满足正常需求)。
3)缓存机制做的不好。如动画缓存。
因此,为了更好的体验效果和框架的扩展性。自己整了这个框架AlinBanner。希望能解决大家在实际项目中的一些难缠的问题。好了,闲话休叙,直接上图了。
项目地址:https://github.com/Alin520/AlinBanner
点击下载 AlinBanner.apk 或扫描下面的二维码安装
支持圆形、数字、自定义的indicator。可以任意设置indicator的位置,以及title的位置和字体等属性。
支持各种轮播切换动画效果,并且支持自定义动画。注意这里不是本文的重点,所以动画效果展示的不多,因为网上这样的文章很多,直接拿来用就可以了。
支持我们每个APP用到的引导图。支持无限轮播和非无限轮播,以及无限轮播分为自动播放和手动播放效果。非无限轮播不支持自动播放,只能支持手动播放。
dependencies {
implementation 'com.alin:bannerview:2.0.1'
}
<com.alin.lib.bannerlib.BannerView
android:layout_width="match_parent"
android:layout_height="180dp"
android:id="@+id/banner_bv"
>com.alin.lib.bannerlib.BannerView>
本框架使用的是链式编程结构,美观、易懂。
mList = new ArrayList<>(); //ImageView数据
mList.add(R.mipmap.banner_1);
mList.add(R.mipmap.banner_2);
mList.add(R.mipmap.banner_3);
mTitles = new ArrayList<>(); //title数据
mTitles.add("第一页到货发动你的号看到回复");
mTitles.add("第二页佛挡");
mTitles.add("第三页大佛我as的后if好的搜iuuuu家的三");
mBannerView.setImages(mList) //ImageView数据
.setIndcatorTitles(mTitles) //title数据
.start(); //开始播放
mBannerView.setOnBannerClickListener(new OnBannerClickListener() {
@Override
public void onBannerClickListener(BannerImageView imageView, Integer model, int position) {
Toast.makeText(MainActivity.this,"第position=" + position + "被点击了,imageId=" + model,Toast.LENGTH_SHORT).show();
}
});
OnBannerClickListener类型需要与图片的数据类型保持一致。列如:setImages的图片数据是url的String类型,则泛型需要指定为String,若数据类型是Drawable,则泛型指定为Drawable。
本BannerView框架支持setImages的图片数据类型有常见的三种:Drawable、int(ImageId)、String(url)类型。
1)对于Drawable、int(ImageId)数据类型。直接设置mBannerView.setImages()即可。
2)对于String(url)类型,由于不同项目中使用的加载图片方式不一样,所以本框架提供了ImageLoaderInterface接口,支持自定义扩充。
默认是使用Glide加载url显示ImageView图片。如果使用默认的,则直接跟上述一样设置数据即可。如果使用其他的图片加载方式,如Fresco、Picasso,则需要实现ImageLoaderInterface接口,并且需要指定泛型类型ImageLoaderInterface<数据类型String,BannerImageView需要显示的ImageView>,如果不使用默认的Glide,而用自定义的Picasso加载图片,具体如下:
//设置图片加载方式
mBannerView.setImageLoader(new DisplayUrlImageView ())
public class DisplayUrlImageView implements ImageLoaderInterface<String,BannerImageView> {
@Override
public BannerImageView createImageView(Context context) {
return new BannerImageView(context);
}
@Override
public void displayImageView(Context context, String path, BannerImageView imageView) {
AppUtil.checkNotNull(path,"displayImageView path is null error!");
//Picasso 加载图片简单用法
Picasso.with(context).load(path).into(imageView);
}
}
内部已经做了防止多次点击处理,以及indicator指示器、跳过、进入按钮的显示隐藏处理。直接设置setSkipOrEnterListener()监听即可使用。
TextView skipView = (TextView) findViewById(R.id.skip_tv);
TextView enterView = (TextView) findViewById(R.id.enter_tv);
//设置引导图的跳转、进入按钮
mBannerView.setSkipOrEnterListener(skipView, enterView, new BannerView.OnSkipOrEnterCallback() {
@Override
public void onSkipOrEnterCallback() {
startActivity(new Intent(WelcomeActivity.this, MainActivity.class));
finish();
}
});
<declare-styleable name="banner_view">
<attr name="banner_height" format="dimension|reference">attr>
<attr name="banner_default_background_imageview" format="reference">attr>
<attr name="indicator_background_height" format="dimension|reference">attr>
<attr name="indicator_background_color" format="color|reference">attr>
<attr name="title_width" format="dimension|reference">attr>
<attr name="title_text_color" format="color|reference">attr>
<attr name="title_text_size" format="dimension|reference">attr>
<attr name="number_pointer_text_color" format="color|reference">attr>
<attr name="number_pointer_text_size" format="dimension|reference">attr>
<attr name="number_pointer_background" format="reference">attr>
<attr name="number_pointer_padding" format="dimension|reference">attr>
<attr name="pointer_height" format="dimension|reference">attr>
<attr name="pointer_width" format="dimension|reference">attr>
<attr name="pointer_select_height" format="dimension|reference">attr>
<attr name="pointer_select_width" format="dimension|reference">attr>
<attr name="pointer_drawable_selected" format="reference" />
<attr name="pointer_drawable_unselected" format="reference" />
<attr name="pointer_margin" format="dimension|reference">attr>
<attr name="indicator_left_and_right_padding" format="dimension|reference"/>
<attr name="indicator_top_and_bottom_padding" format="dimension|reference"/>
<attr name="indicator_left_and_right_margin" format="dimension|reference"/>
<attr name="indicator_top_and_bottom_margin" format="dimension|reference"/>
<attr name="is_auto_play" format="boolean">attr>
<attr name="interval_time" format="integer">attr>
<attr name="page_change_duration" format="integer">attr>
<attr name="is_touch_scroll" format="boolean">attr>
<attr name="is_infinite" format="boolean">attr>
<attr name="anim_min_alpha" format="float">attr>
<attr name="anim_min_scale" format="float">attr>
<attr name="anim_min_rotation" format="integer">attr>
<attr name="slid_effect" format="enum">
<enum name="Default" value="0">enum>
<enum name="Alpha" value="1">enum>
<enum name="Rotate" value="2">enum>
<enum name="Zoom" value="3">enum>
<enum name="Translate" value="4">enum>
<enum name="Folding" value="5">enum>
<enum name="Flip" value="6">enum>
<enum name="Cube" value="7">enum>
<enum name="Fade" value="8">enum>
<enum name="Flashing" value="9">enum>
attr>
<attr name="banner_pointer_gravity" format="enum">
<enum name="left" value="9" />
<enum name="center" value="13" />
<enum name="right" value="11" />
attr>
<attr name="title_gravity" format="enum">
<enum name="left" value="9" />
<enum name="center" value="13" />
<enum name="right" value="11" />
attr>
<attr name="indicator_gravity" format="enum">
<enum name="top" value="10" />
<enum name="bottom" value="12" />
attr>
<attr name="pointer_type" format="enum">
<enum name="none" value="0" />
<enum name="number" value="1" />
<enum name="circle" value="2" />
attr>
<attr name="banner_image_scale_type" format="enum">
<enum name="center" value="0" />
<enum name="center_crop" value="1" />
<enum name="center_inside" value="2" />
<enum name="fit_center" value="3" />
<enum name="fit_end" value="4" />
<enum name="fit_start" value="5" />
<enum name="fit_xy" value="6" />
<enum name="matrix" value="7" />
attr>
declare-styleable>
解决方式:设置高度为layout_height=”match_parent”或者具体的一个高度值即可
java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex。
解决方式:因为你项目中也引用了v7包,只用删除本地引用的V7(com.android.support:appcompat-v7:26.1.0)包即可。
如果你觉得AlinBanner 能帮到你真正解决项目中的问题,就在博客中个我点个赞,或者去我的github中star。
如果项目中有问题,可以直接给我留言。