極客學(xué)院Animation教程講解的很詳細(xì),點(diǎn)擊進(jìn)入哦
這里為學(xué)習(xí)的整理和補(bǔ)充O(∩_∩)O
一沉唠、 使用ValueAnimator
- 初始化ValueAnimator
- 方式一
//演示從(0召调,0)到(400始腾,400)的移動(dòng)
view = findViewById(R.id.view);
//可以傳入n個(gè)Int類型的數(shù)值梭冠,這里僅傳入兩個(gè)0桶雀、400
ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 400);
valueAnimator.setDuration(3000);
//監(jiān)聽3000ms內(nèi)矿酵,從0->400數(shù)值的實(shí)時(shí)變化
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int curValue = (int) animation.getAnimatedValue();
//沒有l(wèi)ayout的調(diào)用,view是不會(huì)移動(dòng)的矗积,layout設(shè)置view的位置
view.layout(curValue, curValue, curValue + view.getWidth(), curValue + view.getHeight());
}});
//開始動(dòng)畫
valueAnimator.start();
//也可以設(shè)置延長n毫秒之后啟動(dòng)
//valueAnimator.setStartDelay(10000);
- 方式二
//和ofInt的功能一樣全肮,只是一個(gè)Int類型,一個(gè)Float類型
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f,288.88f, 88.8f);
valueAnimator.setDuration(3000);
valueAnimator.setRepeatCount(1);
valueAnimator.setRepeatMode(ValueAnimator.INFINITE);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Float animatedValue = (Float) animation.getAnimatedValue();
//獲取整數(shù)部分的值
int curValue = animatedValue.intValue();
view.layout(curValue, curValue, curValue + view.getWidth(), curValue + view.getHeight());
}});
valueAnimator.start();
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//點(diǎn)擊取消當(dāng)前動(dòng)畫
valueAnimator.cancel();
}});
注意:此時(shí)view的位置已經(jīng)移動(dòng)棘捣,點(diǎn)擊此時(shí)的view是有反應(yīng)的辜腺,這是和補(bǔ)間動(dòng)畫不同的,點(diǎn)擊進(jìn)入,后記中有標(biāo)注
2.添加Listener 監(jiān)聽
valueAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
//執(zhí)行結(jié)果 start->(repeat)->(cancel)->end
3.取消監(jiān)聽
//移除 AnimatorUpdateListener
void removeUpdateListener(AnimatorUpdateListener listener);
void removeAllUpdateListeners();
//移除 AnimatorListener
void removeListener(AnimatorListener listener);
void removeAllListeners();
4.其他函數(shù)
//完全克隆一個(gè) ValueAnimator 實(shí)例评疗,包括它所有的設(shè)置以及所有對(duì)監(jiān)聽器代碼的處理
//和克隆差不多测砂,兩者除了外貌,并沒有其他的關(guān)聯(lián)哦~
public ValueAnimator clone()
二百匆、小試牛刀
一起嘗試一下下邊的例子如何實(shí)現(xiàn)吧砌些!
首先,可以看出這是一個(gè)在一定時(shí)間內(nèi)變大的圓加匈,并且最后回彈了存璃,可以用BounceInterpolator
那么,第一步雕拼,我們定義一個(gè)圓,在res/drawable下新建circle.xml文件
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size
android:width="30dp"
android:height="30dp"
/>
<solid
android:color="#ff0000"
/>
</shape>
就可以得到這樣一個(gè)圓:
- 在布局中引用一下
<View
android:gravity="center"
android:id="@+id/view"
android:layout_width="40dp"
android:layout_height="40dp"
android:background="@drawable/circle"
/>
- 最后一步纵东,java代碼引用,yeah~
view = findViewById(R.id.view);
ValueAnimator valueAnimator = ValueAnimator.ofInt(20, 600);
valueAnimator.setDuration(3000);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int curValue = (int) animation.getAnimatedValue();
ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
layoutParams.width = layoutParams.height = curValue;
view.setLayoutParams(layoutParams);
}});
valueAnimator.setInterpolator(new BounceInterpolator());
valueAnimator.start();
}
后記:
Property Animator(屬性動(dòng)畫) 包括 ValueAnimator 和 ObjectAnimation啥寇,Property Animator 是通過改變控件內(nèi)部的屬性值來達(dá)到動(dòng)畫效果的篮迎;
View Animation(視圖動(dòng)畫) 包括 Tween Animation(補(bǔ)間動(dòng)畫)和 Frame Animation(逐幀動(dòng)畫),補(bǔ)間動(dòng)畫雖能對(duì)控件做動(dòng)畫,但并沒有改變控件內(nèi)部的屬性值示姿;之前的TranslateAnimation就是補(bǔ)間動(dòng)畫
專業(yè)術(shù)語,還是稍微記一下吧??