[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-4039":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":16,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":23,"hasPages":21,"topics":24,"createdAt":10,"pushedAt":10,"updatedAt":29,"readmeContent":30,"aiSummary":31,"trendingCount":16,"starSnapshotCount":16,"syncStatus":17,"lastSyncTime":32,"discoverSource":33},4039,"banner","youth5201314\u002Fbanner","youth5201314","🔥🔥🔥Banner 2.0 来了！Android广告图片轮播控件，内部基于ViewPager2实现，Indicator和UI都可以自定义。","",null,"Java",13029,2523,231,44,0,2,9,45,"Apache License 2.0",false,"master",true,[25,5,26,27,28],"androidx","indicator","viewpager","viewpager2","2026-06-12 02:00:57","\r\n## Banner 2.0 全新升级\r\n> 只做一个可以自定义的轮播容器，不侵入UI ———— Banner 2.0\r\n\r\n```\r\n> 各位老铁反馈的问题我都有看，不是不解决，有时真的很难复现，\r\n> 如果能在提交问题时，有条件提供个demo发到我邮箱，方便定位问题，毕竟大家的场景和使用方式都有差异，\r\n> 我自己也在使用，在多个千万级APP上一直稳定运行，如果真有严重问题肯定第一时间就修复了\r\n```\r\n\r\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fyouth5201314\u002Fbanner\u002Ftree\u002Frelease-1.4.10\" target=\"_blank\">Banner 1.4.10(还想看老版本的可以点击这里)\u003C\u002Fa>\r\n\r\n### 阔别已久，从新回归\r\n\r\n* 首先我声明几点：\r\n    * 这只是一个开源库，如果满意你可以使用、可以借鉴修改，希望对你们有所帮助。\r\n    * 如果不满意请友好的提出，注明错误的详细信息或者修改建议，好的想法和自定义的东西亦可以直接提交，大家都能来一起完善。\r\n    * 如果你觉得实在是没用，也请你做一个有自我修养的人。\r\n   \r\n### 主要改进功能介绍\r\n最开始是想上传以前基于viewpager更新好的版本，但是看着viewpager2正式版已经出来了，就上新的吧，viewpager2确实比viewpager性能好很多。\r\n\r\n- [x] 使用了ViewPager2为基础控件  \u003Ca href=\"https:\u002F\u002Fdeveloper.android.google.cn\u002Fjetpack\u002Fandroidx\u002Freleases\u002Fviewpager2\" target=\"_blank\">ViewPager2介绍\u003C\u002Fa>\r\n- [x] 支持了androidx兼容包\r\n- [x] 方便了UI、Indicator自定义\r\n- [x] 支持画廊效果、魅族效果\r\n- [x] 兼容了水平和垂直轮播，也可以实现类似淘宝头条的效果\r\n- [x] 依赖包目前只需要导入了ViewPager2\r\n\r\n\r\n\r\n### 效果图\r\n更多效果运行demo查看\r\n\r\n![默认](images\u002Fbanner_example.gif)\r\n\r\n![画廊](images\u002Fbanner_example2.gif)\r\n\r\n![魅族](images\u002Fbanner_example1.gif)\r\n\r\n![头条](images\u002Fbanner_example3.gif)\r\n\r\n##### 内置了多种PageTransformer效果\r\n\r\n![DepthPageTransformer](images\u002FDepthPageTransformer.gif)\r\n![ZoomOutPageTransformer](images\u002FZoomOutPageTransformer.gif)\r\n\r\n|内置的PageTransformer|\r\n|---|\r\n|AlphaPageTransformer|\r\n|DepthPageTransformer|\r\n|RotateDownPageTransformer|\r\n|RotateUpPageTransformer|\r\n|RotateYTransformer|\r\n|ScaleInTransformer|\r\n|ZoomOutPageTransformer|\r\n 也可以组合使用效果更佳\r\n\r\n## 方法\r\n更多方法以实际使用为准，下面不一定全部列出了\r\n\r\n|方法名|返回类型|描述|\r\n|---|---|---|\r\n|getAdapter()|extends BannerAdapter|获取你设置的BannerAdapter\r\n|getViewPager2()|ViewPager2|获取ViewPager2\r\n|getIndicator()|Indicator|获取你设置的指示器（没有设置直接获取会抛异常哦）\r\n|getIndicatorConfig()|IndicatorConfig|获取你设置的指示器配置信息（没有设置直接获取会抛异常哦）\r\n|getRealCount()|int|返回banner真实总数\r\n|setUserInputEnabled(boolean)|this|禁止手动滑动Banner;true 允许，false 禁止\r\n|setDatas(List\u003CT>)|this|重新设置banner数据\r\n|isAutoLoop(boolean)|this|是否允许自动轮播\r\n|setLoopTime(long)|this|设置轮播间隔时间（默认3000毫秒）\r\n|setScrollTime(long)|this|设置轮播滑动的时间（默认800毫秒）\r\n|start()|this|开始轮播(主要配合生命周期使用)，或者你手动暂停再次启动\r\n|stop()|this|停止轮播(主要配合生命周期使用)，或者你需要手动暂停\r\n|setAdapter(T extends BannerAdapter)|this|设置banner的适配器\r\n|setAdapter(T extends BannerAdapter,boolean)|this|设置banner的适配器,是否支持无限循环\r\n|setOrientation(@Orientation)|this|设置banner轮播方向(垂直or水平)\r\n|setOnBannerListener(this)|this|设置点击事件，下标是从0开始\r\n|addOnPageChangeListener(this)|this|添加viewpager2的滑动监听\r\n|setPageTransformer(PageTransformer)|this|设置viewpager的切换效果\r\n|addPageTransformer(PageTransformer)|this|添加viewpager的切换效果（可以设置多个）\r\n|setIndicator(Indicator)|this|设置banner轮播指示器(提供有base和接口，可以自定义)\r\n|setIndicator(Indicator,boolean)|this|设置指示器（传false代表不将指示器添加到banner上，配合布局文件，可以自我发挥）\r\n|setIndicatorSelectedColor(@ColorInt)|this|设置指示器选中颜色\r\n|setIndicatorSelectedColorRes(@ColorRes)|this|设置指示器选中颜色\r\n|setIndicatorNormalColor(@ColorInt)|this|设置指示器默认颜色\r\n|setIndicatorNormalColorRes(@ColorRes)|this|设置指示器默认颜色\r\n|setIndicatorGravity(@IndicatorConfig.Direction)|this|设置指示器位置（左，中，右）\r\n|setIndicatorSpace(int)|this|设置指示器之间的间距\r\n|setIndicatorMargins(IndicatorConfig.Margins)|this|设置指示器的Margins\r\n|setIndicatorWidth(int,int)|this|设置指示器选中和未选中的宽度，直接影响绘制指示器的大小\r\n|setIndicatorNormalWidth(int)|this|设置指示器未选中的宽度\r\n|setIndicatorSelectedWidth(int)|this|设置指示器选中的宽度\r\n|setIndicatorRadius(int)|this|设置指示器圆角，不要圆角可以设置为0\r\n|setIndicatorHeight(int)|this|设置指示器高度\r\n|setBannerRound(float)|this|设置banner圆角（还有一种setBannerRound2方法，需要5.0以上）\r\n|setBannerGalleryEffect(int,int,float)|this|画廊效果\r\n|setBannerGalleryMZ(int,float)|this|魅族效果\r\n|setStartPosition(int)|this|设置开始的位置 (需要在setAdapter或者setDatas之前调用才有效哦)\r\n|setIndicatorPageChange()|this|设置指示器改变监听 (一般是为了配合数据操作使用，看情况自己发挥)\r\n|setCurrentItem()|this|设置当前位置，和原生使用效果一样\r\n|addBannerLifecycleObserver()|this|给banner添加生命周期观察者，内部自动管理banner的生命周期\r\n\r\n\r\n## Attributes属性\r\n>在banner布局文件中调用,如果你自定义了indicator请做好兼容处理。\r\n下面的属性并不是每个指示器都用得到，所以使用时要注意！\r\n\r\n|Attributes|format|describe\r\n|---|---|---|\r\n|banner_loop_time|integer|轮播间隔时间，默认3000\r\n|banner_auto_loop|boolean|是否自动轮播，默认true\r\n|banner_infinite_loop|boolean|是否支持无限循环（即首尾直接过渡），默认true\r\n|banner_orientation|enum|轮播方向：horizontal（默认） or vertical\r\n|banner_radius|dimension|banner圆角半径，默认0（不绘制圆角）\r\n|banner_indicator_normal_width|dimension|指示器默认的宽度，默认5dp （对RoundLinesIndicator无效）\r\n|banner_indicator_selected_width|dimension|指示器选中的宽度，默认7dp \r\n|banner_indicator_normal_color|color|指示器默认颜色，默认0x88ffffff\r\n|banner_indicator_selected_color|color|指示器选中颜色，默认0x88000000\r\n|banner_indicator_space|dimension|指示器之间的间距，默认5dp （对RoundLinesIndicator无效）\r\n|banner_indicator_gravity|dimension|指示器位置，默认center\r\n|banner_indicator_margin|dimension|指示器的margin,默认5dp，不能和下面的同时使用\r\n|banner_indicator_marginLeft|dimension|指示器左边的margin\r\n|banner_indicator_marginTop|dimension|指示器上边的margin\r\n|banner_indicator_marginRight|dimension|指示器右边的margin\r\n|banner_indicator_marginBottom|dimension|指示器下边的margin\r\n|banner_indicator_height|dimension|指示器高度（对CircleIndicator无效）\r\n|banner_indicator_radius|dimension|指示器圆角（对CircleIndicator无效）\r\n|banner_round_top_left|boolean|设置要绘制的banner圆角方向（如果都不设置默认全部）\r\n|banner_round_top_right|boolean|设置要绘制的banner圆角方向（如果都不设置默认全部）\r\n|banner_round_bottom_left|boolean|设置要绘制的banner圆角方向（如果都不设置默认全部）\r\n|banner_round_bottom_right|boolean|设置要绘制的banner圆角方向（如果都不设置默认全部）\r\n\r\n\r\n\r\n## 使用步骤\r\n>以下提供的是最简单的步骤，需要复杂的样式自己可以自定义\r\n\r\n#### Step 1.依赖banner\r\nGradle \r\n```groovy\r\n\r\nrepositories {\r\n    maven { url \"https:\u002F\u002Fs01.oss.sonatype.org\u002Fcontent\u002Fgroups\u002Fpublic\" }\r\n}\r\n\r\ndependencies{\r\n    \u002F\u002F2.1.0以前jcenter的依赖\r\n    \u002F\u002Fimplementation 'com.youth.banner:banner:2.1.0'\r\n    \u002F\u002F现在Maven Central\r\n    implementation 'io.github.youth5201314:banner:2.2.3'\r\n\r\n}\r\n```\r\n\r\n#### Step 2.添加权限到你的 AndroidManifest.xml\r\n```xml\r\n\u003C!-- if you want to load images from the internet -->\r\n\u003Cuses-permission android:name=\"android.permission.INTERNET\" \u002F> \r\n\r\n```\r\n\r\n#### Step 3.在布局文件中添加Banner，可以设置自定义属性\r\n！！！此步骤可以省略，可以直接在Activity或者Fragment中new Banner();\r\n```xml\r\n\u003Ccom.youth.banner.Banner\r\n    xmlns:app=\"http:\u002F\u002Fschemas.android.com\u002Fapk\u002Fres-auto\"\r\n    android:id=\"@+id\u002Fbanner\"\r\n    android:layout_width=\"match_parent\"\r\n    android:layout_height=\"高度自己设置\" \u002F>\r\n```\r\n\r\n#### Step 4.继承BannerAdapter，和RecyclerView的Adapter一样（如果你只是图片轮播也可以使用默认的）\r\n！！！此步骤可以省略，图片轮播提供有默认适配器，其他的没有提供是因为大家的可变性要求不确定，所以直接自定义的比较好。\r\n```java\r\n\r\n\u002F**\r\n * 自定义布局，下面是常见的图片样式，更多实现可以看demo，可以自己随意发挥\r\n *\u002F\r\npublic class ImageAdapter extends BannerAdapter\u003CDataBean, ImageAdapter.BannerViewHolder> {\r\n\r\n    public ImageAdapter(List\u003CDataBean> mDatas) {\r\n        \u002F\u002F设置数据，也可以调用banner提供的方法,或者自己在adapter中实现\r\n        super(mDatas);\r\n    }\r\n\r\n    \u002F\u002F创建ViewHolder，可以用viewType这个字段来区分不同的ViewHolder\r\n    @Override\r\n    public BannerViewHolder onCreateHolder(ViewGroup parent, int viewType) {\r\n        ImageView imageView = new ImageView(parent.getContext());\r\n        \u002F\u002F注意，必须设置为match_parent，这个是viewpager2强制要求的\r\n        imageView.setLayoutParams(new ViewGroup.LayoutParams(\r\n                ViewGroup.LayoutParams.MATCH_PARENT,\r\n                ViewGroup.LayoutParams.MATCH_PARENT));\r\n        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);\r\n        return new BannerViewHolder(imageView);\r\n    }\r\n\r\n    @Override\r\n    public void onBindView(BannerViewHolder holder, DataBean data, int position, int size) {\r\n        holder.imageView.setImageResource(data.imageRes);\r\n    }\r\n\r\n    class BannerViewHolder extends RecyclerView.ViewHolder {\r\n        ImageView imageView;\r\n\r\n        public BannerViewHolder(@NonNull ImageView view) {\r\n            super(view);\r\n            this.imageView = view;\r\n        }\r\n    }\r\n}\r\n\r\n```\r\n\r\n#### Step 5.Banner具体方法调用 \r\n\r\n```java\r\npublic class BannerActivity extends AppCompatActivity {\r\n    public void useBanner() {\r\n        \u002F\u002F--------------------------简单使用-------------------------------\r\n        banner.addBannerLifecycleObserver(this)\u002F\u002F添加生命周期观察者\r\n                .setAdapter(new BannerExampleAdapter(DataBean.getTestData()))\r\n                .setIndicator(new CircleIndicator(this));\r\n        \r\n        \u002F\u002F—————————————————————————如果你想偷懒，而又只是图片轮播————————————————————————\r\n         banner.setAdapter(new BannerImageAdapter\u003CDataBean>(DataBean.getTestData3()) {\r\n                    @Override\r\n                    public void onBindView(BannerImageHolder holder, DataBean data, int position, int size) {\r\n                        \u002F\u002F图片加载自己实现\r\n                        Glide.with(holder.itemView)\r\n                             .load(data.imageUrl)\r\n                             .apply(RequestOptions.bitmapTransform(new RoundedCorners(30)))\r\n                             .into(holder.imageView);\r\n                    }\r\n                })\r\n                .addBannerLifecycleObserver(this)\u002F\u002F添加生命周期观察者\r\n                .setIndicator(new CircleIndicator(this));\r\n        \u002F\u002F更多使用方法仔细阅读文档，或者查看demo\r\n    }\r\n}\r\n```\r\n\r\n## Banner使用中优化体验\r\n**如果你需要考虑更好的体验，可以看看下面的代码**\r\n#### Step 1.（可选）生命周期改变时\r\n```java\r\npublic class BannerActivity {\r\n  \r\n    \u002F\u002F方法一：自己控制banner的生命周期\r\n    \r\n    @Override\r\n    protected void onStart() {\r\n        super.onStart();\r\n        \u002F\u002F开始轮播\r\n        banner.start();\r\n    }\r\n    \r\n    @Override\r\n    protected void onStop() {\r\n        super.onStop();\r\n        \u002F\u002F停止轮播\r\n        banner.stop();\r\n    }\r\n    \r\n    @Override\r\n    protected void onDestroy() {\r\n        super.onDestroy();\r\n        \u002F\u002F销毁\r\n        banner.destroy();\r\n    }\r\n    \r\n    \u002F\u002F方法二：调用banner的addBannerLifecycleObserver()方法，让banner自己控制\r\n   \r\n    protected void onCreate(Bundle savedInstanceState) {\r\n         \u002F\u002F添加生命周期观察者\r\n        banner.addBannerLifecycleObserver(this);\r\n    }\r\n}\r\n```\r\n\r\n\r\n## 常见问题（收录被反复询问的问题）\r\n\r\n* 网络图片加载不出来？\r\n\r\n  `banner本身不提供图片加载功能，首先确认banner本身使用是否正确，具体参考demo，\r\n  然后请检查你的图片加载框架或者网络请求框架，服务端也可能加了https安全认证，是看下是否报有证书相关错误`\r\n  \r\n* 怎么实现视频轮播？\r\n\r\n  `demo中有实现类似淘宝商品详情的效果，第一个放视频，后面的放的是图片，并且可以设置首尾不能滑动。\r\n  因为大家使用的播放器不一样业务环境也不同，具体情况自己把握，demo就是给一个思路哈！可以参考和修改`\r\n\r\n* 我想指定轮播开始的位置？\r\n\r\n  `现在提供了setStartPosition()方法，在sheAdapter和setDatas直接调用一次就行了，当然setAdapter后通过setCurrentItem设置也行`\r\n\r\n* 父控件滑动时，banner切换会获取焦点，然后自动全部显示。不想让banner获取焦点可以给父控件加上：\r\n\r\n    ```\r\n        \u002F\u002Fbanner也一定要用最新版哦！\r\n        android:focusable=\"true\"\r\n        android:focusableInTouchMode=\"true\"\r\n    ```\r\n* 怎么设置圆角？\r\n  1、调用提供的方法或者自定义属性进行设置，这里设置的是banner本身的圆角，不是轮播内view的圆角\r\n  2、在adapter中对自定义的view进行自己实现，就拿图片举例：可以自己定义一个圆角的ImageView控件，或者使用glide渲染都行。请举一反三，view都自定义了还有什么不能改的？\r\n  \r\n    \r\n## Thanks\r\n\r\n- [MZBannerView](https:\u002F\u002Fgithub.com\u002Fpinguo-zhouwei\u002FMZBannerView)\r\n- [MagicViewPager](https:\u002F\u002Fgithub.com\u002FhongyangAndroid\u002FMagicViewPager)\r\n- [zguop的viewpager2的滑动时间解决方案](https:\u002F\u002Fgithub.com\u002Fzguop\u002Fbanner\u002Fblob\u002Fmaster\u002Fpager2banner\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fto\u002Faboomy\u002Fpager2banner\u002FBanner.java)\r\n\r\n\r\n### 联系方式  \u003Ca target=\"_blank\" href=\"http:\u002F\u002Fmail.qq.com\u002Fcgi-bin\u002Fqm_share?t=qm_mailme&email=KBkYGhAfGhEYEB5oWVkGS0dF\" style=\"text-decoration:none;\">\u003Cimg src=\"images\u002Fmailme.png\"\u002F>\u003C\u002Fa>\r\n* 我的个人微博：https:\u002F\u002Fweibo.com\u002Fu\u002F3013494003 有兴趣的也可以关注，大家一起交流\r\n* 有问题可以加群大家一起交流，如果你觉得对你有帮助可以扫描下面支付宝二维码随意打赏下哦！\r\n\r\n\u003Cimg src=\"images\u002Fqq.png\" width=\"220\"\u002F> \u003Cimg src=\"images\u002Fpay.jpg\" width=\"220\"\u002F>\r\n\r\n\r\n## 更新说明\r\n[更新说明](update_message.md)\r\n\r\n","Banner 2.0 是一个基于 Android 平台的广告图片轮播控件，内部使用 ViewPager2 实现，支持自定义 Indicator 和 UI。项目的核心功能包括支持画廊效果、魅族效果以及水平和垂直轮播模式，兼容 androidx 包，并且内置了多种 PageTransformer 效果以增强用户体验。此外，它提供了丰富的 API 来设置数据源、指示器样式、轮播间隔时间等，方便开发者根据需求定制化开发。此项目适用于需要在应用中展示图片或内容轮播的各种场景，如新闻资讯、商品展示等，特别适合追求高性能和良好用户体验的应用程序。","2026-06-11 02:58:04","top_language"]