Android果凍效果(阻尼動畫)

2021-07-09 01:53:59 字數 3199 閱讀 3964

之前發了乙個drawable實現動畫效果的帖子,有人找我要過相應圓弧繪製演算法,仔細想想那個專案中有些地方還是值得分享出來的,趁現在專案不忙,就準備分享出來。

只有一些演算法的東西,**不涉及具體業務

效果如下(即activity-a 進入 到activity-b時會出現的動畫效果如上):

主要由兩個動畫組成,背景動畫和按鈕動畫

背景動畫

按鈕動畫

1.translateanimation的使用?

2.canvas 繪製圓弧?

/**

**@param canvas 繪製橢圓

*/private

void

drawoval(canvas canvas)

3.canvas 疊加模式?4.bitmapshader的使用?

shader是著色器,bitmapshader是bitmap著色器,可以將乙個bitmap物件繪製到畫布上.

5.阻尼振動函式如何實現?

阻尼振動曲線如下圖

其實分析曲線後就能發現 其實就是指數函式(無限趨近於0)和 余弦曲線的結合而已。

因為主要是背景動畫和按鈕動畫,所以也拆成兩部分

背景動畫的實現

動畫過程分析

位移動畫可以不表,因為很簡單,以一種速率 最多加乙個速度疊加器即可

橢圓可以看到先是移出時橢圓向下最大,然後慢慢縮小,最後在位移到 整體 1/2處橢圓為0,然後又向螢幕上方鼓出,慢慢增大,到 位移到最大位置時橢圓最大

到最大位移位置後,圓弧以阻尼振動慢慢縮小,及至橢圓為0

動畫過程實現

1. 建立位移動畫

同時建立出 0f - 1.0f 的時間插值

/**

**@return 得到上移動畫

*/private animationset getanimationset()

};animationset.addanimation(translateanimation);

return animationset;

}

2. 建立繪製弧線向下的弧線可以理解為一塊正方形和橢圓重疊,當繪製上/下半橢圓以及正確的混合模式即可得到乙個正確的圓弧

// 混合模式為

當時間插值 為 0f - 0.5f的時候,控制橢圓所在矩形高度由大減小到0,同時繪製橢圓下半部當時間插值為 0.5f - 1.0f的時候,控制橢圓所在矩形高度由0增大到最大,同時繪製橢圓上半部

當到1.0f時,根據阻尼振動函式 計算出遞增插值下 包含橢圓 矩形的高度繪製半部橢圓即可

/**

* 設定時間插值,並根據插值計算橢圓所在矩形高度,從而得到不同的橢圓弧度

*@param value

*/public

void

setpercent(float value) else

}invalidateself();

}

/**

* // 當到1.0f時,開始繪製阻尼振動畫

*/private

void

startbackanimation()

/**

* todo: 15/12/8 要修改為弱引用

*/private handler handler = new handler() else }};

/**

* 根據cursor插值,計算 阻尼 y實時座標

*@param x

*@return 阻尼振動函式

*/private

double

getbouncey(long x)

// 增益函式和余弦曲線合併,就是阻尼函式曲線

return bouncerate * math.cos(0.3 * x);

}

到這裡,繪製背景動畫關鍵**已經完畢

按鈕動畫的實現

動畫過程分析

可以看到是一張舊上,新的逐漸擴大,發現其實是兩個動畫的集合 ,乙個是新的不停變大(保持圓形),第二個是新的圓心座標有變化

更深一步分析是新在 時間插值 0f-1f,半徑從0-最大,圓心從 3/4處,變為最後1/2處

動畫過程實現

時間插值可以用之前建立出來的

如果你已經看過了並指導 bitmapshader是幹什麼的那麼應該已經有了思路了吧?

/**

* 構造引數

**@param bitmap 新的

*@param oldbitmap 舊

*/public

ripplebuttondrawable(bitmap bitmap, bitmap oldbitmap)

@override

public

void

draw(canvas canvas)

就這樣就好了,是不是很簡單???

有更多的問題可以聯絡我

ListView阻尼效果

效果圖省略。activity main.xml 僅僅有乙個自己定義listview mainactivity arraylistadapter 為了簡化 package com.example.dampingdemo import android.os.bundle import android.w...

android動畫效果

這兩天接觸到一些android特效,例如抖動,平移,轉動等等。標籤可以定義一些動畫效果,可以寫乙個anim的xml來定義動畫的屬性。以下是一些常見的android動畫屬性 平移動畫 duration 持續時間 fromxdelta 屬性為動畫起始時 x座標上的位置 toxdelta 屬性為動畫結束時...

android 動畫效果

animations 一 animations 介紹animations 是乙個實現 android ui 介面動畫效果的 api,animations 提供了一系列的動畫效果,可以進行旋轉 縮放 淡入淡出等,這些效果可以應用在絕大多數的控制項中。二 animations 的分類animations...