一個炫酷的SearchView搜索動畫庫
本文出自cjj的開源項目:一個炫酷的SearchView搜索動畫庫。
前言:周末強擼一個庫,差點灰飛煙滅.無妨,人生自古誰無死,來生繼續擼代碼.
立馬入主題,幾乎每個App都有搜索功能,然而形式千篇一律。我舉個例子吧,就微信來說:
顯示一個搜索的圖標,點擊跳到另一個界面,輸入要搜索的東西
現在大部分App都是用這種方式了。我是希望能有App把這個功能做得酷炫點,畢竟它也是用戶經常要用到的,給用戶良好的體驗還是很重要的。 為此,我實現了別人設計的一些SearchView酷炫效果,可能不是很精致,你就勉強看看吧。
此時,如果你看完表格那些動畫,喜歡上它時,想知道他們是怎么在代碼中實現的,沒問題,我這就手把手教你撩一個絢麗的SearchViewAnim , 呵呵,有點吹大了,說說我怎么實現的吧。
實現思路
我們先對第一行表格的設計圖進行仔細觀察 ,效果是SearchView是由一個圓圈和一條直線(尾巴)構成的,開啟動畫時,尾巴慢慢消失成一點,然后這一點(dot) 進入圓圈內時,泛起波紋,在圈內四處逗留,然后在圓圈中心點停留閃爍,短暫的思考了下人生,又沖出去乖乖做一條尾巴。
咳,這是一個頓悟生命的dot啊!
相信大家通過我形象的描述已經知道效果是怎樣了,現在就把剛剛描敘的畫出來吧。
實現繪制
(1) 自定義類SearchView繼承View
重寫onDraw(Canvas canvas)
方法,利用畫筆Paint在畫布Canvas繪制一個普通的的視圖,如下:
這里有兩種畫法:
1.橫向畫圓、畫直線后,旋轉畫布45度
canvas.rotate(45, cx, cy); canvas.drawLine(cx + cr, cy, cx + cr * 2, cy, paint); canvas.drawCircle(cx, cy, cr, paint);
2.直接算出坐標點繪制
canvas.drawCircle(cx, cy, cr, paint); canvas.drawLine(cx + cr * sign, cy + cr * sign, scx, cy + cr * 2 * sign, paint);
這一步比較簡單,就不多說了。
(2) 實現動畫效果,這里的動畫有dot進入圈圈時泛起的波浪效果和dot在圈圈內的運行軌跡。
因為運行軌跡是固定的,我們把經過的路徑設置給Path,在構造PathMeasure
函數(不知道PathMeasure用法的同學自己搜索學習),使用它兩個方法getLength()
,.可獲取dot運行路徑的長度,getPosTan(float distance, float pos[],float tan[])
可根據distance可以獲取dot的坐標點pos[]. 寫成代碼就是:
//創建0~mPathMeasure.getLength()的過度動畫值 ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, mPathMeasure.getLength()); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { mPro = (float) valueAnimator.getAnimatedValue(); if (null != pathMeasure) pathMeasure.getPosTan(mPro, mPos, null);//獲取當前點坐標保存到mPos[] getSearchView().invalidate();//調用ondraw()函數 } });
至于dot進入圈圈時泛起的波浪效果,其實就是曲線的不斷擴大而已,這里我們可以利用貝塞爾函數quadTo()
,不斷改變控制點來實現該效果。
(3)收尾Reset
因為結束動畫之后,視圖和開始時一樣,所以我們并不需要繪制Reset時的動畫,只需重置狀態就可以了,而如果是有些情況,比如動畫停止后是箭頭的效果,就需要要逆著回去繪制SearchView的過程了。
其他動畫效果也是這樣一步一步把復雜的東西簡單化,最后你發現無非就是畫線、畫曲線、畫弧、畫圓這些,我就偷個懶,不講剩下效果的的實現方式了,自己看看源碼,可能比我吹水有用的多。
雜談
寫這些花費的時間、精力還是挺多的,因為需要一些數學計算(我數學爛)和不斷的調試才能繪制滿意的效果,所以建議如果項目需要,可以在別人實現的輪子上改改就好。我們都知道,一個App只能有一種風格,所以加入很多樣式的動畫是沒必要的,修改一種合適自己的就好。
水平有限及寫的隨意,該庫還是有不少問題,也希望你能PR,完善它。
來源:陳繼軍