Android自定義加載動畫-搜索等待

Android自定義動畫系列十,先介紹下第九個Loading動畫(TextBuilder),只是個簡單的文字動畫,不做仔細介紹了,效果如下:

系列九動畫

上一篇介紹了Android自定義加載動畫庫zLoading的使用方式,歡迎戳入!

重點:今天來分享第十個自定義Loading動畫(SearchPathBuilder),可用與對數據庫的查詢,或者對網絡數據的獲取搜索等操作的等待頁面,效果如下。

效果圖

系列十動畫

正文

這個動畫是運用Path和PathMeasure 來完成的,顧名思義,PathMeasure是一個用來測量Path的類,主要方法如下:

構造方法

方法名 釋義
PathMeasure() 創建一個空的PathMeasure
PathMeasure(Path path, boolean forceClosed) 創建 PathMeasure 并關聯一個指定的Path(Path需要已經創建完成)。

公共方法

返回值 方法名 釋義
void setPath(Path path, boolean forceClosed) 關聯一個Path
boolean isClosed() 是否閉合
float getLength() 獲取Path的長度
boolean nextContour() 跳轉到下一個輪廓
boolean getSegment(float startD, float stopD, Path dst, boolean startWithMoveTo) 截取片段
boolean getPosTan(float distance, float[] pos, float[] tan) 獲取指定長度的位置坐標及該點切線值
boolean getMatrix(float distance, Matrix matrix, int flags) 獲取指定長度的位置坐標及該點Matrix

這里有三點需要注意的地方:

  1. 不論forceClosed 設置為何種狀態(true 或者 false), 都不會影響原有 Path 的狀態,即 PathPathMeasure 關聯之后,之前的的 Path 不會有任何改變。
  2. forceClosed 的設置狀態可能會影響測量結果,如果 Path 未閉合但在與 PathMeasure 關聯的時候設置 forceClosed 為 true 時,測量結果可能會比 Path 實際長度稍長一點,獲取到到是該 Path 閉合時的狀態。
  3. 在使用 getSegment 時,更改 mDrawPath 的內容后可能繪制會出現問題,為了兼容性給 mDrawPath 添加一個單個操作,例如: mDrawPath.lineTo(0, 0);

簡單的方法介紹到這里,注釋在代碼里,下面看下代碼:

    //初始化畫筆
    private void initPaint()
    {
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(15);
        mPaint.setColor(Color.BLACK);
        mPaint.setDither(true);
        mPaint.setFilterBitmap(true);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
    }

    //初始化
    private void initPathMeasure()
    {
        mDrawPath = new Path();//最終繪制的路徑
        mPathMeasure = new PathMeasure();
    }

    //初始化路徑
    private void initPaths()
    {
        float r = mR * 0.4f;//內圓半徑

        mPath = new Path();//外圓路徑
        mPath.addArc(new RectF(getViewCenterX() - mR, getViewCenterY() - mR, getViewCenterX() + mR, getViewCenterY() + mR), 45, 359.9f);
        mPathMeasure.setPath(mPath, false);
        float[] pos = new float[2];
        mPathMeasure.getPosTan(0, pos, null);

        mPathZoom = new Path();//內部放大鏡路徑
        mPathZoom.addArc(new RectF(getViewCenterX() - r, getViewCenterY() - r, getViewCenterX() + r, getViewCenterY() + r), 45, 359.9f);
        mPathZoom.lineTo(pos[0], pos[1]);
    }

    @Override
    protected void onDraw(Canvas canvas)
    {
        canvas.drawPath(mDrawPath, mPaint);
    }

    @Override
    protected void computeUpdateValue(ValueAnimator animation, @FloatRange(from = 0.0, to = 1.0) float animatedValue)
    {
        switch (mCurrAnimatorState)//狀態切換
        {
            case 0:
            case 1://第一階段
                resetDrawPath();//重置
                mPathMeasure.setPath(mPath, false);//綁定路徑
                float stop = mPathMeasure.getLength() * animatedValue;
                float start = (float) (stop - ((0.5 - Math.abs(animatedValue - 0.5)) * 200f));
                mPathMeasure.getSegment(start, stop, mDrawPath, true);//截取片段
                break;
            case 2://第二階段
                resetDrawPath();//重置
                mPathMeasure.setPath(mPath, false);
                stop = mPathMeasure.getLength() * animatedValue;
                start = 0;
                mPathMeasure.getSegment(start, stop, mDrawPath, true);
                break;
            case 3://第三階段
                mPathMeasure.setPath(mPathZoom, false);
                stop = mPathMeasure.getLength();
                start = stop * (1 - animatedValue);
                mPathMeasure.getSegment(start, stop, mDrawPath, true);
                break;
            default:
                break;
        }
    }

    @Override
    public void onAnimationRepeat(Animator animation)
    {
        if (++mCurrAnimatorState > FINAL_STATE)
        {//還原到第一階段
            mCurrAnimatorState = 0;
        }
    }

    //這里是復用重置,并且修復一個無法繪制的問題
    private void resetDrawPath()
    {
        mDrawPath.reset();
        mDrawPath.lineTo(0, 0);//不知道什么坑
    }

這里解釋下getSegment,方法如下:

 boolean getSegment (float startD, float stopD, Path dst, boolean startWithMoveTo)
參數 作用 備注
返回值(boolean) 判斷截取是否成功 true 表示截取成功,結果存入dst中,false 截取失敗,不會改變dst中內容
startD 開始截取位置距離 Path 起點的長度 取值范圍: 0 <= startD < stopD <= Path總長度
stopD 結束截取位置距離 Path 起點的長度 取值范圍: 0 <= startD < stopD <= Path總長度
dst 截取的 Path 將會添加到 dst 中 注意: 是添加,而不是替換
startWithMoveTo 起始點是否使用 moveTo 用于保證截取的 Path 第一個點位置不變

ZLoading庫的使用方式

ZLoading庫: Android自定義加載動畫庫zLoading

總結

小伙伴們,要是想看更多細節,可以前往文章最下面的Github鏈接,如果大家覺得ok的話,希望能給個喜歡,最渴望的是在Github上給個star。謝謝了。

如果大家有什么更好的方案,或者想要實現的加載效果,可以給我留言或者私信我,我會想辦法實現出來給大家。謝謝支持。

Github:zyao89/ZCustomView

作者:Zyao89;轉載請保留此行,謝謝;

個人博客:https://zyao89.cn

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,156評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,401評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,069評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,873評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,635評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,128評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,203評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,365評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,881評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,733評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,935評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,475評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,172評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,582評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,821評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,595評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,908評論 2 372

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,618評論 25 708
  • afinalAfinal是一個android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,465評論 2 45
  • 《愛不愛》 沒有問我還愛不愛你 或許是有的 比如說“我” 我時常想還愛不愛你 我想或許是愛的 又大概是不愛的 可是...
    野衣姑娘閱讀 346評論 2 4
  • 親愛的姑娘們,你們有沒有想過,有一天,你可以擁有屬于自己的可愛的寶寶,但卻不用經歷懷胎十月的辛苦和生產的痛苦?你可...
    奧斯特窩頭斯基閱讀 1,199評論 4 10
  • 誰是誰生命中的誰, 最美的遇見,才是最強悍的對手, 把最重要的留藏在心,把最不經意的回眸當成一個信仰, 從此,心有...
    夏天lzz閱讀 331評論 0 3