前言
相信有些人用過miui,會發現小公尺的toast跟android傳統的toast特麼是不一樣的,他會從底部向上飛入,然後漸變消失。看起來效果是挺不錯的,但是對於android原生toast是不支援自定義動畫的。那這個效果到底是怎麼實現的呢?下面就來告訴你。。。。
分析如果園友看過我的另一篇部落格《 android:剖析原始碼,隨心所欲控制toast顯示》,就會知道其實原生toast就是infate出乙個view例項,然後將其載入到windowmanager上面來達到顯示效果。我們很多人都知道windowmanager是可以實現乙個懸浮在所有應用介面的檢視而不會獲取焦點,這也就是toast所需要具備的核心的功能: 簡約提示資訊傳遞給使用者,而不額外執行其他操作 ;在這裡,我們這個效果也是基於windowmanager來實現的。
正文我們需要自定義乙個toast的類,但是不需要繼承toast。既然是仿照著寫乙個自定義toast,那麼我們就從toast的入口開始完善這個自定義toast。
新建乙個類
public
class
miuitoast
乾乾淨淨的不用去繼承其他類(除了object.......)
開始碼**
我們一般使用原生toast都是直接 toast.maketext(this, text, toast.length_short).show(); 其中maketext這個靜態方法會返回乙個toast例項,然後呼叫show方法來顯示toast。
我們先來搞定maketext方法
public
static
miuitoast maketext(context context, string text, boolean
showtime)
邏輯簡單粗暴,直接呼叫建構函式例項化乙個miuitoast物件並返回。
接下來該是miuitoast的構造方法了
private
miuitoast(context context, string text, boolean
showtime )
在構造方法中,更多的是對資料的初始化,由於設定布局引數比較多,所以單獨抽出乙個函式來
瞧瞧setparams()方法
private這個設定引數更多是參考源**中原生toast的設定引數的型別,在這裡我們需要注意的是 mparams.windowanimations = r.style.anim_view;//設定進入退出動畫效果,這個使我們這個仿miui的toast動畫實現的基石。其他引數也沒什麼好講的,谷歌就是這麼設定他們的toast的哈,接下來我們得看看動畫的配置xml。void
setparams()
這個r.style.anim_view的情況呢
<這裡定義了乙個進入動畫和退出動畫的引用,接下來就是我們設定動畫效果的時刻了!resources
>
<
style
name
="anim_view"
>
<
item
name
="@android:windowenteranimation"
>@anim/anim_in
item
>
<
item
name
="@android:windowexitanimation"
>@anim/anim_out
item
>
style
>
resources
>
anim_in:toast的進入動畫
<在這裡我配置了四個動畫效果,如果大家要重新設定新的動畫效果,盡可以在這裡面修改哈。粗略的說幾句,由於在載入動畫的前後,windowmanager就通過mparams來確定toast的顯示位置,所以第乙個translate作用是讓toast在開始載入的時候跳轉到進入的位置,而其他的動畫就是完成toast從下端飛入的效果而已,這期間利用了android:startoffset進行時間的控制達到動畫的銜接效果。setxmlns:android
="">
<
translate
android:fromxdelta
="0"
android:fromydelta
="0"
android:toxdelta
="0"
android:toydelta
="85"
android:duration
="1"
/>
<
translate
android:fromxdelta
="0"
android:fromydelta
="0"
android:toxdelta
="0"
android:toydelta
="-105"
android:duration
="350"
android:fillafter
="true"
android:interpolator
="@android:anim
/decelerate_interpolator"
/>
<
alpha
android:fromalpha
="0"
android:toalpha
="1"
android:duration
="100"
/>
<
translate
android:fromxdelta
="0"
android:fromydelta
="0"
android:toxdelta
="0"
android:toydelta
="20"
android:duration
="80"
android:fillafter
="true"
android:startoffset
="350"
/>
set>
anim_out:toast退出動畫
<簡簡單單的乙個淡出動畫。。。。setxmlns:android
="">
<
alpha
android:fromalpha
="1"
android:toalpha
="0"
android:duration
="800"
/>
set>
然後我們來看下show()方法吧
public
void
show()
}, (
long
)(mshowtime ? 3500 : 2000
));}
}
在show方法中我們會對misshow 判斷當前的toast是否已經在顯示,如果正在顯示我們沒理由再顯示他一次哈。。
mwdm.addview(mtoastview, mparams);將view載入到windowmanager上面,達到類似的懸浮效果,啟動定時器,到達指定的時間後將其移動,整個邏輯就是這樣了。
因為——toast!就是這麼簡單!
給大家瞄瞄效果圖
用vue編寫帶動畫效果的toast
為了方便快速的使用動畫,我們可以使用現成的輪子 npm install animate.cssvue官方文件給我們指出了編寫外掛程式的步驟和一些引數,這裡提供給乙個編寫toast的模板 import animated from animate.css let toast toast.install ...
仿餘額寶的數字動畫效果
乙個簡單的自定義類 import android.animation.objectanimator import android.content.context import android.text.textutils import android.util.attributeset import...
仿網易nec首頁動畫效果
首先,介紹animation animation檢索或設定物件所應用的動畫特效。animation由 keyframes 這個屬性來實現這樣的效果。keyframes具有其自己的語法規則,他的命名是由 keyframes 開頭,後面緊接著是這個 動畫的名稱 加上一對花括號 括號中就是一些不同時間段樣...