關於圖片輪播廣告窗體的Banner那些事。。。。
阿新 • • 發佈:2019-02-16
簡介
現在的絕大數app都有banner介面,實現迴圈播放多個廣告圖片和手動滑動迴圈等功能。因為ViewPager並不支援迴圈翻頁, 所以要實現迴圈還得需要自己去動手,我就把專案中的控制元件剔了出來,希望大家覺得有用。目前框架可以進行不同樣式、不同動畫設定, 以及完善的api方法能滿足大部分的需求了。
效果圖
模式 | 圖片 |
指示器模式 |
|
數字模式 |
|
數字加標題模式 |
|
指示器加標題模式 垂直顯示 |
|
指示器加標題模式 水平顯示 |
|
常量
常量名稱 | 描述 | 所屬方法 |
BannerConfig.NOT_INDICATOR | 不顯示指示器和標題 |
setBannerStyle |
BannerConfig.CIRCLE_INDICATOR |
顯示圓形指示器 |
setBannerStyle |
BannerConfig.NUM_INDICATOR | 顯示數字指示器 | setBannerStyle |
BannerConfig.NUM_INDICATOR_TITLE | 顯示數字指示器和標題 | setBannerStyle |
BannerConfig.CIRCLE_INDICATOR_TITLE | 顯示圓形指示器和標題(垂直顯示) | setBannerStyle |
BannerConfig.CIRCLE_INDICATOR_TITLE_INSIDE |
顯示圓形指示器和標題(水平顯示) |
setBannerStyle |
BannerConfig.LEFT | 指示器居左 | setIndicatorGravity |
BannerConfig.CENTER | 指示器居中 | setIndicatorGravity |
BannerConfig.RIGHT | 指示器居右 | setIndicatorGravity |
動畫常量類(setBannerAnimation方法呼叫)
常量類名 |
Transformer.Default |
Transformer.Accordion |
Transformer.BackgroundToForeground |
Transformer.ForegroundToBackground |
Transformer.CubeIn |
Transformer.CubeOut |
Transformer.DepthPage |
Transformer.FlipHorizontal |
Transformer.FlipVertical |
Transformer.RotateDown |
Transformer.RotateUp |
Transformer.ScaleInOut |
Transformer.Stack |
Transformer.Tablet |
Transformer.ZoomIn |
Transformer.ZoomOut |
Transformer.ZoomOutSlide |
方法
方法名 | 描述 | 版本限制 |
setBannerStyle(int bannerStyle) | 設定輪播樣式(預設為CIRCLE_INDICATOR) | 無 |
setIndicatorGravity(int type) | 設定指示器位置(沒有標題預設為右邊,有標題時預設左邊) | 無 |
isAutoPlay(boolean isAutoPlay) | 設定是否自動輪播(預設自動) | 無 |
startAutoPlay() | 開始輪播 | 1.4開始,此方法只作用於banner載入完畢-->需要在start()後執行 |
stopAutoPlay() |
結束輪播 |
1.4開始,此方法只作用於banner載入完畢-->需要在start()後執行 |
start() | 開始進行banner渲染 | 1.4開始 |
setOffscreenPageLimit(int limit) | 同viewpager的方法作用一樣 | 1.4.2開始 |
setBannerTitle(String[] titles) | 設定輪播要顯示的標題和圖片對應(如果不傳預設不顯示標題) | 1.3.3結束 |
setBannerTitleList(List titles) | 設定輪播要顯示的標題和圖片對應(如果不傳預設不顯示標題) | 1.3.3結束 |
setBannerTitles(List titles) | 設定輪播要顯示的標題和圖片對應(如果不傳預設不顯示標題) | 1.4開始 |
setDelayTime(int time) | 設定輪播圖片間隔時間(單位毫秒,預設為2000) | 無 |
setImages(Object[]/List<?> imagesUrl) | 設定輪播圖片(所有設定引數方法都放在此方法之前執行) | 1.4後去掉陣列傳參 |
setImages(Object[]/List<?> imagesUrl,OnLoadImageListener listener) | 設定輪播圖片,並且自定義圖片載入方式 | 1.3.3結束 |
setOnBannerClickListener(this) | 設定點選事件,下標是從1開始 | 無 |
setOnLoadImageListener(this) | 設定圖片載入事件,可以自定義圖片載入方式 | 1.3.3結束 |
setImageLoader(Object implements ImageLoader) | 設定圖片載入器 | 1.4開始 |
setOnPageChangeListener(this) | 設定viewpager的滑動監聽 | 無 |
setBannerAnimation(Class<? extends PageTransformer> transformer) | 設定viewpager的預設動畫,傳值見動畫表 | 無 |
setPageTransformer(boolean reverseDrawingOrder, ViewPager.PageTransformer transformer) | 設定viewpager的自定義動畫 | 無 |
Attributes屬性(banner佈局檔案中呼叫)
Attributes | forma | describe |
delay_time | integer | 輪播執行時間,預設2000 |
is_auto_play | boolean | 是否自動輪播,預設true |
title_background | color | reference |
title_textcolor | color | 標題字型顏色 |
title_textsize | dimension | 標題字型大小 |
title_height | dimension | 標題欄高度 |
indicator_width | dimension | 指示器圓形按鈕的寬度 |
indicator_height | dimension | 指示器圓形按鈕的高度 |
indicator_margin | dimension | 指示器之間的間距 |
indicator_drawable_selected | reference | 指示器選中效果 |
indicator_drawable_unselected | reference | 指示器未選中效果 |
image_scale_type | enum(fit_xy/center_crop) | 和imageview的ScaleType作用一樣 |
使用步驟
Step 1.依賴banner
Gradle
dependencies{compile 'com.youth.banner:banner:1.4.2' //最新版本
or
compile 'com.youth.banner:banner:1.3.3' //舊版本,舊版本用法下面有跳轉連結}
或者引用本地lib
compile project(':banner')Step 2.新增許可權到你的 AndroidManifest.xml
<!-- if you want to load images from the internet --><uses-permission android:name="android.permission.INTERNET" /><!-- if you want to load images from a file OR from the internet --><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Step 3.在佈局檔案中新增Banner,可以設定自定義屬性
<com.youth.banner.Banner xmlns:app="http://schemas.android.com/apk/res-auto"!!!此步驟可以省略,直接在Activity或者Fragment中new Banner();
android:id="@+id/banner"
android:layout_width="match_parent"
android:layout_height="高度自己設定" />
Step 4.重寫圖片載入器
public class GlideImageLoader extends ImageLoader { @Override public void displayImage(Context context, Object path, ImageView imageView) { /** 常用的圖片載入庫: Universal Image Loader:一個強大的圖片載入庫,包含各種各樣的配置,最老牌,使用也最廣泛。 Picasso: Square出品,必屬精品。和OkHttp搭配起來更配呦! Volley ImageLoader:Google官方出品,可惜不能載入本地圖片~ Fresco:Facebook出的,天生驕傲!不是一般的強大。 Glide:Google推薦的圖片載入庫,專注於流暢的滾動。 *///Glide 載入圖片簡單用法 Glide.with(context).load(path).into(imageView);
//Picasso 載入圖片簡單用法 Picasso.with(context).load(path).into(imageView)
//用fresco載入圖片簡單用法 Uri uri = Uri.parse((String) path); imageView.setImageURI(uri); } //提供createImageView 方法,如果不用可以不重寫這個方法,方便fresco自定義ImageView @Override public ImageView createImageView(Context context) { SimpleDraweeView simpleDraweeView=new SimpleDraweeView(context); return simpleDraweeView; }}
Step 5.在Activity或者Fragment中配置Banner
--------------------------簡單使用-------------------------------@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Banner banner = (Banner) findViewById(R.id.banner); //設定圖片載入器 banner.setImageLoader(new GlideImageLoader()); //設定圖片集合 banner.setImages(images); //banner設定方法全部呼叫完畢時最後呼叫 banner.start();}--------------------------詳細使用-------------------------------@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Banner banner = (Banner) findViewById(R.id.banner); //設定banner樣式 banner.setBannerStyle(BannerConfig.CIRCLE_INDICATOR_TITLE); //設定圖片載入器 banner.setImageLoader(new GlideImageLoader()); //設定圖片集合 banner.setImages(images); //設定banner動畫效果 banner.setBannerAnimation(Transformer.DepthPage); //設定標題集合(當banner樣式有顯示title時) banner.setBannerTitles(Arrays.asList(titles)); //設定自動輪播,預設為true banner.isAutoPlay(true); //設定輪播時間 banner.setDelayTime(1500); //設定指示器位置(當banner模式中有指示器時) banner.setIndicatorGravity(BannerConfig.CENTER); //banner設定方法全部呼叫完畢時最後呼叫 banner.start();}-----------------當然如果你想偷下懶也可以這麼用--------------------@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Banner banner = (Banner) findViewById(R.id.banner); banner.setImages(images).setImageLoader(new GlideImageLoader()).start();}混淆程式碼
# glide 的混淆程式碼-keep public class * implements com.bumptech.glide.module.GlideModule-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { **[] $VALUES; public *;}
# banner 的混淆程式碼-keep class com.youth.banner.** { *;
}
原始碼地址:https://github.com/youth5201314