手把手教你繪制Android粘性果凍動(dòng)畫組件

? ? ? ? 從事移動(dòng)互聯(lián)網(wǎng)開發(fā)已經(jīng)快兩年了,回想當(dāng)初是Android帶我走進(jìn)了移動(dòng)端的世界杨凑,后來由于自身對(duì)用戶體驗(yàn)比較感興趣敷扫,發(fā)現(xiàn)iOS更注重對(duì)圖形渲染以及動(dòng)畫處理,所以轉(zhuǎn)身自學(xué)iOS開發(fā)赚抡,之后也發(fā)布了幾個(gè)iOS的組件庫爬坑。但是Android進(jìn)兩年發(fā)展趨勢猛增,在動(dòng)畫處理上也比以前有所改進(jìn)涂臣,Android3.0之后開啟了GPU硬件加速讓圖形渲染沒以前那么卡頓盾计,特別是5.0之后的material design更是引領(lǐng)潮流售担。所以趁最近工作不忙有時(shí)間,寫了個(gè)彈性動(dòng)畫的ActionMenu署辉,核心原理來自咱們iOS界有動(dòng)畫小王子之稱的kittenyang的這篇博客(特此鳴謝)族铆,廢話不多說了,先上效果圖(gif存在失真哭尝,實(shí)際效果更佳流暢Q彈)

SpringActionMenu效果圖

1.核心原理

? ? ? ? 主要知識(shí)點(diǎn)其實(shí)就下面三項(xiàng)

? ? ? ? * Android自定義View以及ViewGroup

? ? ? ? * 利用三階貝塞爾曲線繪制圖形

? ? ? ? * 通過ValueAnimator結(jié)合阻尼振動(dòng)自定義屬性變化

2.各項(xiàng)講解

(1)Android自定義View以及ViewGroup

? ? ? ? 首先我們先做出一個(gè)圓形的彈性動(dòng)畫效果哥攘,先得自定義一個(gè)view,然后重寫onDraw可以用過path和paint任意繪制圖形材鹦,具體細(xì)節(jié)我就不多說了逝淹,不了解的同學(xué)可以查閱相關(guān)資料學(xué)習(xí)。

(2)利用三階貝塞爾曲線繪制圖形

? ? ? ? 貝塞爾曲線是我認(rèn)為一個(gè)比較神奇的東西桶唐,因?yàn)樗旧峡梢岳L制出任何圖形栅葡,有興趣的同學(xué)可以到這個(gè)網(wǎng)站玩一下,那么我們今天需要做的就是用三階貝塞爾曲線畫圓

三階貝塞爾曲線畫圓

圖中以A,B,C,D四個(gè)點(diǎn)作為基準(zhǔn)點(diǎn)尤泽,把一個(gè)圓分4次繪制欣簇,以c1-c8作為四次繪制中三階貝塞爾曲線的輔助點(diǎn),各點(diǎn)的位置我們?cè)O(shè)為offSet坯约,由前輩們計(jì)算熊咽,當(dāng)offSet為(圓形直徑/3.6)時(shí)剛好是一個(gè)整圓,后來找到一篇文章介紹了其原理(雖然我看完之后還是一臉懵逼)闹丐。我們?cè)O(shè)置形變系數(shù)為factor(0~1)横殴,設(shè)定圓形拉伸的最大程度為圓形的2/5, 則extra= circleRadius*2*factor/5卿拴,分別列出各點(diǎn)坐標(biāo)

intxA =0,xB =0,xC =0,xD =0,yA =0,yB =0,yC =0,yD =0;

xA =circleRadius;

xB =circleRadius*2+extra;

xC =circleRadius;

xD =0;

yA =extra;

yB =circleRadius;

yC =circleRadius*2-extra;

yD =circleRadius;

offSet=circleRadius*2/3.6f;

mPath.moveTo(xA,yA);

mPath.cubicTo(xA +offSet,yA,xB,yB? -offSet,xB,yB);

mPath.cubicTo(xB,yB +offSet,xC +offSet,yC,xC,yC);

mPath.cubicTo(xC -offSet,yC,xD,yD? +offSet,xD,yD);

mPath.cubicTo(xD,yD -offSet,xA -offSet,yA,xA,yA);

OK滥玷!基本點(diǎn)都繪制完了,直接Run起來


繪制圓形

看到一個(gè)紅通通的圓形繪制成功之后第一部大功告成巍棱!

(3)通過ValueAnimator結(jié)合阻尼振動(dòng)自定義屬性變化

? ? ? ? 上面我們已經(jīng)繪制好了一個(gè)圓形惑畴,接下來事情就很簡單了,只需要通過改變形變系數(shù)factor(0~1)的值來改變形變程度就可以了航徙,下面介紹一個(gè)Android的動(dòng)畫API—ValueAnimator如贷,直接通過組件屬性定義的動(dòng)畫效果,然后重寫變化機(jī)制

ValueAnimator valueAnimator = ValueAnimator.ofObject(new FloatEvaluator(time,1,0),1,0);

valueAnimator.addUpdateListener(this);

valueAnimator.setDuration(time);

valueAnimator.start();

@Override

public voidonAnimationUpdate(ValueAnimator animation) {

? ? ? factor= (float)animation.getAnimatedValue();

? ? ? invalidate();

}

由此原理就是通過屬性動(dòng)畫不斷的改變factor從1到0到踏,然后刷新重繪小圓球杠袱,F(xiàn)loatEvaluator就是我們自定義的根據(jù)什么樣的函數(shù)去改變factor,這個(gè)時(shí)候就要介紹到我們高中學(xué)習(xí)的阻尼振動(dòng)函數(shù)了

阻尼振動(dòng)


阻尼振動(dòng)

該函數(shù)可以模擬最真實(shí)的彈性效果

阻尼振動(dòng)函數(shù)

我們60幀為基準(zhǔn)(肉眼看到刷新流暢度的最低標(biāo)準(zhǔn))窝稿,計(jì)算出一列變化factor的值

publicFloatEvaluator(longtime, floatstartValue, floatendValue) {

? ? ? ? sum= (int)time *60/1000;

? ? ? ? float diff = endValue - startValue;

? ? ? ? value=new float[sum];

? ? ? ? float x;

? ? ? ? for(int i = 0; i < sum; i++) {

? ? ? ? x = i *1.0f/sum;

? ? ? ? value[i] = endValue - (float)(diff * Math.pow(Math.E,-1*dampingFactor* x) * Math.cos(velocityFactor* x));

? ? ? ? }

}

其中dampingFactor和velocityFactor為阻力和速度楣富,我這里設(shè)置的是5和30,可以自定義調(diào)節(jié)改變彈性程度伴榔。

基本構(gòu)建完成纹蝴,添加一個(gè)按鈕啟動(dòng)動(dòng)畫試試效果


彈性動(dòng)畫效果圖

大功告成庄萎!

3.總結(jié)

? ? ? ? 大家掌握了一個(gè)圓形組件的形變?cè)碇笫O碌木腿菀锥嗔耍肰iewGroup多繪制幾個(gè)擺擺位置就OK了塘安,也可以利用這種原理自己創(chuàng)新構(gòu)思出別的控件糠涛,只要掌握了核心的兩點(diǎn):

? ? ? ? 1.貝塞爾曲線繪制圖形

? ? ? ? 2.利用阻尼函數(shù)以及ValueAnimator自定義形變屬性的值

? ? ? ? 最后貼上源碼地址,有興趣的同學(xué)歡迎star兼犯,共同學(xué)習(xí)探討動(dòng)畫知識(shí)忍捡!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市切黔,隨后出現(xiàn)的幾起案子砸脊,更是在濱河造成了極大的恐慌,老刑警劉巖纬霞,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脓规,死亡現(xiàn)場離奇詭異,居然都是意外死亡险领,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門秒紧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绢陌,“玉大人,你說我怎么就攤上這事熔恢∑晖澹” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵叙淌,是天一觀的道長秤掌。 經(jīng)常有香客問我,道長鹰霍,這世上最難降的妖魔是什么闻鉴? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮茂洒,結(jié)果婚禮上孟岛,老公的妹妹穿的比我還像新娘。我一直安慰自己督勺,他們只是感情好渠羞,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著智哀,像睡著了一般次询。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瓷叫,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天屯吊,我揣著相機(jī)與錄音送巡,去河邊找鬼。 笑死雌芽,一個(gè)胖子當(dāng)著我的面吹牛授艰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播世落,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼淮腾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了屉佳?” 一聲冷哼從身側(cè)響起谷朝,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎武花,沒想到半個(gè)月后圆凰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡体箕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年专钉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片累铅。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡跃须,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出娃兽,到底是詐尸還是另有隱情菇民,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布投储,位于F島的核電站第练,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏玛荞。R本人自食惡果不足惜娇掏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望勋眯。 院中可真熱鬧驹碍,春花似錦、人聲如沸凡恍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嚼酝。三九已至浮还,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間闽巩,已是汗流浹背钧舌。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來泰國打工担汤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人洼冻。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓崭歧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親撞牢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子率碾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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

  • 1 背景 不能只分析源碼呀,分析的同時(shí)也要整理歸納基礎(chǔ)知識(shí)屋彪,剛好有人微博私信讓全面說說Android的動(dòng)畫所宰,所以今...
    未聞椛洺閱讀 2,697評(píng)論 0 10
  • 作為備用知識(shí),memo 學(xué)過矩陣?yán)碚摶蛘呔€性代數(shù)的肯定知道正交矩陣(orthogonal matrix)是一個(gè)非常...
    HappyPieBinLiu閱讀 5,772評(píng)論 0 5
  • 轉(zhuǎn)載一篇高質(zhì)量博文畜挥,原地址請(qǐng)戳這里轉(zhuǎn)載下來方便今后查看仔粥。1 背景不能只分析源碼呀,分析的同時(shí)也要整理歸納基礎(chǔ)知識(shí)蟹但,...
    Elder閱讀 1,938評(píng)論 0 24
  • 在微博上搜“和陌生人打電話” 出現(xiàn)的的是“和陌生人打電話說什么” “和陌生人打電話太可怕了!”…… 但是小年青我呢...
    杏杏醬閱讀 1,617評(píng)論 1 1
  • 1缅阳、虛擬機(jī)在選擇開啟此虛擬機(jī)彈出內(nèi)部錯(cuò)誤。答:在虛擬機(jī)圖標(biāo)上景描,右鍵選擇以管理員身份運(yùn)行十办,就可以解決了。 2超棺、Win...
    笑笑學(xué)生閱讀 546評(píng)論 0 0