這篇文章主要介紹了Android如何實現美團外賣底部導航欄動畫,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
體驗了一下美團外賣的底部導航欄,感覺動畫很流暢,分割線被頂起,還有圖標的動畫,可能用的lottie,覺得分割線被頂起可以自己寫動畫,所以試著寫了一下 。
想自定義view點擊實現動畫效果,自定義view的區域一定比背景需要被頂起的線要高,所以布局如下:
開始繪制view,被頂起的曲線分三段,前后兩端曲線對稱的,用path繪制曲線,中間段繪制貝塞爾曲線。
那么我們分別繪制三段曲線,用ValueAnimator實現效果,
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(); }
動畫執行過程中有個回彈,那么value的變化需要一個中間值,
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()中畫上圖片也用屬性動畫移動就成功啦。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Android如何實現美團外賣底部導航欄動畫”這篇文章對大家有幫助,同時也希望大家多多支持創新互聯網站建設公司,,關注創新互聯行業資訊頻道,更多相關知識等著你來學習!