屬性動(dòng)畫(huà)
知識(shí)點(diǎn)
- 什么是Android屬性動(dòng)畫(huà)
- 動(dòng)畫(huà)比較
- 屬性動(dòng)畫(huà)組成部分鸣皂、相關(guān)類介紹
- 基本屬性實(shí)現(xiàn)
詳解
- 什么是Android屬性動(dòng)畫(huà)
屬性動(dòng)畫(huà)(Property Animation)系統(tǒng)是一個(gè)健壯的動(dòng)畫(huà)框架系統(tǒng)十性,它可以滿足你大部分動(dòng)畫(huà)需求。不管動(dòng)畫(huà)對(duì)象是否已經(jīng)繪制到屏幕上舔稀,你都可以在動(dòng)畫(huà)執(zhí)行過(guò)程中改變它任意的屬性值。一個(gè)屬性動(dòng)畫(huà)會(huì)在一段特定長(zhǎng)度的時(shí)間內(nèi)改變一個(gè)屬性(一個(gè)對(duì)象中的字段)的值。你可以通過(guò)以下幾步定義一個(gè)動(dòng)畫(huà):指定你要執(zhí)行動(dòng)畫(huà)的屬性,比如動(dòng)畫(huà)對(duì)象(View)在屏幕上的位置祈餐,指定執(zhí)行時(shí)長(zhǎng),指定你希望的屬性的變化值哄陶。
- 動(dòng)畫(huà)比較
- 補(bǔ)間動(dòng)畫(huà)(Tween Animation)
a. 漸變動(dòng)畫(huà)支持四種類型:平移(Translate)帆阳、旋轉(zhuǎn)(Rotate)、縮放(Scale)屋吨、不透明度(Alpha)蜒谤。
b. 只是顯示的位置變動(dòng),View的實(shí)際位置未改變离赫,表現(xiàn)為View移動(dòng)到其他地方芭逝,點(diǎn)擊事件仍在原處才能響應(yīng)(弊端)塌碌。
c. 組合使用步驟較復(fù)雜渊胸。
d. View Animation 也是指此動(dòng)畫(huà)。
- 幀動(dòng)畫(huà)(Frame Animation)
a. 用于生成連續(xù)的Gif效果圖台妆。
b. DrawableAnimation也是指此動(dòng)畫(huà)翎猛。
- 屬性動(dòng)畫(huà)(Property Animation)
a. 支持對(duì)所有View能更新的屬性的動(dòng)畫(huà)(需要屬性的setXxx()和getXxx())。
b. 更改的是View實(shí)際的屬性接剩,所以不會(huì)影響其在動(dòng)畫(huà)執(zhí)行后所在位置的正常使用切厘。
c. Android3.0 (API11)及以后出現(xiàn)的功能,3.0之前的版本可使用github第三方開(kāi)源庫(kù)nineoldandroids.jar進(jìn)行支持懊缺。
- 屬性動(dòng)畫(huà)組成部分疫稿、相關(guān)類介紹
1.ObjectAnimator :對(duì)象動(dòng)畫(huà)執(zhí)行類。
2.ValueAnimator :值動(dòng)畫(huà)執(zhí)行類鹃两,常配合AnimatorUpdateListener使用遗座。
3.PropertyValuesHolder : 屬性存儲(chǔ)器,為兩個(gè)執(zhí)行類提供更新多個(gè)屬性的功能俊扳。
4.Keyframe :為 PropertyValuesHolder提供多個(gè)關(guān)鍵幀的操作值途蒋。
5.AnimatorSet :一組動(dòng)畫(huà)的執(zhí)行集合類:設(shè)置執(zhí)行的先后順序,時(shí)間等馋记。
6.AnimatorUpdateListener :動(dòng)畫(huà)更新監(jiān)聽(tīng)号坡。
7.AnimatorListener :動(dòng)畫(huà)執(zhí)行監(jiān)聽(tīng),在動(dòng)畫(huà)開(kāi)始梯醒、重復(fù)宽堆、結(jié)束、取消時(shí)進(jìn)行回調(diào)茸习。
8.AnimatorInflater :加載屬性動(dòng)畫(huà)的xml文件畜隶。
9.TypeEvaluator :類型估值,用于設(shè)置復(fù)雜的動(dòng)畫(huà)操作屬性的值。
10.TimeInterpolator :時(shí)間插值代箭,用于控制動(dòng)畫(huà)執(zhí)行過(guò)程墩划。
- 基本屬性實(shí)現(xiàn)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<View
android:id="@+id/v"
android:layout_width="200dp"
android:layout_height="200dp"
android:background="@color/colorAccent"
android:layout_centerInParent="true"/>
</RelativeLayout>
public class MainActivity extends AppCompatActivity {
View v;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
v =findViewById(R.id.v);
}
//透明度
public void test1(){
/**
* 1.target 需要?jiǎng)赢?huà)的控件
* 2.propertyName 控件的那個(gè)屬性
* 3. ...values 變化的值 start-end
*/
ObjectAnimator alphaAnim = ObjectAnimator.
ofFloat(v,"alpha",1,0,1);
alphaAnim.setDuration(3000);
alphaAnim.start();
}
//旋轉(zhuǎn)
public void test2(){
ObjectAnimator rotateAnim=ObjectAnimator.
ofFloat(v,"rotation",0,360);
rotateAnim.setDuration(1000);
rotateAnim.start();
}
//縮放
public void test3(){
ObjectAnimator scaleAnim=ObjectAnimator.
ofFloat(v,"scaleX",1,1.1f,1,1.1f,1,1.1f,1);
scaleAnim.setDuration(1000);
//scaleAnim.setRepeatCount(-1);
//scaleAnim.setRepeatMode(ValueAnimator.REVERSE);
ObjectAnimator scaleAnim2=ObjectAnimator.
ofFloat(v,"scaleY",1,1.1f,1,1.1f,1,1.1f,1);
scaleAnim2.setDuration(1000);
//scaleAnim2.setRepeatCount(-1);
//scaleAnim2.setRepeatMode(ValueAnimator.REVERSE);
//playTogether 同時(shí)播放
//playSequentially 順序執(zhí)行
//play after before先后 with一起
AnimatorSet aset =new AnimatorSet();
// aset.playTogether(scaleAnim,scaleAnim2);
// aset.playSequentially();
aset.play(scaleAnim).after(scaleAnim2);
aset.start();
}
//移動(dòng)
public void test4(){
ObjectAnimator transAnim=ObjectAnimator.
ofFloat(v,"translationX",v.getTranslationX()+100);
transAnim.setDuration(100);
transAnim.start();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction()==MotionEvent.ACTION_DOWN){
test4();
}
return true;
}
}