編輯:關於Android編程
Android中動畫分為三種,逐幀動畫,補間動畫,屬性動畫,這篇先總結逐幀動畫和補間動畫。
字面上理解,幀之間追逐,幀動畫是順序的播放一系列圖片,從而產生動畫的效果,是將一個完整的動畫拆分成一張張單獨的圖片,然後再將它們連貫起來進行播放,與動畫片的工作原理類似,。
不靈活,大量使用圖片消耗資源,容易產生oom。
首先在res目錄下的drawable文件夾編寫一個xml文件
//
-
-
-
-
-
-
-
-
-
oneshot屬性表示是否循環播放,值為true則只播放一次。
方法調用
//把定義好的動畫資源設置到imageview上,
imgView.setImageResource(R.drawable.icons);
//通過getDrawable()獲取到AnimationDrawable對象
AnimationDrawable animationDrawable = (AnimationDrawable) view.getDrawable();
//啟動動畫
animationDrawable.start();
停止動畫
animationDrawable.stop();
補間動畫
1, 是什麼
補間顧名思義,補充中間,就是只要知道動畫的初始值和結束值,中間的值系統會自動幫我們計算。
補間動畫也稱view動畫,
只針對view,有移動動畫,縮放動畫,透明動畫,旋轉動畫四種。
2,怎麼樣
補間動畫基本可以滿足大多數的動畫效果,可是它只針對於view,而且只是改變view實現的效果,因此
具有局限性。
3,怎麼用
Java代碼方式使用
(1)移動動畫
移動動畫是通過TranslateAnimation類來實現的,有三個構造方法。常用的有兩個
構造方法一:
public TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) {}
參數解釋:
fromXDelta,toXDelta在源碼中的
*@param fromXDelta Change in X coordinate to apply at the start of the
animation
@param toXDelta Change in X coordinate to apply at the end of the
animation*
翻譯:fromXDelta 動畫起始時X軸坐標與原先位置的距離。toXDelta 動畫結束時應用在X軸坐標與原位置距離【翻譯有誤,大概意思是這樣】
fromYDelta,toYDelta與fromXDelta,toXDelta解釋相似。只是方向不同。單位均為像素。
使用如下:
TranslateAnimation translateAnimation = new TranslateAnimation(0f, 100f, 0f, 100f);
表示View移動100像素,fromXDelta與toXDeta的差如果大於0,則表示向右移動;差小與0,則表示向左移動。大右小左。Y同理,大下小上。
構造方法二:
public TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue,
int fromYType, float fromYValue, int toYType, float toYValue) {
}
參數解釋:
fromXType,toXType X方向移動類型,有三種類型:
Animation.ABSOLUTE:代表絕對像素
Animation.RELATIVE_TO_SELF:代表相對自身平移
Animation.RELATIVE_TO_PARENT:代表相對父View平移
fromXValue,toXValue X方向上移動的值,
當type為Animation.ABSOLUTE時,表示具體的像素值
當type為Animation.RELATIVE_TO_SELF或Animation.RELATIVE_TO_PARENT:這兩個值為比例值,取值范圍【0.0f,1.0f】
Y方向同理
使用如下:
TranslateAnimation translateAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF,
0f, Animation.RELATIVE_TO_SELF,
0.5f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0.5f);
具體使用:
/**
* 方式二:java代碼方式
*/
TranslateAnimation translateAnimation = new TranslateAnimation(
Animation.RELATIVE_TO_SELF,
0f, Animation.RELATIVE_TO_SELF,
0.5f, Animation.RELATIVE_TO_SELF, 0f,
Animation.RELATIVE_TO_SELF, 0.5f);
translateAnimation.setDuration(3000);
translateAnimation.setRepeatCount(Animation.INFINITE);
translateAnimation.setRepeatMode(Animation.REVERSE);
imageView.startAnimation(translateAnimation);
setDuration:整型值,設置動畫執行時間
setRepeatCount:整型值,設置重復次數,可以是具體次數也可以是
Animation.INFINITE,表示無限循環
setRepeatMode:設置重復模式,需要和setRepeatCount一起使用,有兩種模式Animation.REVERSE:倒敘回放,Animation.RESTART:重新播放
(2)透明動畫
透明動畫是通過AlphaAnimation類實現的,有兩個構造方法,常用的有一個
public AlphaAnimation(float fromAlpha, float toAlpha) {
}
參數解釋:
fromAlpha:起始透明度,float值,取值范圍【0.0~1.0】1.0f:表示完全不透明,0.0f:表示完全透明
toAlpha:結束值透明度,float值,取值范圍【0.0~1.0】1.0f:表示完全不透明,0.0f:表示完全透明
具體使用:、
AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 0.2f);
alphaAnimation.setDuration(3000);
alphaAnimation.setRepeatCount(Animation.INFINITE);
alphaAnimation.setRepeatMode(Animation.REVERSE);
imageView.startAnimation(alphaAnimation);
相關設置與上相同。
(3)旋轉動畫
旋轉動畫是通過RotateAnimation類來實現的,有四個構造方法,常用的有三個
1,構造方法一:
public RotateAnimation(float fromDegrees, float toDegrees) {
}
2,構造方法二:
public RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY) {
}
3,構造方法三:
public RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue,
int pivotYType, float pivotYValue) {
}
參數解釋:
前面兩個參數都一樣為fromDegrees,toDegrees,分別表示起始時的角度,結束時的角度,pivotX,pivotY源碼解釋為
** @param
* pivotX The X coordinate of the point about which the object is
* being rotated, specified as an absolute number where 0 is the left
* edge.
* @param pivotY The Y coordinate of the point about which the object is
* being rotated, specified as an absolute number where 0 is the top
* edge.
/
翻譯:
pivotX:被旋轉的對象的X軸坐標,指定為一個絕對的數值,其中0表示頂部邊緣。pivotY同理。(翻譯不太准確,大概意思是這樣)
pivotXType, float pivotXValue源碼解釋為:
** @param pivotXType Specifies how pivotXValue should be interpreted. One of
* Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or
* Animation.RELATIVE_TO_PARENT.
* @param pivotXValue The X coordinate of the point about which the object
* is being rotated, specified as an absolute number where 0 is the
* left edge. This value can either be an absolute number if
* pivotXType is ABSOLUTE, or a percentage (where 1.0 is 100%)
* otherwise.*
翻譯:
pivotXType 指定pivotXValue 應該如何被定義, 值為Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, 或Animation.RELATIVE_TO_PARENT之一。
pivotXValue 被旋轉的對象的X軸坐標,指定為一個絕對的數值,其中0表示頂部邊緣,如果pivotXType 是ABSOLUTE,值可以是一個絕對的數值,否則,是一個百分數或比例值(其中1.0是100%)【翻譯有誤,大概意思是這樣】
Y方向同理
具體使用,以第三種構造方法為例
RotateAnimation rotateAnimation = new RotateAnimation(0f, 360f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rotateAnimation.setDuration(3000);
rotateAnimation.setRepeatMode(Animation.REVERSE);
rotateAnimation.setRepeatCount(Animation.INFINITE);
imageView.startAnimation(rotateAnimation);
(4)縮放動畫
縮放動畫是通過ScaleAnimation類實現的,有四個構造方法,常用的有三個
構造方法一:
public ScaleAnimation(float fromX, float toX, float fromY, float toY) {
}
構造方法二
public ScaleAnimation(float fromX, float toX, float fromY, float toY,
float pivotX, float pivotY) {
}
構造方法三:
public ScaleAnimation(float fromX, float toX, float fromY, float toY,
int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) {
}
參數解釋:
前面四個參數相同,fromX,toX,fromY,toY,X軸方向源碼解釋為
* @param fromX Horizontal scaling factor to apply at the start of the
* animation
* @param toX Horizontal scaling factor to apply at the end of the animation
* @param fromY Vertical scaling factor to apply at the start of the
* animation
* @param toY Vertical scaling factor to apply at the end of the animation
翻譯:
fromX 表示在動畫開始時應用的水平縮放因子,toX表示在動畫結束時應用的水平縮放因子。
fromY 表示動畫在開始時應用的垂直縮放因子,toY表示動畫在結束時應用的縮放因子。
pivotXType,pivotXValue,pivotYType,pivotYValue**與旋轉動畫解釋相同**。
具體使用,以構造方法二為例:
ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 1.5f, 1.0f, 1.5f, 0.5f, 0.5f);
scaleAnimation.setDuration(3000);
scaleAnimation.setRepeatMode(Animation.REVERSE);
scaleAnimation.setRepeatCount(Animation.INFINITE);
imageView.startAnimation(scaleAnimation);
(5)復合動畫
復合動畫不是一種動畫的類型,而是一種動畫集合,組合了多種動畫,以達到酷炫的效果。復合動畫是通過AnimationSe類來實現的,有兩個構造方法,常用的有一個。
public AnimationSet(boolean shareInterpolator) {
}
參數解釋:
shareInterpolator在源碼中的解釋為
* @param shareInterpolator Pass true if all of the animations in this set
* should use the interpolator associated with this AnimationSet.
* Pass false if each animation should use its own interpolator.
翻譯:如果為true,表示這個集合中所有的動畫都應該使用這個集合動畫關聯的插值器。如果為false,表示每個動畫應該使用他們自己的插值器。【翻譯有誤,大概意思是這樣,雖然不影響語義,但這裡的pass不知道是什麼意思,看到的請告訴我一聲,謝謝。】
具體使用
//創建復合動畫對象,參數:是否共享插值器
AnimationSet animationSet = new AnimationSet(true);
//設置動畫執行的時間
animationSet.setDuration(3000);
//設置重復模式
animationSet.setRepeatMode(Animation.REVERSE);
//設置勻速變化
animationSet.setInterpolator(new LinearInterpolator());
//旋轉動畫
RotateAnimation rotateAnimation1 = new RotateAnimation(0.0f, 720f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
//透明動畫
AlphaAnimation alphaAnimation1=new AlphaAnimation(1.0f,0.3f);
//縮放動畫
ScaleAnimation scaleAnimation1=new ScaleAnimation(1.0f,0.5f,1.0f,0.5f);
//設置動畫執行之前等待的時間
scaleAnimation1.setStartOffset(3000);
//把旋轉動畫添加進集合
animationSet.addAnimation(rotateAnimation1);
//把透明動畫添加進集合
animationSet.addAnimation(alphaAnimation1);
//把縮放動畫添加進集合
animationSet.addAnimation(scaleAnimation1);
//開啟view動畫
imageView.startAnimation(animationSet);
解釋在注釋裡面
xml方式使用
(1)移動動畫
在res文件夾下新建anim文件夾,在文件夾中新建以
translate為根節點的xml,然後設置相關屬性,如下
屬性與java代碼實現的一樣。
在代碼中通過AnimationUtils的loadAnimation方法引用:
Animation animation = AnimationUtils.loadAnimation(this, R.anim.translateanim);
imageView.startAnimation(animation);
其他動畫同理。
(2)透明動畫
在anim中定義一個以alpha為根節點的xml,如下:
在代碼中通過AnimationUtils的loadAnimation方法引用:
Animation animation2 = AnimationUtils.loadAnimation(this, R.anim.alphaanim);
imageView.startAnimation(animation2);
(3)旋轉動畫
在anim文件夾下新建以rotate為根節點的xml,如下
在代碼中通過AnimationUtils的loadAnimation方法引用:
Animation animation1 = AnimationUtils.loadAnimation(this, R.anim.rotateanim);
imageView.startAnimation(animation1);
(4)縮放動畫
在anim文件夾下定義以scale為根節點的xml,如下
在代碼中通過AnimationUtils的loadAnimation方法引用:
Animation animation3 = AnimationUtils.loadAnimation(this, R.anim.scaleanim);
imageView.startAnimation(animation3);
(5)復合動畫
在anim文件夾下新建以set為根節點的xml如下
注意,
set是個集合,裡面可以嵌套動畫,也可以嵌套set集合,集合裡面在寫動畫。
在代碼中通過AnimationUtils的loadAnimation方法引用:
Animation animation = AnimationUtils.loadAnimation(this, R.anim.setanim);
imageView.startAnimation(animation);
**
補充
**:
android:fillAfter 如果設置為true,控件動畫結束時,將保持動畫最後時的狀態
android:fillBefore 如果設置為true,控件動畫結束時,還原到開始動畫前的狀態
android:interpolator 設定插值器,指定動畫效果。
何為interpolator?源碼中這樣解釋:
/**
* An interpolator defines the rate of change of an animation. This allows
* the basic animation effects (alpha, scale, translate, rotate) to be
* accelerated, decelerated, repeated, etc.
*/
翻譯:
插值器定義了動畫改變的速率,它允許基本的動畫效果(透明,縮放,位移,旋轉)加速,減速,重復,等等。
<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPrXa0rvW1qO6QWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3I8YnIgLz4NCjxpbWcgYWx0PQ=="這裡寫圖片描述" src="/uploadfile/Collfiles/20160930/20160930092317126.png" title="\" />所以interpolator是一個改變動畫執行速率的東西,用來修飾動畫效果。
系統提供的插值器有那麼多,如圖:
表示,在動畫開始與結束的地方速率改變比較慢,在中間的時候加速的插值器。
第二種:AccelerateInterpolator
表示,在動畫開始的地方速率改變比較慢,然後開始加速
- 第三種:AnticipateInterpolator
表示,開始的時候向後然後向前沖
第四種:AnticipateOvershootInterpolator
表示,開始的時候向後然後向前沖到達目標值後返回最後的值
第五種:BounceInterpolator
表示,在 動畫結束的時候彈起
- 第六種:CycleInterpolator
表示,動畫循環播放特定的次數,速率改變沿著正弦曲線
第七種:DecelerateInterpolator
表示,在動畫開始的地方快然後減慢
- 第八種:LinearInterpolator
以常量速率改變
- 第九種:OvershootInterpolator
表示,向前沖超過最大值再回到原來位置
左右切換圖片控件大家都用ViewPager, ViewFipper比較多吧,我之前也用ViewPager實現了,使用ViewPager實現左右循環滑動圖片,有興趣的可以去
ChangeMode項目地址:ChangeMode Implementation of night mode for Android. 用最簡單的方式實現夜間模式,支持L
注意:因為使用的工具和SDK版本不同,過程可能就不同,我把我試驗過的幾種情況都會說下。一、工具和SDK版本:Android studio1.51, SDK版本:23 (最
0、基礎回顧PropertyAnimation,屬性動畫,顧名思義就是利用對象的屬性變化形成動畫的效果。屬性動畫的類可以用Animator這個抽象類來表示,通常使用它的子