實現蝴蝶翩翩飛舞的效果
近期在做一個功能開發的時候,須要實現蝴蝶飛舞的效果。先看看效果圖吧!
先問一個問題:要實現上面的蝴蝶紛飛的效果至少須要幾個蝴蝶的圖像? 答案是:4。不同顏色種類的蝴蝶須要一張就足夠。
要實現這個效果僅僅須要一行關鍵代碼:
canvas.drawBitmap(img_to_draw, view_player_matrix, mPaint);
這裏我們之關註這個參數:view_player_matrix。這是一個Matrix,通過設置這個Matrix,就能讓蝴蝶有位移,大小。拍動翅膀的效果變化!當中通過mPaint來配置蝴蝶的透明度能夠達到蝴蝶慢慢消失的效果!
位移能夠通過Matrix的setTranslate()來設置;大小能夠用postScale()來配置。那麽拍動翅膀呢?這就是我要說的重點。
要實現如上面效果圖的拍動翅膀。你須要細致觀察上面的蝴蝶!
事實上拍動翅膀的時候,從上往下看蝴蝶是不是變窄了。就像是被壓縮了。這就是我實現的辦法!
首先記住蝴蝶飛的方向!
用一個方向向量來表示,通過變化這個方向量來達到改變蝴蝶的飛行的方向!
最重要的是要計算出蝴蝶旋轉的角度。以下給出通過方向向量來計算其角度的方法:
private static int get_vector_Radian (float vector_x, float vector_y){ float lenth = (float) lineDis(0, 0, vector_x, vector_y); int degree = 0; if(vector_x > 0 && vector_y >= 0) { degree = (int) (Math.asin(vector_y/lenth) * (TO_DEGREES)); } else if(vector_x <= 0 && vector_y > 0) { degree = (int) (Math.asin(vector_y/lenth) * (TO_DEGREES)); degree = 180 - degree; } else if(vector_x < 0 && vector_y <= 0) { degree = (int) (Math.asin((-vector_y)/lenth) * (TO_DEGREES)); degree += 180; } else { degree = (int) (Math.asin((-vector_y)/lenth) * (TO_DEGREES)); degree = 360 - degree; } return degree; }
代碼裏面的TO_DEGREES定義例如以下:
private static final float TO_DEGREES = ((180/(float)Math.PI));
這樣在Matrix的配置時候通過postScale()這種方法去改變蝴蝶寬度。也就是改變蝴蝶圖片y的大小,這樣就實現了。例如以下是關鍵代碼:
view_player_matrix.postScale(temp_parameters_float, temp_parameters_float+curr_player.img_player_scal_incre_y, curr_player.img_player_x, curr_player.img_player_y);
當中temp_parameters_float表示了這個蝴蝶的大小。curr_player.img_player_scal_incre_y就表示當前這一幀蝴蝶擺動翅膀的強度!
實現蝴蝶翩翩飛舞的效果