Android 最完善的自定义Banner轮播图之一,带给你最全面的体验

Android 最完善的自定义Banner轮播图之一,带给你最全面的体验(三)

https://github.com/bingoogolapple/BGABanner-Android

1.使用BGABanner-Android来实现一屏三页效果(显示三页banner图片,中间大两边小的缩放效果)

其他的效果在上面的源码链接中都有,就不展示了,可以下载看看是不是自己需要的。

依赖:

//banner    implementation 'cn.bingoogolapple:bga-banner:2.1.7@aar'

 

dependencies {    implementation 'androidx.legacy:legacy-support-v4:2.2.7'    implementation 'cn.bingoogolapple:bga-banner:2.2.7@aar'}

 布局:

 

2.主要代码(JAVA):

private void refreshBanner(List bannerInfos){               banner.setAdapter(new BGABanner.Adapter() {            @Override            public void fillBannerItem(BGABanner banner, ImageView itemView, @Nullable BannerInfo model, int position) {                Glide.with(BannerTestActivity.this).load(model.getImagePath())                        .into(itemView);            }        });        banner.setData(bannerInfos, null);        banner.setClipChildren(false);//用来定义他的子控件是否要在他应有的边界内进行绘制。 默认情况下,clipChild被设置为true。 也就是不允许进行扩展绘制。        //viewPager的设置一定要在setData之后,因为BGABanner是在setData之后添加的viewPager,否则获取到的只会是null        BGAViewPager viewPager = banner.getViewPager();        //viewPager.setClipChildren(false);        viewPager.setPageMargin(ScreenUtil.dp2px(this,15));        viewPager.setOffscreenPageLimit(3);        RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) viewPager.getLayoutParams();        layoutParams.leftMargin = ScreenUtil.dp2px(this,40);        layoutParams.rightMargin = ScreenUtil.dp2px(this,40);        viewPager.setLayoutParams(layoutParams);        viewPager.setPageTransformer(true,new ScaleInTransformer());    }

 Kotlin实现方式:(这里只是实现了kotlin实现banner,一屏三页效果请参考上面代码写法)

 binding!!.banner2.setAdapter(object : BGABanner.Adapter {                override fun fillBannerItem(                    banner: BGABanner?,                    itemView: ImageView?,                    model: Ad?,                    position: Int                ) {                    //使用Glide设置圆角矩形,和banner的圆角设置一起使用,使用自定义RoundRectImageView圆角矩形图片无效                    //设置图片圆角角度                    val roundedCorners = RoundedCorners(30);//通过RequestOptions扩展功能,override:采样率,因为ImageView就这么大,可以压缩图片,降低内存消耗                    val options = RequestOptions.bitmapTransform(roundedCorners)                    Glide.with(this@HomeFragment).load(model?.img).apply(options).into(itemView!!)//                    Glide.with(this@HomeFragment).load(model?.img).fitCenter().apply(options).into(itemView!!)                }            })//setdata//            binding!!.banner.setData(R.layout.item_ad) setAllowUserScrollable            //sgf注意此轮播图数量小于3时不能自动轮播,这是bug的存在,需要替换控件或自己添加数据使其大于4方可自动轮播            binding!!.banner2.setData(it, null)            //自动轮播间隔            binding!!.banner2.setAutoPlayInterval(3000)            //点击自动播放            binding!!.banner2.setAutoPlayAble(true)//            binding!!.banner.setTransitionEffect(BGABanner.TransitionEffect.Rotate);            //是否允许滚动            binding!!.banner2.setAllowUserScrollable(true)            //开始自动播放            binding!!.banner2.startAutoPlay()            //设置轮播图圆角的方法            binding!!.banner2.setOutlineProvider(object : ViewOutlineProvider() {                override fun getOutline(view: View, outline: Outline) {                    outline.setRoundRect(0, 0, view.width, view.height, 30f)                }            })            binding!!.banner2.clipToOutline = true            //监听广告 item 的单击事件            binding!!.banner2.setDelegate(object : BGABanner.Delegate {                override fun onBannerItemClick(                    banner: BGABanner?,                    itemView: ImageView?,                    model: Ad?,                    position: Int                ) {                    val get = it?.get(position)                    if (get?.article_id != 0) {                        get?.article?.content?.let { it1 ->                            WebViewActivity.jumpToCurrentPage(                                mActivity!!,                                it1,                                get?.title,                                DateUtils.formatYMDHM(get?.updated.toLong())                            )                        }                    } else {                        WebViewActivity.jumpToCurrentPage(                            mActivity!!,                            get.url,                            get.title,                            DateUtils.formatYMDHM(get?.updated?.toLong())                        )                    }                }            })

3.自定义一屏三页效果:(ScaleInTransformer是viewPager的切换动画,view切换到两边时变小,在中间是最大)

import android.view.View;import android.support.v4.view.ViewPager;public class ScaleInTransformer implements ViewPager.PageTransformer {    private static final float DEFAULT_MIN_SCALE = 0.85f;    private float mMinScale = DEFAULT_MIN_SCALE;//view缩小值    public static final float DEFAULT_CENTER = 0.5f;    private int pageWidth;    private int pageHeight;    @Override    public void transformPage(View view, float position) {        pageWidth = view.getWidth();        pageHeight = view.getHeight();        view.setPivotY(pageHeight / 2);        view.setPivotX(pageWidth / 2);        if (position < -1.0f) {            // [-Infinity,-1)            // view移动到最左边,在屏幕之外            handleInvisiblePage(view, position);        } else if (position <= 0.0f) {            // [-1,0]            // view移动到左边            handleLeftPage(view, position);        } else if (position <= 1.0f) {            // view移动到右边            handleRightPage(view, position);        } else {            // (1,+Infinity]            //  view移动到右边,在屏幕之外            view.setPivotX(0);            view.setScaleX(mMinScale);            view.setScaleY(mMinScale);        }    }    public void handleInvisiblePage(View view, float position) {        view.setScaleX(mMinScale);        view.setScaleY(mMinScale);        view.setPivotX(pageWidth);    }       public void handleLeftPage(View view, float position) {        float scaleFactor = (1 + position) * (1 - mMinScale) + mMinScale;        view.setScaleX(scaleFactor);        view.setScaleY(scaleFactor);        view.setPivotX(pageWidth * (DEFAULT_CENTER + (DEFAULT_CENTER * -position)));    }    public void handleRightPage(View view, float position) {        float scaleFactor = (1 - position) * (1 - mMinScale) + mMinScale;        view.setScaleX(scaleFactor);        view.setScaleY(scaleFactor);        view.setPivotX(pageWidth * ((1 - position) * DEFAULT_CENTER));    }}

4.自定义属性说明:

                                                                                                                                                                                                                                                        
  • 软件首页: https://github.com/bingoogolapple/BGABanner-Android
  • 软件文档: https://github.com/bingoogolapple/BGABanner-Android/blob/master/README.md
  • 官方下载: https://github.com/bingoogolapple/BGABanner-Android/archive/master.zip

一个不错的仿转转的Banner无限轮播图: 

https://github.com/tokiii/RevealBanner

 

更多相关文章

  1. Android(安卓)实现指南针效果
  2. Android使用xml自定义软键盘效果(附源码)
  3. android之ImageView
  4. Android实现透明指示层
  5. Android(安卓)界面切换动画效果
  6. android:GLSurfaceView绘制bitmap图片及glViewport调整的效果
  7. Android(安卓)自定义ViewPager的滑动速度
  8. 浅谈Android下拉菜单Spinner
  9. android实现截图分享qq,微信

随机推荐

  1. PopWindow与ListView多选实现
  2. Android内容提供者之读取联系人信息
  3. Android(安卓)Activity 生命周期(lifecycl
  4. Android实现淘宝倒计时功能
  5. Android(安卓)The connection to adb is
  6. Android(安卓)Studio用法之ListView(图文
  7. (Android、Java) AES加密方法
  8. Android(安卓)添加动画的标签栏
  9. Gradle中的常量
  10. 【Android(安卓)开发教程】保存到外部存