本文介紹了View動(dòng)畫的各種效果缝呕,并實(shí)現(xiàn)自定義動(dòng)畫的效果诸尽。主要包括以下部分:
? ? ? ? 1.view動(dòng)畫-透明動(dòng)畫效果(AlphaAnimation)
? ? ? ? 2.View動(dòng)畫-旋轉(zhuǎn)動(dòng)畫效果(RotateAnimation)
? ? ? ? 3.View動(dòng)畫-移動(dòng)動(dòng)畫效果(TranslateAnimation)
? ? ? ? 4.View動(dòng)畫-縮放動(dòng)畫效果(ScaleAnimation)
? ? ? ? 5.View動(dòng)畫-動(dòng)畫效果的混合
? ? ? ? 6.View動(dòng)畫-動(dòng)畫效果的偵聽
? ? ? ? 7.View動(dòng)畫-自定義動(dòng)畫效果
詳細(xì)代碼:github.com/Baolvlv/LearnAndroid/tree/master/ViewAnimation
1.view動(dòng)畫-透明動(dòng)畫效果(AlphaAnimation)
對(duì)button設(shè)置事件監(jiān)聽器后,可以通過代碼或xml文件的方式,添加透明動(dòng)畫效果
(1)通過代碼的方式添加動(dòng)畫
//設(shè)置透明動(dòng)畫,透明度0-1
AlphaAnimation aa =newAlphaAnimation(0,1);
//設(shè)置動(dòng)畫的時(shí)間長(zhǎng)度
aa.setDuration(1000);
v.startAnimation(aa);
(2)通過xml文件的方式
在res文件夾下,新建anim文件夾车猬,在anim文件夾下新建 animation resource file,建立alpha標(biāo)簽,編寫透明動(dòng)畫的效果
http://schemas.android.com/apk/res/android">
android:toAlpha="1"
android:duration="1000">
而后在事件監(jiān)聽器中尺锚,添加xml的動(dòng)畫效果
v.startAnimation(AnimationUtils.loadAnimation(getApplication(),R.anim.aa));
2.View動(dòng)畫-旋轉(zhuǎn)動(dòng)畫效果(RotateAnimation)
(1)通過代碼的方式添加動(dòng)畫
初始化RotateAnimation變量珠闰,設(shè)置旋轉(zhuǎn)角度與旋轉(zhuǎn)中心
ra=newRotateAnimation(0,360,100,50);//后兩個(gè)參數(shù)為中心點(diǎn)的像素
//設(shè)置相對(duì)于控件自身中心點(diǎn)(比例 0.5f)
ra=newRotateAnimation(0,360,RotateAnimation.RELATIVE_TO_SELF,0.5f,RotateAnimation.RELATIVE_TO_SELF,0.5f);
//設(shè)置動(dòng)畫時(shí)間為1秒
ra.setDuration(1000);
在事件監(jiān)聽器中開始動(dòng)畫
v.startAnimation(ra);
(2)通過xml文件的方式
在res文件夾下,新建anim文件夾瘫辩,在anim文件夾下新建 animation resource file,建立rotate標(biāo)簽铸磅,編寫旋轉(zhuǎn)動(dòng)畫的效果
http://schemas.android.com/apk/res/android">
android:toDegrees="360"
android:duration="1000"
android:pivotX="50%"
android:pivotY="50%">
在事件監(jiān)聽器中開始動(dòng)畫
v.startAnimation(AnimationUtils.loadAnimation(getApplication(),R.anim.ra));
3.View動(dòng)畫-移動(dòng)動(dòng)畫效果(TranslateAnimation)
(1)通過代碼的方式添加動(dòng)畫
初始化TranslateAnimation變量赡矢,設(shè)置相對(duì)于自身初始位置的位移量
//相對(duì)于當(dāng)前自身位置移動(dòng)一個(gè)增量
ta=newTranslateAnimation(0,200,0,200);
ta.setDuration(1000);
在事件監(jiān)聽器中開始動(dòng)畫
v.startAnimation(ta);
(2)通過xml文件的方式
在res文件夾下,新建anim文件夾阅仔,在anim文件夾下新建 animation resource file,建立translate標(biāo)簽吹散,編寫位移動(dòng)畫的效果
http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="200"
android:fromYDelta="0"
android:toYDelta="200"
android:duration="1000">
在事件監(jiān)聽器中開始動(dòng)畫
v.startAnimation(AnimationUtils.loadAnimation(MainActivity.this,R.anim.ta));
4.View動(dòng)畫-縮放動(dòng)畫效果(ScaleAnimation)
(1)通過代碼的方式添加動(dòng)畫
初始化ScaleAnimation變量,設(shè)置縮放比例與縮放中點(diǎn)位置
//相對(duì)于控件自身的(100八酒,50)像素位置空民,從原大小放大至兩倍
sa=newScaleAnimation(1,2,1,2,100,50);
//相對(duì)于自身位置中心點(diǎn)從0放大到1
sa=newScaleAnimation(0,1,0,1,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
sa.setDuration(1000);
在事件監(jiān)聽器中開始動(dòng)畫
v.startAnimation(sa);
(2)通過xml文件的方式
在res文件夾下,新建anim文件夾羞迷,在anim文件夾下新建 animation resource file,建立scale標(biāo)簽界轩,編寫位縮放畫的效果
http://schemas.android.com/apk/res/android"
android:fromXScale="0"
android:toXScale="1"
android:fromYScale="0"
android:toYScale="1"
android:pivotX="50%"
android:pivotY="50%"
android:duration ="1000">
在事件監(jiān)聽器中開始動(dòng)畫
v.startAnimation(AnimationUtils.loadAnimation(MainActivity.this,R.anim.sa));
5.View動(dòng)畫-動(dòng)畫效果的混合
(1)通過代碼的方式添加動(dòng)畫
初始化AnimationSet類的對(duì)象as
//AnimationSet可儲(chǔ)存多個(gè)動(dòng)畫
privateAnimationSetas;
實(shí)例化as,設(shè)置動(dòng)畫補(bǔ)間
//是否共用動(dòng)畫補(bǔ)間:true衔瓮;動(dòng)畫補(bǔ)間:動(dòng)畫是加速還是勻速執(zhí)行
as=newAnimationSet(true);
as.setDuration(1000);
其余每個(gè)單獨(dú)動(dòng)畫與原來(lái)設(shè)置一樣浊猾,設(shè)置完后添入AnimationSet中
AlphaAnimation aa =newAlphaAnimation(0,1)
aa.setDuration(1000);
as.addAnimation(aa);
TranslateAnimation ta =newTranslateAnimation(200,0,200,0);
ta.setDuration(1000);
as.addAnimation(ta);
在事件監(jiān)聽器中開始動(dòng)畫
v.startAnimation(as);
(2)通過xml文件的方式
在res文件夾下,新建anim文件夾热鞍,在anim文件夾下新建 animation resource file,建立set主標(biāo)簽葫慎,設(shè)置動(dòng)畫補(bǔ)間與動(dòng)畫時(shí)間。在主標(biāo)簽下分別編寫每個(gè)動(dòng)畫的標(biāo)簽薇宠,并完成相關(guān)設(shè)置
http://schemas.android.com/apk/res/android"
android:shareInterpolator="true"
android:duration="1000">
android:toAlpha="1"/>
android:toXDelta="0"
android:fromYDelta="200"
android:toYDelta="0"/>
在事件監(jiān)聽器中開始動(dòng)畫
v.startAnimation(AnimationUtils.loadAnimation(MainActivity.this,R.anim.anim));
6.View動(dòng)畫-動(dòng)畫效果的偵聽
通過對(duì)Animation對(duì)象setAnimationListener,對(duì)動(dòng)畫效果進(jìn)行偵聽偷办,會(huì)override動(dòng)畫開始,動(dòng)畫結(jié)束與動(dòng)畫重復(fù)三個(gè)函數(shù)澄港,在相應(yīng)的函數(shù)中完成操作
Animation a = AnimationUtils.loadAnimation(MainActivity.this,R.anim.anim);
a.setAnimationListener(newAnimation.AnimationListener() {
@Override
public voidonAnimationStart(Animation animation) {
}
@Override
public voidonAnimationEnd(Animation animation) {
Toast.makeText(MainActivity.this,"Animation end",Toast.LENGTH_SHORT).show();
}
@Override
public voidonAnimationRepeat(Animation animation) {
}
});
7.View動(dòng)畫-自定義動(dòng)畫效果
自定義一個(gè)類繼承自Animation,override initialize方法與applyTransformation方法
//獲取目標(biāo)容器于父級(jí)容器的寬高
@Override
public voidinitialize(intwidth, intheight, intparentWidth, intparentHeight) {
super.initialize(width,height,parentWidth,parentHeight);
//在動(dòng)畫開始時(shí)椒涯,initialize方法先執(zhí)行,獲取到目標(biāo)對(duì)象的寬高
//設(shè)置變化形態(tài)
@Override
protected voidapplyTransformation(floatinterpolatedTime,Transformation t) {
//參數(shù)interpolatedTime為補(bǔ)間時(shí)間回梧,動(dòng)畫開始時(shí)為0废岂,結(jié)束時(shí)為1,動(dòng)畫過程中從0到1變化
//參數(shù)Transformation可以設(shè)置變化的形態(tài), 如設(shè)置透明
//t.setAlpha(interpolatedTime);
//設(shè)置其他的變化getMatrix
// 用最終位置乘interpolatedTime,進(jìn)行到最終位置的緩慢移位
// t.getMatrix().setTranslate(200*interpolatedTime,200*interpolatedTime);
//以10為振幅的左右周期震動(dòng)
t.getMatrix().setTranslate((float) (Math.sin(interpolatedTime*10)*10),0);
super.applyTransformation(interpolatedTime,t);
而后在主activity中實(shí)例化類狱意,在事件監(jiān)聽器中startAnimation即可