Android實(shí)現(xiàn)美團(tuán)外賣底部導(dǎo)航欄動畫
體驗(yàn)了一下美團(tuán)外賣的底部導(dǎo)航欄,感覺動畫很流暢,分割線被頂起,還有圖標(biāo)的動畫,可能用的lottie,覺得分割線被頂起可以自己寫動畫,所以試著寫了一下 。
想自定義view點(diǎn)擊實(shí)現(xiàn)動畫效果,自定義view的區(qū)域一定比背景需要被頂起的線要高,所以布局如下:
開始繪制view,被頂起的曲線分三段,前后兩端曲線對稱的,用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(); }
動畫執(zhí)行過程中有個(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 ); //繪制第三段圓弧,和第一段對稱 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()中畫上圖片也用屬性動畫移動就成功啦。
因?yàn)橛星€銜接貝塞爾曲線,感覺弧度有時(shí)候改變曲線不是很流暢,大家應(yīng)該會有更好的辦法 歡迎補(bǔ)充!
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android實(shí)現(xiàn)動畫效果的自定義下拉菜單功能
- Android自定義view仿QQ的Tab按鈕動畫效果(示例代碼)
- Android自定義view之圍棋動畫效果的實(shí)現(xiàn)
- Android動畫系列之屬性動畫的基本使用教程
- android實(shí)現(xiàn)加載動畫對話框
- Android動畫系列之幀動畫和補(bǔ)間動畫的示例代碼
- Android實(shí)現(xiàn)長按圓環(huán)動畫View效果的思路代碼
- android自定義環(huán)形統(tǒng)計(jì)圖動畫
- android實(shí)現(xiàn)截圖并動畫消失效果的思路詳解
- Android 自定義加載動畫Dialog彈窗效果的示例代碼
- Android自定義帶動畫效果的圓形ProgressBar
- Android 使用cos和sin繪制復(fù)合曲線動畫
相關(guān)文章
Android應(yīng)用開發(fā):電話監(jiān)聽和錄音代碼示例
這篇文章主要介紹了Android應(yīng)用開發(fā)中電話監(jiān)聽和電話錄音的代碼實(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問題的幾種的解決方法,需要的朋友可以參考下2020-10-10android popwindow實(shí)現(xiàn)左側(cè)彈出菜單層及PopupWindow主要方法介紹
PopupWindow可以實(shí)現(xiàn)浮層效果,主要方法有:可以自定義view,通過LayoutInflator方法;可以出現(xiàn)和退出時(shí)顯示動畫;可以指定顯示位置等感興趣的朋友可以了解下哦,希望本文對你學(xué)習(xí)android菜單相關(guān)開發(fā)有所幫助2013-01-01Android SQLite數(shù)據(jù)庫的增 刪 查找操作
這篇文章主要介紹了Android SQLite數(shù)據(jù)庫的增 刪 查找操作,需要的朋友可以參考下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