Android實(shí)現(xiàn)美團(tuán)外賣底部導(dǎo)航欄動(dòng)畫(huà)
體驗(yàn)了一下美團(tuán)外賣的底部導(dǎo)航欄,感覺(jué)動(dòng)畫(huà)很流暢,分割線被頂起,還有圖標(biāo)的動(dòng)畫(huà),可能用的lottie,覺(jué)得分割線被頂起可以自己寫(xiě)動(dòng)畫(huà),所以試著寫(xiě)了一下 。
想自定義view點(diǎn)擊實(shí)現(xiàn)動(dòng)畫(huà)效果,自定義view的區(qū)域一定比背景需要被頂起的線要高,所以布局如下:
開(kāi)始繪制view,被頂起的曲線分三段,前后兩端曲線對(duì)稱的,用path繪制曲線,中間段繪制貝塞爾曲線。
那么我們分別繪制三段曲線,用ValueAnimator實(shí)現(xiàn)效果,
private void initAnim() { value = startValue; animator = ValueAnimator.ofInt(startValue, halfValue, endValue); // animator.setInterpolator(new DecelerateInterpolator()); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { value = (int) valueAnimator.getAnimatedValue(); invalidate(); } }); animator.setDuration(ANIM_TIME); animator.start(); }
動(dòng)畫(huà)執(zhí)行過(guò)程中有個(gè)回彈,那么value的變化需要一個(gè)中間值,
startValue = 0; halfValue = -DensityUtils.dp2px(context, 35); endValue = -DensityUtils.dp2px(context, 25);
在onDraw中繪制曲線代碼如下,
rectF = new RectF((((float)width - (float)contentSize) / 2), lineToTop + value, (float) width - ((float)width - (float)contentSize) / 2, height + value); if (value < 0 ) { Path path = new Path(); //繪制第一段圓弧 path.moveTo(rectF.left - 20, lineToTop); float firstCubicHight = ((float) lineToTop - rectF.top) / 4; float end = (float) lineToTop - firstCubicHight; path.cubicTo( rectF.left - 10, (float) lineToTop - firstCubicHight / 16, rectF.left, (float) lineToTop - firstCubicHight / 12, rectF.left + 10, end ); //繪制第二段圓弧 path.quadTo( rectF.left + contentSize / 2, rectF.top * 0.9f, rectF.right - 10, end ); //繪制第三段圓弧,和第一段對(duì)稱 path.cubicTo( rectF.right, (float) lineToTop - firstCubicHight / 12, rectF.right + 10, (float) lineToTop - firstCubicHight / 16, rectF.right + 20, lineToTop ); Path pathBg = new Path(); pathBg.addPath(path); pathBg.lineTo(rectF.right + 20, height); pathBg.lineTo(rectF.left - 20, height); pathBg.lineTo(rectF.left - 20, lineToTop); canvas.drawPath(pathBg, paintBg);//繪制白色背景 canvas.drawPath(path, paintBgStroke);//繪制曲線 }
最后在onDraw()中畫(huà)上圖片也用屬性動(dòng)畫(huà)移動(dòng)就成功啦。
因?yàn)橛星€銜接貝塞爾曲線,感覺(jué)弧度有時(shí)候改變曲線不是很流暢,大家應(yīng)該會(huì)有更好的辦法 歡迎補(bǔ)充!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android實(shí)現(xiàn)動(dòng)畫(huà)效果的自定義下拉菜單功能
- Android自定義view仿QQ的Tab按鈕動(dòng)畫(huà)效果(示例代碼)
- Android自定義view之圍棋動(dòng)畫(huà)效果的實(shí)現(xiàn)
- Android動(dòng)畫(huà)系列之屬性動(dòng)畫(huà)的基本使用教程
- android實(shí)現(xiàn)加載動(dòng)畫(huà)對(duì)話框
- Android動(dòng)畫(huà)系列之幀動(dòng)畫(huà)和補(bǔ)間動(dòng)畫(huà)的示例代碼
- Android實(shí)現(xiàn)長(zhǎng)按圓環(huán)動(dòng)畫(huà)View效果的思路代碼
- android自定義環(huán)形統(tǒng)計(jì)圖動(dòng)畫(huà)
- android實(shí)現(xiàn)截圖并動(dòng)畫(huà)消失效果的思路詳解
- Android 自定義加載動(dòng)畫(huà)Dialog彈窗效果的示例代碼
- Android自定義帶動(dòng)畫(huà)效果的圓形ProgressBar
- Android 使用cos和sin繪制復(fù)合曲線動(dòng)畫(huà)
相關(guān)文章
Android應(yīng)用開(kāi)發(fā):電話監(jiān)聽(tīng)和錄音代碼示例
這篇文章主要介紹了Android應(yīng)用開(kāi)發(fā)中電話監(jiān)聽(tīng)和電話錄音的代碼實(shí)例,同時(shí)附錄了一個(gè)拍照、錄像的例子,需要的朋友可以參考下2014-04-04Android Studio error: Unable to start the daemon process的解決方
這篇文章主要介紹了在 Android Studio 上新建項(xiàng)目,出現(xiàn) Unable to start the daemon process問(wèn)題的幾種的解決方法,需要的朋友可以參考下2020-10-10android popwindow實(shí)現(xiàn)左側(cè)彈出菜單層及PopupWindow主要方法介紹
PopupWindow可以實(shí)現(xiàn)浮層效果,主要方法有:可以自定義view,通過(guò)LayoutInflator方法;可以出現(xiàn)和退出時(shí)顯示動(dòng)畫(huà);可以指定顯示位置等感興趣的朋友可以了解下哦,希望本文對(duì)你學(xué)習(xí)android菜單相關(guān)開(kāi)發(fā)有所幫助2013-01-01Android SQLite數(shù)據(jù)庫(kù)的增 刪 查找操作
這篇文章主要介紹了Android SQLite數(shù)據(jù)庫(kù)的增 刪 查找操作,需要的朋友可以參考下2017-02-02Android webview和js互相調(diào)用實(shí)現(xiàn)方法
這篇文章主要介紹了 Android webview和js互相調(diào)用實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下2016-10-10Recyclerview添加頭布局和尾布局、item點(diǎn)擊事件詳解
這篇文章主要為大家詳細(xì)介紹了Recyclerview添加頭布局和尾布局、item點(diǎn)擊事件的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08