一個炫酷的SearchView搜索動畫庫

GloryGe 8年前發布 | 15K 次閱讀 Android開發 移動開發 Android

本文出自cjj的開源項目:一個炫酷的SearchView搜索動畫庫

 

前言:周末強擼一個庫,差點灰飛煙滅.無妨,人生自古誰無死,來生繼續擼代碼.

立馬入主題,幾乎每個App都有搜索功能,然而形式千篇一律。我舉個例子吧,就微信來說:

blob.png

顯示一個搜索的圖標,點擊跳到另一個界面,輸入要搜索的東西

 

blob.png

現在大部分App都是用這種方式了。我是希望能有App把這個功能做得酷炫點,畢竟它也是用戶經常要用到的,給用戶良好的體驗還是很重要的。 為此,我實現了別人設計的一些SearchView酷炫效果,可能不是很精致,你就勉強看看吧。

此時,如果你看完表格那些動畫,喜歡上它時,想知道他們是怎么在代碼中實現的,沒問題,我這就手把手教你撩一個絢麗的SearchViewAnim , 呵呵,有點吹大了,說說我怎么實現的吧。

實現思路

我們先對第一行表格的設計圖進行仔細觀察 ,效果是SearchView是由一個圓圈和一條直線(尾巴)構成的,開啟動畫時,尾巴慢慢消失成一點,然后這一點(dot) 進入圓圈內時,泛起波紋,在圈內四處逗留,然后在圓圈中心點停留閃爍,短暫的思考了下人生,又沖出去乖乖做一條尾巴。

咳,這是一個頓悟生命的dot啊!

相信大家通過我形象的描述已經知道效果是怎樣了,現在就把剛剛描敘的畫出來吧。

實現繪制

(1) 自定義類SearchView繼承View

重寫onDraw(Canvas canvas)方法,利用畫筆Paint在畫布Canvas繪制一個普通的的視圖,如下:

blob.png

這里有兩種畫法:

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,完善它。

來源:陳繼軍

 本文由用戶 GloryGe 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!