前言
最近抽時間模仿實(shí)現(xiàn)了自如APP的底部導(dǎo)航切換動畫,其實(shí)我很忙的,也不知道在忙啥??????

仿自如APP底部導(dǎo)航動畫.gif
正文
自如APP底部Tab切換效果用的是SVGA動畫,SVGA 是一種跨平臺的開源動畫格式,同時兼容iOS/Android/Flutter/Web平臺。SVGA的簡單使用可以參考以下方式:
在項(xiàng)目根目錄的build.gradle文件中添加:
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
在模塊目錄的build.gradle文件中添加:
implementation 'com.github.yyued:SVGAPlayer-Android:2.0.0'
在xml中定義SVGAImageView控件:
<com.opensource.svgaplayer.SVGAImageView
android:id="@+id/svg_image_view"
android:layout_width="32dp"
android:layout_height="32dp"
app:source="svga/tab_my_select.svga"
app:autoPlay="false"
app:loopCount="1"
app:antiAlias="true"
/>
| 屬性 | 類型 | 默認(rèn)值 | 說明 |
|---|---|---|---|
| source | string | 空 | 文件路徑,相對于assets目錄的路徑或者為url |
| autoPlay | boolean | true | 是否自動播放動畫 |
| loopCount | integer | 0 | 動畫循環(huán)次數(shù),0表示無限循環(huán) |
| antiAlias | boolean | false | 畫筆是否抗鋸齒 |
| clearsAfterStop | boolean | true | 在動畫停止后是否清除畫布 |
| fillMode | enum | Forward | 取值為Forward或Backward,F(xiàn)orward表示動畫完成后將停留在最后一幀,Backward表示動畫完成后將停留在第一幀 |
在代碼中設(shè)置監(jiān)聽器,然后播放動畫,如下:
svg_image_view.callback = object : SVGACallback {
override fun onFinished() {
}
override fun onPause() {
}
override fun onRepeat() {
}
override fun onStep(frame: Int, percentage: Double) {
}
}
svg_image_view.startAnimation()
布局文件分析

布局.png
- 底部每個Tab由
SVGAImageView+ImageView+TextView組成。 - 當(dāng)Tab未選中時,
SVGAImageView隱藏,ImageView顯示未選中狀態(tài)下的圖片。 - 當(dāng)Tab選中時,
SVGAImageView顯示,ImageView先是不可見,然后播放SVGA動畫,播放完成后SVGAImageView隱藏,ImageView可見并顯示選中狀態(tài)下的圖片。
資源文件分析
解壓自如APP(7.2.8版本),提取資源文件。
- SVGA資源文件
位于assets\svga目錄下,可以直接把SVGA文件拖到svga特效在線預(yù)覽網(wǎng)站查看效果。
| 首頁 | 找房 | 發(fā)現(xiàn)生活 | 業(yè)主委托 | 我的 |
|---|---|---|---|---|
tab_home_select.svga |
tab_search_select.svga |
tab_service_select.svga |
tab_lvju.select.svga |
tab_my_select.svga |
- 靜態(tài)圖片文件
因自如APP對res目錄下的圖片資源做了處理,原來的圖片文件名字已經(jīng)替換成a.png,b.png這樣的字符串,可讀性很差,我整理了一下,如下:
| 首頁1 | 首頁2 | 找房1 | 找房2 | 發(fā)現(xiàn)生活1 |
|---|---|---|---|---|
![]() 1.png
|
![]() 2.png
|
![]() 3.png
|
![]() 4.png
|
![]() 5.png
|
| 發(fā)現(xiàn)生活2 | 業(yè)主委托1 | 業(yè)主委托2 | 我的1 | 我的2 |
|---|---|---|---|---|
![]() 6.png
|
![]() 7.png
|
![]() 8.png
|
![]() 9.png
|
![]() 10.png
|
代碼實(shí)現(xiàn)
代碼就不貼了,完整的代碼已經(jīng)上傳GitHub,地址為:https://github.com/kongpf8848/Animation,該項(xiàng)目包含了豐富的動畫示例(逐幀動畫,補(bǔ)間動畫,Lottie動畫,GIF動畫,SVGA動畫)
| 閃屏頁 | 引導(dǎo)頁 | 汽車之家 | 京東到家 |
|---|---|---|---|
![]() 閃屏頁
|
![]() 引導(dǎo)頁
|
![]() 汽車之家
|
![]() 京東到家
|













