Android自定義動畫酷炫的提交按鈕

今天開始記錄工作中遇到的需要實(shí)現(xiàn)的動畫效果實(shí)現(xiàn)自定義view動畫,后期會有一些列動畫設(shè)計(jì)思路的文章控妻。

在這里分享的是設(shè)計(jì)實(shí)現(xiàn)思路壶愤,僅供學(xué)習(xí)使用对雪,讓大家拿到稍微復(fù)雜點(diǎn)的動畫的時候要知道該如何去一步步分解實(shí)現(xiàn),而不是抱怨
下邊就先來看看設(shè)計(jì)需要的效果圖及我們最終實(shí)現(xiàn)的效果圖当犯,畢竟有圖有真相嘛垢村!

99.gif
其實(shí)我剛拿到設(shè)計(jì)圖的時候心想,MD直接給一張gif圖不就行了何必這個麻煩吶嚎卫,

隨后冷靜下來之后(其實(shí)就是抱怨之后)想想作為一名Android開發(fā)者總不能什么動畫都依賴設(shè)計(jì)師吧嘉栓,那樣的話會顯得我們開發(fā)者沒什么卵用啊,說不定還會被設(shè)計(jì)師鄙視哦拓诸,


設(shè)計(jì)師對你深深的鄙視

于是就開始了動畫分析及實(shí)現(xiàn)之旅侵佃。


通過這個gif動畫我們分析出動畫過程的實(shí)質(zhì):

一個長方形(或者是圓角長方形)逐漸過渡成為兩邊是半圓的長方形,于此同時長方形兩邊向中間靠攏最終形成一個圓奠支,然后圓上升一定高度馋辈,最后在圓里邊畫出對勾(?).整個動畫分解的其實(shí)就是這幾個部分,那么我們該如何實(shí)現(xiàn)吶倍谜,不要捉急迈螟,繼續(xù)往下看。

h

第一步:我們要先畫出一個圓角矩形吧

    /**
     * 繪制帶圓角的矩形
     *
     * @param canvas 畫布
     */
      private void draw_oval_to_circle(Canvas canvas) {
      
              //這里是對矩形的位置大小的設(shè)置
              rectf.left = two_circle_distance;
              rectf.top = 0;
              rectf.right = width - two_circle_distance;
              rectf.bottom = height;
      
              //畫圓角矩形
              canvas.drawRoundRect(rectf, circleAngle, circleAngle, paint);
      
          }
          
圓角矩形繪制完成之后就是改變圓角半徑的大小使其兩邊形成半圓的效果尔崔,那么怎么才能讓他成為半圓吶井联,來看看一張圖,若要繪制成半圓效果您旁,那么這個圓的直徑就是view自身的高度,那么這個圓的半徑就是height/2
image.png

    /**
     * 設(shè)置矩形過度圓角矩形的動畫
     */
    private void set_rect_to_angle_animation() {
        animator_rect_to_angle = ValueAnimator.ofInt(0, height / 2);
        animator_rect_to_angle.setDuration(duration);
        animator_rect_to_angle.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                circleAngle = (int) animation.getAnimatedValue();
                invalidate();
            }
        });
    }

添加動畫之后的效果如下

button_1.gif

第二步:當(dāng)矩形兩邊都是半圓之后就要處理使其向中間靠攏逐漸形成一個圓轴捎,那么問題又來了鹤盒,需要向中間移動多少吶蚕脏,并且怎么移動才能使兩邊都想中間聚攏吶

下邊來看一張圖分析一下
Paste_Image.png
有圖可知移動的距離是(width-height)/2,然后在寫一個動畫讓其改變距離最終兩個半圓靠攏在一起形成圓
    /**
     * 設(shè)置圓角矩形過度到圓的動畫
     * default_two_circle_distance = (w-h)/2
     */
    private void set_rect_to_circle_animation() {
        animator_rect_to_square = ValueAnimator.ofInt(0, default_two_circle_distance);
        animator_rect_to_square.setDuration(duration);
        animator_rect_to_square.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                two_circle_distance = (int) animation.getAnimatedValue();

                //在靠攏的過程中設(shè)置文字的透明度,使文字逐漸消失的效果
                int alpha = 255 - (two_circle_distance * 255) / default_two_circle_distance;

                textPaint.setAlpha(alpha);

                invalidate();
            }
        });
    }

完成上邊代碼后再來看下效果

button_2.gif

第三步:讓圓上移移動距離侦锯。這個移動很好實(shí)現(xiàn),直接改變Y軸方法的坐標(biāo)就行了驼鞭,這個很簡單就直接看代碼吧

    /**
     * 設(shè)置view上移的動畫
     */
    private void set_move_to_up_animation() {
        final float curTranslationY = this.getTranslationY();
        animator_move_to_up = ObjectAnimator.ofFloat(this, "translationY", curTranslationY, curTranslationY - move_distance);
        animator_move_to_up.setDuration(duration);
        animator_move_to_up.setInterpolator(new AccelerateDecelerateInterpolator());
    }
    

第四步:在圓中繪制一個對勾,而且是帶動畫的對勾尺碰,讓對勾以動畫的形式慢慢繪制出來

如果對相關(guān)API不熟悉的話不知道會怎么去實(shí)現(xiàn)吶挣棕,或許你會想通過繪制線的方式,在對勾起點(diǎn)開始不斷改變移動點(diǎn)的坐標(biāo)進(jìn)行繪制亲桥,那么怎么獲取這些點(diǎn)的坐標(biāo)吶洛心,這里我們使用Path和DashPathEffect兩個方法實(shí)現(xiàn),對DashPathEffect不了解的小伙伴可以去查一下文檔哦

DashPathEffect這個類的作用就是將Path的線段虛線化题篷。
構(gòu)造函數(shù)為DashPathEffect(float[] intervals, float offset)词身,其中intervals為虛線的ON和OFF數(shù)組,該數(shù)組的length必須大于等于2番枚,phase為繪制時的偏移量法严。

我們先拿到對勾的path路徑在對其改變偏移量加上DashPathEffect就能實(shí)現(xiàn)動態(tài)繪制對勾的效果了,那么怎么計(jì)算對勾的起點(diǎn)折點(diǎn)和終點(diǎn)的坐標(biāo)吶葫笼,在網(wǎng)上找了一個不錯的圖片深啤,如果你的設(shè)計(jì)師直接把位置給你標(biāo)明的很詳細(xì)的話你就省了這些自己計(jì)算的麻煩
對勾的繪制位置.jpg
  /**
    * 繪制對勾     
    * 下邊計(jì)算比例是參考網(wǎng)上一些例子加上自己一步一步嘗試的出來的比例,僅供參考
    * 如果條件允許最好還是讓設(shè)計(jì)師給你標(biāo)明一下比例哦路星!
    */
   private void initOk() {
       //對勾的路徑
       path.moveTo(default_two_circle_distance + height / 8 * 3, height / 2);
       path.lineTo(default_two_circle_distance + height / 2, height / 5 * 3);
       path.lineTo(default_two_circle_distance + height / 3 * 2, height / 5 * 2);

       pathMeasure = new PathMeasure(path, true);

   }


    /**
     * 繪制對勾的動畫
     */
    private void set_draw_ok_animation() {
        animator_draw_ok = ValueAnimator.ofFloat(1, 0);
        animator_draw_ok.setDuration(duration);
        animator_draw_ok.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                startDrawOk = true;
                float value = (Float) animation.getAnimatedValue();

                effect = new DashPathEffect(new float[]{pathMeasure.getLength(), pathMeasure.getLength()}, value * pathMeasure.getLength());
                okPaint.setPathEffect(effect);
                invalidate();
            }
        });
    }

再來看效果

繪制對勾.gif

至此動畫分解都已完成溯街,但是機(jī)智的你應(yīng)該已經(jīng)發(fā)現(xiàn)問題了,就是感覺動畫播放銜接的不是很好奥额,那么接下來我們就處理這個問題苫幢,回到最初的效果圖上,矩形變圓角和縮放成圓形是同時進(jìn)行的垫挨,那么我們有什么辦法可以實(shí)現(xiàn)動畫同時播放吶韩肝,哈哈,身為老司機(jī)的想必已經(jīng)知道了使用AnimatorSet九榔,他可以播放動畫集哀峻、順序播放等,那么我們就開始處理吧

我們讓矩形變圓角和矩形往中間縮放同時進(jìn)行哲泊,然后圓在上移剩蟀,最后繪制對勾

        animatorSet
                .play(animator_move_to_up)
                .before(animator_draw_ok)
                .after(animator_rect_to_square)
                .after(animator_rect_to_angle);

最終奉上我們自己一步一步完整實(shí)現(xiàn)的效果圖

button_animation.gif

至此我們可以理直氣壯地帶著作品找設(shè)計(jì)師互懟了


向設(shè)計(jì)師拋出詭異的手勢

總結(jié):看到這里是不是覺得這樣的動畫實(shí)現(xiàn)起來也不是很復(fù)雜嘛,也許你會覺得這樣的動畫沒什么技術(shù)含量切威,實(shí)現(xiàn)起來真的沒什么難度育特,何必再此大做文章吶,其實(shí)我這里也只是個拋磚引玉的作用,提供一種學(xué)習(xí)方法缰冤,也許今天我們遇到的只是一個簡單的動畫犬缨,可明天如果需要我們?nèi)プ龈鼜?fù)雜的動畫吶,我們該怎么處理棉浸,怎么分析怀薛,怎么實(shí)現(xiàn)吶。只要我們把自己的需求分析拆解迷郑,把復(fù)雜的步驟簡單化枝恋,分布實(shí)現(xiàn)在組合到一起就可以實(shí)現(xiàn)自己想要的效果(你要知道炫酷的電影特效也是一幀一幀動畫合成的哦)。

學(xué)無止境

源碼已經(jīng)上傳到github上了嗡害,需要參考學(xué)習(xí)的點(diǎn)擊傳送門

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末焚碌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子就漾,更是在濱河造成了極大的恐慌呐能,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抑堡,死亡現(xiàn)場離奇詭異摆出,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)首妖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門偎漫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人有缆,你說我怎么就攤上這事象踊。” “怎么了棚壁?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵杯矩,是天一觀的道長。 經(jīng)常有香客問我袖外,道長史隆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任曼验,我火速辦了婚禮泌射,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鬓照。我一直安慰自己熔酷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布豺裆。 她就那樣靜靜地躺著拒秘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上翼抠,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天咙轩,我揣著相機(jī)與錄音,去河邊找鬼阴颖。 笑死,一個胖子當(dāng)著我的面吹牛丐膝,可吹牛的內(nèi)容都是我干的量愧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼帅矗,長吁一口氣:“原來是場噩夢啊……” “哼偎肃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起浑此,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤累颂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后凛俱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體紊馏,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年蒲犬,在試婚紗的時候發(fā)現(xiàn)自己被綠了朱监。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡原叮,死狀恐怖赫编,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奋隶,我是刑警寧澤汪榔,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站待秃,受9級特大地震影響遗遵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜黍聂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一躺苦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧产还,春花似錦匹厘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春炕柔,著一層夾襖步出監(jiān)牢的瞬間酌泰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工匕累, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留陵刹,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓欢嘿,卻偏偏與公主長得像衰琐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子炼蹦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,522評論 25 707
  • 在iOS中隨處都可以看到絢麗的動畫效果羡宙,實(shí)現(xiàn)這些動畫的過程并不復(fù)雜,今天將帶大家一窺ios動畫全貌掐隐。在這里你可以看...
    每天刷兩次牙閱讀 8,465評論 6 30
  • 在iOS中隨處都可以看到絢麗的動畫效果狗热,實(shí)現(xiàn)這些動畫的過程并不復(fù)雜,今天將帶大家一窺iOS動畫全貌虑省。在這里你可以看...
    F麥子閱讀 5,096評論 5 13
  • 前言 最近項(xiàng)目中新增了一個搶購模塊匿刮,需要一個進(jìn)度指示條,UI設(shè)計(jì)了幾款出來后慷妙,PM一看僻焚,不行,太low了膝擂,沒有逼...
    luckyzh閱讀 8,143評論 16 55
  • 從確定來英國求學(xué)到踏上這片國土虑啤,真的經(jīng)歷了幾個月的忐忑,太多的“前車之鑒”讓我擔(dān)憂著不同的種族架馋、不同的文化到底能帶...
    張玲Linda閱讀 336評論 0 0