你是否有遇到這樣的問題,,每次開發(fā)一個新的項目,,在 viewpager 這一塊上,總是在做重復的東西,,比如 app 引導頁,,輪播圖,viewpager+fragment 的 tab 指示器等等,,這些雖然簡單,,但卻是每個 app 都要的,而且很耗時,,有沒有每次在寫這個,,都很無語的感覺呢? 基于上面這種情況,,ViewPagerHelper 就誕生了,。ViewPagerHelper 是一個能快速幫你的完成 app 引導頁,輪播,,和viewpager 指示器的工具,,內(nèi)面內(nèi)置了常用屬性,滿足你日常對油膩的師姐的一切幻想,,解放你的雙手,,釋放你的靈魂。,。,。。,。
這里用的是 jitpack 這個網(wǎng)站,,所以: allprojects { repositories { ... maven { url 'https://' } } }
然后在你的 module 中添加: compile 'com.github.LillteZheng:ViewPagerHelper:v0.1'
下面上圖。 首先,,大家最常用到的就是輪播圖了,,這里給大家提供了 4 中常用的 Indicator 1、輪播圖第一個,,仿魅族的輪播圖,,加底部放大圓點: 這里解釋一下底部圓點放大的原理,其實非常簡單,,就是用一個 shade,,里面配置成 圓點,然后在代碼中去設(shè)置透明度和放大縮小,,就是這么簡單,;小伙伴們可以先按照這個思路自己做一下,或者可以下載代碼驗證一下。 第二個,,現(xiàn)在比較流行的弧形圖片 這個是比較流行的,,像淘寶,京東這些,,都用了這個,;這個弧形imageview 呢,也很簡單,,相信學習過拋物線大神的自定義專欄,,這個馬上就能想到了用什么方法了;沒錯,,就是用 BitmapShader,對圖片進行裁剪,,所以,我們可以用 path 把要繪制的形狀弄出來,,再用 BitmapShader 對圖片進行裁剪即可,。 如果你要使用弧形圖片,可以用 ArcImageView 這個控件,,可以這樣配置: <!--弧形圖片,,arc_height 為弧度的高度--> <com.zhengsr.viewpagerlib.view.ArcImageView android:id="@+id/arc_icon" android:layout_width="match_parent" android:layout_height="match_parent" app:arc_height="15dp" android:scaleType="centerCrop"/>
第三個,底部指示器是移動的,,看起來比較舒服 TransIndicator 提供了兩種,,一個是如圖的橢圓形,還是就是圓點,,可以選擇自己喜歡的,。它的原理呢,其實也不難,,就是先寫好4個小圓條,然后再繪制白色的圓條,,再根據(jù) viewpager 的 onPageScrolled 獲取距離的變化,,改變 canvas.translate 的繪制位置即可。 第四個,,底部指示器文字版本 有些 app 也用文字的方式,,這里也提供了一種,文字外面的圓圈可以取消,。顏色什么的自行定義,。 那么,想要使用上面那幾個樣式配置呢,?很簡單,,你需要三步: step1: 配置數(shù)據(jù),這里把 url 或者本地的 resid 的封裝到 list 中,因為我們一般是解析了 gson 之后,,獲取圖片和文字說明的,,所以,這里就用 list 吧,。 List<LoopBean> loopBeens = new ArrayList<>(); for (int i = 0; i < TEXT.length; i++) { LoopBean bean = new LoopBean(); bean.url = RESURL[i]; bean.text = TEXT[i]; loopBeens.add(bean); }
step2: 配置 PageBean,,這里主要是為了 viewpager 的指示器的作用,注意記得寫上泛型.這里為上面的 LoopBean,,如果你只是 String,,就上鞋 url,如果是 res,,就協(xié)商 integer,。 PageBean bean = new PageBean.Builder<LoopBean>() .setDataObjects(loopBeens) .setIndicator(zoomIndicator) .builder();
設(shè)置 viewpager 的動畫,這里提供了三種,,分別是 MzTransformer,,ZoomOutPageTransformer, 和 DepthPageTransformer,前者會魅族商城的方式,,后者為 google 提供默認的兩種動畫,,可以體驗一下,這里可有可無,這里我設(shè)置了魅族的效果,,這樣加上弧形的圖片更好看,。 mBannerCountViewPager.setPageTransformer(false,new MzTransformer());
step3: view 的接口提供出來,供大家自行配置,,這樣的好處在于,,實用性更高,你可以添加 gif,,或者視頻,,或者簡單的圖片,記得寫上 layout 文件,。 mBannerCountViewPager.setPagerListener(bean, R.layout.loop_layout, new PageHelperListener() { @Override public void getItemView(View view, Object data) { ImageView imageView = view.findViewById(R.id.loop_icon); LoopBean bean = (LoopBean) data; new GlideManager.Builder() .setContext(LoopActivity.this) .setImgSource(bean.url) .setLoadingBitmap(R.mipmap.ic_launcher) .setImageView(imageView) .builder(); TextView textView = view.findViewById(R.id.loop_text); textView.setText(bean.text); //如若你要設(shè)置點擊事件,,也可以直接通過這個view 來設(shè)置,或者圖片的更新等等 } });
xml 的配置,,其實就是一個 viewpager 加一個 linearlayout,,位置你自己去擺放
<com.zhengsr.viewpagerlib.view.BannerViewPager android:id="@+id/loop_viewpager_arc" android:layout_width="match_parent" android:layout_height="200dp" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:clipChildren="false" zsr:isloop="false" zsr:switchtime="600" /> <com.zhengsr.viewpagerlib.indicator.ZoomIndicator android:id="@+id/bottom_zoom_arc" android:layout_width="match_parent" android:layout_height="30dp" android:layout_gravity="bottom|right" android:layout_marginRight="20dp" android:gravity="center" zsr:zoom_alpha_min="0.5" zsr:zoom_leftmargin="10dp" zsr:zoom_max="1.5" zsr:zoom_selector="@drawable/bottom_circle" />
這樣就完成了輪播功能,是不是封裝之后,,媽媽再也不用擔心我寫輪播效果了呢 說完輪播圖,,再說說 viewpager + fragment 這種更加常用的方式, 這里也提供了三種比較常用的樣式,。 第一種,,無恥抄襲鴻洋大神的三角形版本 其實你會了輪播圖的移動版本,,那么這個對你來說,就是 a piece of cake,。所以,,就不解釋啦 第二種,條形狀的版本 沒啥好說的,,就是把上面的三角形改成條狀的,,機智如我,代碼全靠抄?。,。?!果然一個項目的質(zhì)量,,取決于你復制粘貼的技巧
第三種,文字顏色漸變的方式 像我們常用的今日頭條,,就是用這種方式,,而它的原理也是非常簡單,就是用額 clipRect 這個屬性,,先繪制一遍正常顏色的,,再繪制一遍其他顏色的,就可以了,。我建議你先自己用 clipRect 試一下不同的顏色,,再自己寫一下,你會發(fā)現(xiàn),,臥槽,,這么簡單的。,。,。。,。 這里的配置就更簡單了,,viewpager 就是普通的,關(guān)鍵就是這個 TabIndicator 了,,因為我把這三種效果都裝進去了. 三角形的xml <com.zhengsr.viewpagerlib.indicator.TabIndicator android:id="@+id/line_indicator" android:layout_width="match_parent" android:layout_height="50dp" android:background="@color/black_ff" app:tab_color="@color/white" app:tab_width="25dp" app:tab_height="5dp" app:tab_text_default_color="@color/white_ff" app:tab_text_change_color="@color/white" app:tab_show="true" app:tab_text_type="normaltext" app:tab_textsize="16sp" app:visiabel_size="3" app:tap_type="tri" > </com.zhengsr.viewpagerlib.indicator.TabIndicator>
可以看到你可以設(shè)置的它大小,里面的 textview 的顏色變化,,是否顯示,,和可視個數(shù),如果你想改成圓條的,,把 tabtype="tri" 的 tri 改成 rect 即可,,然后如果想使用 textview 顏色變化的,,只需要把 tabtext_type="normaltext" 中的 normaltext 改成 colortext 即可。 然后在代碼中這樣配置: /** * 把 TabIndicator 跟viewpager關(guān)聯(lián)起來 */ TabIndicator tabIndecator = (TabIndicator) findViewById(R.id.line_indicator); // 設(shè)置 viewpager的切換速度,,這樣點擊的時候比較自然 tabIndecator.setViewPagerSwitchSpeed(viewPager,600); tabIndecator.setTabData(viewPager,mTitle, new TabIndicator.TabClickListener() { @Override public void onClick(int position) { //頂部點擊的方法公布出來 viewPager.setCurrentItem(position); } });
這樣,,一個比較好用的 viewpager 加指示器的方式就完成了。 還有就是引導頁了,,這樣跟 輪播圖的配置差不多,,因為用的也是那幾個指示器。先看效果: 這里提供了三種樣式,,其實還有個文字,,不沒貼出來了,可以看輪播的,; 引導圖的配置非常簡單,,取一個底部為放大的來說:
GlideViewPager viewPager = (GlideViewPager) findViewById(R.id.splase_viewpager); ZoomIndicator zoomIndicator = (ZoomIndicator) findViewById(R.id.splase_bottom_layout); Button button = (Button) findViewById(R.id.splase_start_btn); //先把本地的圖片 id 裝進 list 容器中 List<Integer> images = new ArrayList<>(); for (int i = 0; i < RES.length; i++) { images.add(RES[i]); } //配置pagerbean,這里主要是為了viewpager的指示器的作用,,注意記得寫上泛型 PagerBean bean = new PagerBean.Builder<Integer>() .setDataObjects(images) .setIndicator(zoomIndicator) .setOpenView(button) .builder(); // 把數(shù)據(jù)添加到 viewpager中,,并把view提供出來,這樣除了方便調(diào)試,,也不會出現(xiàn)一個view,,多個 // parent的問題,這里在輪播圖比較明顯 viewPager.setPagerListener(bean, R.layout.image_layout, new PagerHelperListener() { @Override public void getItemView(View view, Object data) { //通過獲取到這個view,,你可以隨意定制你的內(nèi)容 ImageView imageView = view.findViewById(R.id.icon); imageView.setImageResource((Integer) data); } });
這里可以看到,,我把 view 提供出來,供大家自行配置,,這樣的好處在于,,實用性更高,你可以添加gif,,或者視頻,,或者簡單的圖片。 xml 的配置如下: <com.zhengsr.viewpagerlib.view.GlideViewPager android:id="@+id/splase_viewpager" android:layout_width="match_parent" android:layout_height="match_parent"/> <Button android:id="@+id/splase_start_btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_marginLeft="100dp" android:layout_marginRight="100dp" android:layout_marginBottom="50dp" android:background="@drawable/glide_bottom_btn_bg" android:textColor="@color/white" android:text="@string/start" android:textSize="18sp" android:visibility="gone" /> <com.zhengsr.viewpagerlib.indicator.ZoomIndicator android:id="@+id/splase_bottom_layout" android:layout_alignParentBottom="true" android:layout_width="match_parent" android:layout_height="50dp" android:gravity="center" zsr:zoom_selector="@drawable/bottom_circle" zsr:zoom_leftmargin="10dp" zsr:zoom_max="1.5" zsr:zoom_alpha_min="0.4" zsr:zoom_dismiss_open="true" android:orientation="horizontal"/>
這樣就基本講完了,,雖然不難,,確實經(jīng)常用到的,封裝起來,,總比做無用功來得好,。 奉上 github 鏈接:https://github.com/LillteZheng/ViewPagerHelper 里面有一些自定義屬性的說明。
如果你有想要的效果,,而本項目中沒有的,,你可以在 issue 中提出來,作者看到了,,會抽空去實現(xiàn)的,,如果有發(fā)現(xiàn)問題了或者需要提供哪些接口出來,,也可以在 issue 中提出來。當然,,喜歡請 start 或 fork 來一波,。 代碼是最好的老師,可以 download,,改成自己喜歡的,。
優(yōu)秀人才不缺工作機會,,只缺適合自己的好機會,。但是他們往往沒有精力從海量機會中找到最適合的那個。100offer 會對平臺上的人才和企業(yè)進行嚴格篩選,,讓「最好的人才」和「最好的公司」相遇,。掃描下方二維碼,注冊 100offer,,談?wù)勀銓ο乱环莨ぷ鞯钠诖?。一周?nèi),收到 5-10 個滿足你要求的好機會,!
|