產品需求中有乙個動畫效果:textureview按照曲線路徑進行移動,並且同時做scale和alpha變化。當然,同時
進行多個動畫只需要使用animationset就行了,但是對於」曲線」這樣的移動效果,只能採用多個translateanimation來順序進行以模擬曲線的效果了。這樣的實現方式沒有問題,但是仔細觀察實際效果卻發現,在連續兩個動畫進行過程中,第乙個動畫結束到第二個動畫開始,textureview會出現瞬間的停止,然後才會進行第二個動畫,也就是會」卡」一下,這樣的效果就不太理想了。
沒辦法,只能實現乙個自定義動畫,即在乙個animation中實現view的曲線移動。
下面看看乙個簡單的自定義動畫的實現:為了方便定義動畫的狀態(也可以成為」關鍵幀」),我們簡單定義乙個類:
1234567
89
public
class animationstatus
然後是繼承自animation的extanimation物件,主要的介面和**如下:
1234567
891011
1213
1415
1617
1819
2021
2223
2425
2627
2829
3031
3233
3435
3637
3839
4041
4243
4445
4647
4849
5051
5253
5455
5657
5859
6061
6263
6465
6667
6869
public
class extanimation extends animation
// 新增乙個關鍵幀(新增時status請按time排好序)
public
voidaddstatus(animationstatus status,floattimepoint)
@override
public
voidinitialize(
intwidth,intheight,intparentwidth,intparentheight)
// 最重要的方法
@override
protected
voidfloatinterpolatedtime, transformation t)
}// 在keystatus1和keystatus2指定的狀態之間做動畫
animationstatus keystatus1 = manilist.get
(index1)
; animationstatus keystatus2 = manilist.get
(index2);if
(keystatus1 ==
null|| keystatus2 ==
null)
return
;// 取得當前變換矩陣
matrix matrix = t.getmatrix()
;// 調整透明度
floatalpha1 = keystatus1.alpha
;floatalpha2 = keystatus2.alpha
; t.setalpha
(alpha1 +
(alpha2 - alpha1)
*(offset_time)
/ timetotal)
;// 調整位移
floatx1 = keystatus1.x
;floaty1 = keystatus1.y
;floatx2 = keystatus2.x
;floaty2 = keystatus2.y
; matrix.pretranslate
(x1 +
(x2 - x1)
* offset_time / timetotal, y1 +
(y2 - y1)
* offset_time / timetotal)
;// 調整大小
floatsx1 = keystatus1.scale_x
;floatsy1 = keystatus1.scale_y
;floatsx2 = keystatus2.scale_x
;floatsy2 = keystatus2.scale_y
; matrix.prescale
(sx1 +
(sx2 - sx1)
* offset_time / timetotal, sy1 +
(sy2 - sy1)
* offset_time / timetotal); }
}
以上就是乙個最簡單的自定義動畫,我們可以連續加入任意多個animationstatus來指定動畫的關鍵狀態,比如(0,0,1,1,1) –> (10,50,1.5f,1.5f,0.5f)–>(10,-50,2,2,0),表示從初始狀態,首先移動到(10,50)座標處並且長寬變大1.5倍、alpha變成0.5;然後再次移動到(10,-50)座標處並且長寬變為2倍、alpha變成0。 這樣實現的好處在於,跟兩個animationset順序執行相比,消除了aniamtionset切換時的」卡頓」現象,整個動畫流程將流暢很多。
當然,上述的實現中,在每兩個關鍵幀之間的動畫,採取的只是簡單的線性函式,即按照時間(interpolatedtime)變數的一元一次方程,其實我們可以採用更複雜的計算函式(變數為interpolatedtime)來計算每一次的位移等,從而可以實現任何複雜的動畫曲線。
Android自定義控制項 自定義屬性
自定義屬性的過程 1.在res values資料夾中建立attrs的xml檔案。2.寫入標籤,定義子標籤attr,放入自定義屬性的名稱。format 可以用 來同時使用 1 reference 參考某一資源id 2 color 顏色值 3 boolean 布林值 4 dimension 尺寸值 帶有...
Android自定義View 自定義元件
自繪控制項也分兩種,自定義元件和自定義容器,自定義元件是繼承view類,自定義容器時繼承viewgrounp 今天主要分析下自定義元件 還是舉個例子來的實際些,假如我們要畫乙個最簡單的textview,首先想到的就是canvas.drawtext 方法,怎麼畫了?還是得一步一步來 1 寫乙個myte...
Android自定義控制項之自定義View 二
效果如下圖 1 自定義ringview繼承view新增其構造方法並建立畫筆 public class ringview extends view protected boolean isrunning false public ringview context context public ring...