Android動畫有三大類(視圖動畫、幀動畫预厌、屬性動畫【3.0引進(jìn)】)
為了就是讓人機(jī)交互更加友好赞别,(講的高大上一點更容易被關(guān)注!)
合理的使用動畫能讓用戶獲得更加愉悅的使用體驗配乓!你懂的很愉悅仿滔!
android已經(jīng)寫好了一些動畫可以方便的使用例如『透明度』『旋轉(zhuǎn)』『縮放』『位移』
1.視圖動畫(View Animation)
- 做過Flash的都會知道補(bǔ)間動畫,給出兩個關(guān)鍵幀犹芹,通過一些算法將給定屬性值在給定的時間內(nèi)在兩個關(guān)鍵幀間漸變崎页。
- 可以給一個View同時設(shè)置多個動畫(AnimationSet,AnimatorSet),比如從透明至不透明的淡入效果腰埂,與從小到大的放大效果飒焦,這些動畫可以同時進(jìn)行,也可以在一個完成之后開始另一個。
- Android中提供了 AlphaAnimation牺荠、RotateAnimation翁巍、TranslateAnimation、ScaleAnimation看名字就應(yīng)該知道對應(yīng)上面所述的幾個動畫它們的用法也很簡單
//透明動畫 其他動畫同理 換一下參數(shù)給指定的view啟動動畫就實現(xiàn)了
AlphaAnimation aa=new AlphaAnimation(0f,1f);
aa.setDuration(2000);
view.startAnimation(aa);
在此我不一一贅述代碼休雌。灶壶。因為我懶,而且推薦大家自己看看里面的屬性杈曲,會懂得更多
釋放你的求知欲吧3哿荨!
動畫還需要監(jiān)聽一些事情比如開始担扑、結(jié)束恰响、是否重復(fù)等等
aa.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
1.X 接下來我們在介紹中提到AnimationSet
這個類做動畫一般來說會比較常用,因為它控制了多個動畫一起動還是隊列的動涌献,通俗來講就是你先動還是我先動胚宦,或者說大家一起動起來~! 好像很Happy的樣子
其實就是這個類內(nèi)部維護(hù)了一個List<Animation> AnimationSet繼承于Animation
同樣簡單動畫可以用XML實現(xiàn)燕垃,在我們目錄里可以新建一個anim的文件夾枢劝,里面可以放一個根為「set」的 原理是一樣的
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:fromAlpha="0.3"
android:toAlpha="0.5"></alpha>
<rotate
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="180"/>
<scale
android:fromXScale="0.5"
android:fromYScale="0.5"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1"
android:toYScale="1"/>
<translate
android:fromXDelta="50%"
android:fromYDelta="50%"
android:toXDelta="100%"
android:toYDelta="100%"/>
</set>
使用AnimationUtils.loadAnimation(this,R.anim.sad)加載
(吐槽一下我打樣子輸入法無限給我楊紫你說這么黑好么!@酢!)
AnimationSet set=new AnimationSet(true);
set.addAnimation(aa);//加進(jìn)去就好了 注意內(nèi)存小心OOM 和內(nèi)存泄露
set.setFillAfter(true);//保持結(jié)束動畫的樣子,setFillBefore你懂的
set.setDuration(5000);
view.startAnimation(set);
- 對于內(nèi)存要有借有還低矮,再借不難
2.幀動畫(Frame Animation)
度娘說
- 動畫是通過把人物的表情印叁、動作、變化等分解后畫成許多動作瞬間的畫幅军掂,再用攝影機(jī)連續(xù)拍攝成一系列畫面轮蜕,給視覺造成連續(xù)變化的圖畫。它的基本原理與電影蝗锥、電視一樣跃洛,都是視覺暫留原理。醫(yī)學(xué)證明人類具有“視覺暫留”的特性终议,人的眼睛看到一幅畫或一個物體后汇竭,在0.34秒內(nèi)不會消失。利用這一原理穴张,在一幅畫還沒有消失前播放下一幅畫细燎,就會給人造成一種流暢的視覺變化效果。
結(jié)論就是 動畫標(biāo)準(zhǔn)是一秒24幀皂甘,也就是24張畫面組成一秒玻驻。電視播放標(biāo)準(zhǔn)是25幀每秒。
- 那么就很好理解啦偿枕,1秒大概24幅圖片h邓病;П琛!
用AS的在drawable中新建一個xml
<?xml version="1.0" encoding="utf-8"?>
<animation-list
xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true"
>
<!--
根標(biāo)簽為animation-list嗤锉,其中oneshot代表著是否只展示一遍渔欢,設(shè)置為false會不停的循環(huán)播放動畫
根標(biāo)簽下,通過item標(biāo)簽對動畫中的每一個圖片進(jìn)行聲明
android:duration 表示展示所用的該圖片的時間長度
-->
<item android:drawable="@drawable/icon1" android:duration="150"></item>
<item android:drawable="@drawable/icon2" android:duration="150"></item>
<item android:drawable="@drawable/icon3" android:duration="150"></item>
<item android:drawable="@drawable/icon4" android:duration="150"></item>
<item android:drawable="@drawable/icon5" android:duration="150"></item>
<item android:drawable="@drawable/icon6" android:duration="150"></item>
</animation-list>
在activity中用一下即可
view.setImageResource(R.drawable.icon);
AnimationDrawable ad = (AnimationDrawable) view.getDrawable();
ad.start();
當(dāng)然你可以手動添加圖片幀
ad.addFrame(@NonNull Drawable frame, int duration)
3.屬性動畫(Property Animation)
- 屬性動畫有 ObjectAnimator档冬、ValueAnimator膘茎,常用的還是ObjectAnimator繼承于ValueAnimator
AnimatorSet animatorSet = new AnimatorSet();///創(chuàng)建屬性動畫集
animatorSet.playTogether(///“playTogether”表示所有的子動畫同時運(yùn)作
ObjectAnimator.ofFloat(view, "rotationX", 0, 360),
ObjectAnimator.ofFloat(view, "rotationY", 0, 180),
ObjectAnimator.ofFloat(view, "rotation", 0, -90),
ObjectAnimator.ofFloat(view, "translationX", 0, 90),
ObjectAnimator.ofFloat(view, "translationY", 0, 90),
ObjectAnimator.ofFloat(view, "scaleX", 1, 1.5f),
ObjectAnimator.ofFloat(view, "scaleY", 1, 0.5f),
ObjectAnimator.ofFloat(view, "alpha", 1, 0.25f, 1)
);
animatorSet.setDuration(5 * 1000).start();
- 同樣Animator也可以寫XML來實現(xiàn)
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially">
<objectAnimator
android:duration="3000"
android:propertyName="rotationX"
android:repeatCount="infinite"
android:repeatMode="reverse"
android:startOffset="0"
android:valueFrom="0"
android:valueTo="360"
android:valueType="intType" />
</set>
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(getApplicationContext(), R.animator.property_animator);
set.setTarget(mView);//設(shè)置一下要動的目標(biāo)View
set.start();
一般監(jiān)聽有
ObjectAnimator.ofArgb().addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
//動畫開始
}
@Override
public void onAnimationEnd(Animator animation) {
//動畫結(jié)束
}
@Override
public void onAnimationCancel(Animator animation) {
//動畫取消
}
@Override
public void onAnimationRepeat(Animator animation) {
//重復(fù)動畫
}
});
ObjectAnimator.ofFloat(view, "alpha", 1, 0.25f, 1).addUpdateListener(new ValueAnimator
.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//動畫值更新通過 animation.getAnimatedValue()取得
//這個更新值能讓我們做一些規(guī)律動畫
}
});
總結(jié)
- AnimationSet 與 AnimatorSet 最大的不同在于,AnimationSet 使用的是 Animation 子類酷誓、AnimatorSet 使用的是 Animator 的子類披坏。
Animation 是針對視圖外觀的動畫實現(xiàn),動畫被應(yīng)用時外觀改變但視圖的觸發(fā)點不會發(fā)生變化盐数,還是在原來定義的位置棒拂。
Animator是針對視圖屬性的動畫實現(xiàn),動畫被應(yīng)用時對象屬性產(chǎn)生變化玫氢,最終導(dǎo)致視圖外觀變化帚屉。
- 這一章講了一個動畫大概,下一章一起看看自定義動畫和場景動畫還有現(xiàn)在的流行的SVG動畫