仿MIUI的Toast動畫效果實現

2021-07-10 12:54:44 字數 3881 閱讀 6593

前言

相信有些人用過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

void

setparams()

這個設定引數更多是參考源**中原生toast的設定引數的型別,在這裡我們需要注意的是 mparams.windowanimations = r.style.anim_view;//設定進入退出動畫效果,這個使我們這個仿miui的toast動畫實現的基石。其他引數也沒什麼好講的,谷歌就是這麼設定他們的toast的哈,接下來我們得看看動畫的配置xml。

這個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的進入動畫

<

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>

在這裡我配置了四個動畫效果,如果大家要重新設定新的動畫效果,盡可以在這裡面修改哈。粗略的說幾句,由於在載入動畫的前後,windowmanager就通過mparams來確定toast的顯示位置,所以第乙個translate作用是讓toast在開始載入的時候跳轉到進入的位置,而其他的動畫就是完成toast從下端飛入的效果而已,這期間利用了android:startoffset進行時間的控制達到動畫的銜接效果。

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 開頭,後面緊接著是這個 動畫的名稱 加上一對花括號 括號中就是一些不同時間段樣...