青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

xiaoguozi's Blog
Pay it forword - 我并不覺(jué)的自豪,我所嘗試的事情都失敗了······習(xí)慣原本生活的人不容易改變,就算現(xiàn)狀很糟,他們也很難改變,在過(guò)程中,他們還是放棄了······他們一放棄,大家就都是輸家······讓愛(ài)傳出去,很困難,也無(wú)法預(yù)料,人們需要更細(xì)心的觀察別人,要隨時(shí)注意才能保護(hù)別人,因?yàn)樗麄兾幢刂雷约阂裁础ぁぁぁぁ?/span>

Android動(dòng)畫學(xué)習(xí)筆記

  3.0以前,android支持兩種動(dòng)畫模式,tween animation,frame animation,在android3.0中又引入了一個(gè)新的動(dòng)畫系統(tǒng):property animation,這三種動(dòng)畫模式在SDK中被稱為property animation,view animation,drawable animation。 

1. View Animation(Tween Animation)

  View Animation(Tween Animation):補(bǔ)間動(dòng)畫,給出兩個(gè)關(guān)鍵幀,通過(guò)一些算法將給定屬性值在給定的時(shí)間內(nèi)在兩個(gè)關(guān)鍵幀間漸變。

  View animation只能應(yīng)用于View對(duì)象,而且只支持一部分屬性,如支持縮放旋轉(zhuǎn)而不支持背景顏色的改變。

  而且對(duì)于View animation,它只是改變了View對(duì)象繪制的位置,而沒(méi)有改變View對(duì)象本身,比如,你有一個(gè)Button,坐標(biāo) (100,100),Width:200,Height:50,而你有一個(gè)動(dòng)畫使其變?yōu)閃idth:100,Height:100,你會(huì)發(fā)現(xiàn)動(dòng)畫過(guò)程中觸 發(fā)按鈕點(diǎn)擊的區(qū)域仍是(100,100)-(300,150)。

  View Animation就是一系列View形狀的變換,如大小的縮放,透明度的改變,位置的改變,動(dòng)畫的定義既可以用代碼定義也可以用XML定義,當(dāng)然,建議用XML定義。

  可以給一個(gè)View同時(shí)設(shè)置多個(gè)動(dòng)畫,比如從透明至不透明的淡入效果,與從小到大的放大效果,這些動(dòng)畫可以同時(shí)進(jìn)行,也可以在一個(gè)完成之后開始另一個(gè)。

  用XML定義的動(dòng)畫放在/res/anim/文件夾內(nèi),XML文件的根元素可以 為<alpha>,<scale>,<translate>,<rotate>,interpolator 元素或<set>(表示以上幾個(gè)動(dòng)畫的集合,set可以嵌套)。默認(rèn)情況下,所有動(dòng)畫是同時(shí)進(jìn)行的,可以通過(guò)startOffset屬性設(shè)置 各個(gè)動(dòng)畫的開始偏移(開始時(shí)間)來(lái)達(dá)到動(dòng)畫順序播放的效果。

  可以通過(guò)設(shè)置interpolator屬性改變動(dòng)畫漸變的方式,如AccelerateInterpolator,開始時(shí)慢,然后逐漸加快。默認(rèn)為AccelerateDecelerateInterpolator。

  定義好動(dòng)畫的XML文件后,可以通過(guò)類似下面的代碼對(duì)指定View應(yīng)用動(dòng)畫。

ImageView spaceshipImage = (ImageView)findViewById(R.id.spaceshipImage);
Animation hyperspaceJumpAnimation=AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
spaceshipImage.startAnimation(hyperspaceJumpAnimation);

2. Drawable Animation(Frame Animation)

  Drawable Animation(Frame Animation):幀動(dòng)畫,就像GIF圖片,通過(guò)一系列Drawable依次顯示來(lái)模擬動(dòng)畫的效果。在XML中的定義方式如下:

  必須以<animation-list>為根元素,以<item>表示要輪換顯示的圖片,duration屬性表示各項(xiàng)顯示的時(shí)間。XML文件要放在/res/drawable/目錄下。示例:

protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imageView = (ImageView) findViewById(R.id.imageView1);
imageView.setBackgroundResource(R.drawable.drawable_anim);
anim = (AnimationDrawable) imageView.getBackground();
}

public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
anim.stop();
anim.start();
return true;
}
return super.onTouchEvent(event);
}

  我在實(shí)驗(yàn)中遇到兩點(diǎn)問(wèn)題:

  1. 要在代碼中調(diào)用Imageview的setBackgroundResource方法,如果直接在XML布局文件中設(shè)置其src屬性當(dāng)觸發(fā)動(dòng)畫時(shí)會(huì)FC。
  2. 在動(dòng)畫start()之前要先stop(),不然在第一次動(dòng)畫之后會(huì)停在最后一幀,這樣動(dòng)畫就只會(huì)觸發(fā)一次。
  3. 最后一點(diǎn)是SDK中提到的,不要在onCreate中調(diào)用start,因?yàn)锳nimationDrawable還沒(méi)有完全跟Window相關(guān)聯(lián),如果想要界面顯示時(shí)就開始動(dòng)畫的話,可以在onWindowFoucsChanged()中調(diào)用start()。

3. Property Animation

  屬性動(dòng)畫,這個(gè)是在Android 3.0中才引進(jìn)的,以前學(xué)WPF時(shí)里面的動(dòng)畫機(jī)制好像就是這個(gè),它更改的是對(duì)象的實(shí)際屬性,在View Animation(Tween Animation)中,其改變的是View的繪制效果,真正的View的屬性保持不變,比如無(wú)論你在對(duì)話中如何縮放Button的大小,Button的 有效點(diǎn)擊區(qū)域還是沒(méi)有應(yīng)用動(dòng)畫時(shí)的區(qū)域,其位置與大小都不變。而在Property Animation中,改變的是對(duì)象的實(shí)際屬性,如Button的縮放,Button的位置與大小屬性值都改變了。而且Property Animation不止可以應(yīng)用于View,還可以應(yīng)用于任何對(duì)象。Property Animation只是表示一個(gè)值在一段時(shí)間內(nèi)的改變,當(dāng)值改變時(shí)要做什么事情完全是你自己決定的。

在Property Animation中,可以對(duì)動(dòng)畫應(yīng)用以下屬性:

  • Duration:動(dòng)畫的持續(xù)時(shí)間
  • TimeInterpolation:屬性值的計(jì)算方式,如先快后慢
  • TypeEvaluator:根據(jù)屬性的開始、結(jié)束值與TimeInterpolation計(jì)算出的因子計(jì)算出當(dāng)前時(shí)間的屬性值
  • Repeat Country and behavoir:重復(fù)次數(shù)與方式,如播放3次、5次、無(wú)限循環(huán),可以此動(dòng)畫一直重復(fù),或播放完時(shí)再反向播放
  • Animation sets:動(dòng)畫集合,即可以同時(shí)對(duì)一個(gè)對(duì)象應(yīng)用幾個(gè)動(dòng)畫,這些動(dòng)畫可以同時(shí)播放也可以對(duì)不同動(dòng)畫設(shè)置不同開始偏移
  • Frame refreash delay:多少時(shí)間刷新一次,即每隔多少時(shí)間計(jì)算一次屬性值,默認(rèn)為10ms,最終刷新時(shí)間還受系統(tǒng)進(jìn)程調(diào)度與硬件的影響

3.1 Property Animation的工作方式

  對(duì)于下圖的動(dòng)畫,這個(gè)對(duì)象的X坐標(biāo)在40ms內(nèi)從0移動(dòng)到40 pixel.按默認(rèn)的10ms刷新一次,這個(gè)對(duì)象會(huì)移動(dòng)4次,每次移動(dòng)40/4=10pixel。

  也可以改變屬性值的改變方法,即設(shè)置不同的interpolation,在下圖中運(yùn)動(dòng)速度先逐漸增大再逐漸減小

  下圖顯示了與上述動(dòng)畫相關(guān)的關(guān)鍵對(duì)象

ValueAnimator即表示一個(gè)動(dòng)畫,包含動(dòng)畫的開始值,結(jié)束值,持續(xù)時(shí)間等屬性。

ValueAnimator封裝了一個(gè)TimeInterpolator,TimeInterpolator定義了屬性值在開始值與結(jié)束值之間的插值方法。

ValueAnimator還封裝了一個(gè)TypeAnimator,根據(jù)開始、結(jié)束值與TimeIniterpolator計(jì)算得到的值計(jì)算出屬性值。

ValueAnimator根據(jù)動(dòng)畫已進(jìn)行的時(shí)間跟動(dòng)畫總時(shí)間(duration)的比計(jì)算出一個(gè)時(shí)間因子(0~1),然后根據(jù)TimeInterpolator計(jì)算出另一個(gè)因子,最后TypeAnimator通過(guò)這個(gè)因子計(jì)算出屬性值,如上例中10ms時(shí):

首先計(jì)算出時(shí)間因子,即經(jīng)過(guò)的時(shí)間百分比:t=10ms/40ms=0.25

經(jīng)插值計(jì)算(inteplator)后的插值因子:大約為0.15,上述例子中用了AccelerateDecelerateInterpolator,計(jì)算公式為(input即為時(shí)間因子):

(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;  

最后根據(jù)TypeEvaluator計(jì)算出在10ms時(shí)的屬性值:0.15*(40-0)=6pixel。上例中TypeEvaluator為FloatEvaluator,計(jì)算方法為 :

public Float evaluate(float fraction, Number startValue, Number endValue) {
float startFloat = startValue.floatValue();
return startFloat + fraction * (endValue.floatValue() - startFloat);
}

參數(shù)分別為上一步的插值因子,開始值與結(jié)束值。

3.2 ValueAnimator

  ValueAnimator包含Property Animation動(dòng)畫的所有核心功能,如動(dòng)畫時(shí)間,開始、結(jié)束屬性值,相應(yīng)時(shí)間屬性值計(jì)算方法等。應(yīng)用Property Animation有兩個(gè)步聚:

  1. 計(jì)算屬性值
  2. 根據(jù)屬性值執(zhí)行相應(yīng)的動(dòng)作,如改變對(duì)象的某一屬性。

  ValuAnimiator只完成了第一步工作,如果要完成第二步,需要實(shí)現(xiàn)ValueAnimator.onUpdateListener接口,如:

ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);
animation.setDuration(1000);
animation.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Log.i("update", ((Float) animation.getAnimatedValue()).toString());
}
});
animation.setInterpolator(new CycleInterpolator(3));
animation.start();

此示例中只是向Logcat輸出了一些信息,可以改為想做的工作。

Animator.AnimatorListener

onAnimationStart()

onAnimationEnd()

onAnimationRepeat()

onAnimationCancel

ValueAnimator.AnimatorUpdateListener

onAnimationUpdate()  //通過(guò)監(jiān)聽(tīng)這個(gè)事件在屬性的值更新時(shí)執(zhí)行相應(yīng)的操作,對(duì)于ValueAnimator一般要監(jiān)聽(tīng)此事件執(zhí)行相應(yīng)的動(dòng)作,不然Animation沒(méi)意義(可用于計(jì)時(shí)),在ObjectAnimator(繼承自ValueAnimator)中會(huì)自動(dòng)更新屬性,如無(wú)必要不必監(jiān)聽(tīng)。在函數(shù)中會(huì)傳遞一個(gè)ValueAnimator參數(shù),通過(guò)此參數(shù)的getAnimatedValue()取得當(dāng)前動(dòng)畫屬性值。

  可以繼承AnimatorListenerAdapter而不是實(shí)現(xiàn)AnimatorListener接口來(lái)簡(jiǎn)化操作,這個(gè)類對(duì)AnimatorListener中的函數(shù)都定義了一個(gè)空函數(shù)體,這樣我們就只用定義想監(jiān)聽(tīng)的事件而不用實(shí)現(xiàn)每個(gè)函數(shù)卻只定義一空函數(shù)體。

ObjectAnimator oa=ObjectAnimator.ofFloat(tv, "alpha", 0f, 1f);
oa.setDuration(3000);
oa.addListener(new AnimatorListenerAdapter(){
public void on AnimationEnd(Animator animation){
Log.i("Animation","end");
}
});
oa.start();

3.3 ObjectAnimator

  繼承自ValueAnimator,要指定一個(gè)對(duì)象及該對(duì)象的一個(gè)屬性,當(dāng)屬性值計(jì)算完成時(shí)自動(dòng)設(shè)置為該對(duì)象的相應(yīng)屬性,即完成了 Property Animation的全部?jī)刹讲僮鳌?shí)際應(yīng)用中一般都會(huì)用ObjectAnimator來(lái)改變某一對(duì)象的某一屬性,但用ObjectAnimator有一 定的限制,要想使用ObjectAnimator,應(yīng)該滿足以下條件:

  • 對(duì)象應(yīng)該有一個(gè)setter函數(shù):set<PropertyName>(駝峰命名法)
  • 如上面的例子中,像ofFloat之類的工場(chǎng)方法,第一個(gè)參數(shù)為對(duì)象名,第二個(gè)為屬性名,后面的參數(shù)為可變參數(shù),如果values…參數(shù)只設(shè)置了 一個(gè)值的話,那么會(huì)假定為目的值,屬性值的變化范圍為當(dāng)前值到目的值,為了獲得當(dāng)前值,該對(duì)象要有相應(yīng)屬性的getter方 法:get<PropertyName>
  • 如果有g(shù)etter方法,其應(yīng)返回值類型應(yīng)與相應(yīng)的setter方法的參數(shù)類型一致。

  如果上述條件不滿足,則不能用ObjectAnimator,應(yīng)用ValueAnimator代替。

tv=(TextView)findViewById(R.id.textview1);
btn=(Button)findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View v) {
    ObjectAnimator oa=ObjectAnimator.ofFloat(tv, "alpha", 0f, 1f);
    oa.setDuration(3000);
    oa.start();
  }
});

  把一個(gè)TextView的透明度在3秒內(nèi)從0變至1。

  根據(jù)應(yīng)用動(dòng)畫的對(duì)象或?qū)傩缘牟煌赡苄枰趏nAnimationUpdate函數(shù)中調(diào)用invalidate()函數(shù)刷新視圖。

3.4 通過(guò)AnimationSet應(yīng)用多個(gè)動(dòng)畫

  AnimationSet提供了一個(gè)把多個(gè)動(dòng)畫組合成一個(gè)組合的機(jī)制,并可設(shè)置組中動(dòng)畫的時(shí)序關(guān)系,如同時(shí)播放,順序播放等。

  以下例子同時(shí)應(yīng)用5個(gè)動(dòng)畫:

  1. 播放anim1;
  2. 同時(shí)播放anim2,anim3,anim4;
  3. 播放anim5。
1
2
3
4
5
6
AnimatorSet bouncer = new AnimatorSet();
bouncer.play(anim1).before(anim2);
bouncer.play(anim2).with(anim3);
bouncer.play(anim2).with(anim4)
bouncer.play(anim5).after(amin2);
animatorSet.start();

3.5 TypeEvalutors

  根據(jù)屬性的開始、結(jié)束值與TimeInterpolation計(jì)算出的因子計(jì)算出當(dāng)前時(shí)間的屬性值,android提供了以下幾個(gè)evalutor:

  • IntEvaluator:屬性的值類型為int;
  • FloatEvaluator:屬性的值類型為float;
  • ArgbEvaluator:屬性的值類型為十六進(jìn)制顏色值;
  • TypeEvaluator:一個(gè)接口,可以通過(guò)實(shí)現(xiàn)該接口自定義Evaluator。

  自定義TypeEvalutor很簡(jiǎn)單,只需要實(shí)現(xiàn)一個(gè)方法,如FloatEvalutor的定義:

1
2
3
4
5
6
public class FloatEvaluator implements TypeEvaluator {
    public Object evaluate(float fraction, Object startValue, Object endValue) {
        float startFloat = ((Number) startValue).floatValue();
        return startFloat + fraction * (((Number) endValue).floatValue() - startFloat);
    }
}

  根據(jù)動(dòng)畫執(zhí)行的時(shí)間跟應(yīng)用的Interplator,會(huì)計(jì)算出一個(gè)0~1之間的因子,即evalute函數(shù)中的fraction參數(shù),通過(guò)上述FloatEvaluator應(yīng)該很好看出其意思。

3.6 TimeInterplator

  time interplator定義了屬性值變化的方式,如線性均勻改變,開始慢然后逐漸快等。在Property Animation中是TimeInterplator,在View Animation中是Interplator,這兩個(gè)是一樣的,在3.0之前只有Interplator,3.0之后實(shí)現(xiàn)代碼轉(zhuǎn)移至了 TimeInterplator。Interplator繼承自TimeInterplator,內(nèi)部沒(méi)有任何其他代碼。

 

  • AccelerateInterpolator          加速,開始時(shí)慢中間加速
  • DecelerateInterpolator         減速,開始時(shí)快然后減速
  • AccelerateDecelerateInterolator    先加速后減速,開始結(jié)束時(shí)慢,中間加速
  • AnticipateInterpolator        反向 ,先向相反方向改變一段再加速播放
  • AnticipateOvershootInterpolator  反向加超越,先向相反方向改變,再加速播放,會(huì)超出目的值然后緩慢移動(dòng)至目的值
  • BounceInterpolator         跳躍,快到目的值時(shí)值會(huì)跳躍,如目的值100,后面的值可能依次為85,77,70,80,90,100
  • CycleIinterpolator          循環(huán),動(dòng)畫循環(huán)一定次數(shù),值的改變?yōu)橐徽液瘮?shù):Math.sin(2 * mCycles * Math.PI * input)
  • LinearInterpolator          線性,線性均勻改變
  • OvershottInterpolator        超越,最后超出目的值然后緩慢改變到目的值
  • TimeInterpolator          一個(gè)接口,允許你自定義interpolator,以上幾個(gè)都是實(shí)現(xiàn)了這個(gè)接口

3.7 當(dāng)Layout改變時(shí)應(yīng)用動(dòng)畫

  ViewGroup中的子元素可以通過(guò)setVisibility使其Visible、Invisible或Gone,當(dāng)有子元素可見(jiàn)性改變時(shí),可以向其應(yīng)用動(dòng)畫,通過(guò)LayoutTransition類應(yīng)用此類動(dòng)畫:

transition.setAnimator(LayoutTransition.DISAPPEARING, customDisappearingAnim);

  通過(guò)setAnimator應(yīng)用動(dòng)畫,第一個(gè)參數(shù)表示應(yīng)用的情境,可以以下4種類型:

  • APPEARING        當(dāng)一個(gè)元素變?yōu)閂isible時(shí)對(duì)其應(yīng)用的動(dòng)畫
  • CHANGE_APPEARING   當(dāng)一個(gè)元素變?yōu)閂isible時(shí),因系統(tǒng)要重新布局有一些元素需要移動(dòng),這些要移動(dòng)的元素應(yīng)用的動(dòng)畫
  • DISAPPEARING      當(dāng)一個(gè)元素變?yōu)镮nVisible時(shí)對(duì)其應(yīng)用的動(dòng)畫
  • CHANGE_DISAPPEARING 當(dāng)一個(gè)元素變?yōu)镚one時(shí),因系統(tǒng)要重新布局有一些元素需要移動(dòng),這些要移動(dòng)的元素應(yīng)用的動(dòng)畫 disappearing from the container.

  第二個(gè)參數(shù)為一Animator。

mTransitioner.setStagger(LayoutTransition.CHANGE_APPEARING, 30);

  此函數(shù)設(shè)置動(dòng)畫持續(xù)時(shí)間,參數(shù)分別為類型與時(shí)間。

3.8 Keyframes

  keyFrame是一個(gè) 時(shí)間/值 對(duì),通過(guò)它可以定義一個(gè)在特定時(shí)間的特定狀態(tài),而且在兩個(gè)keyFrame之間可以定義不同的Interpolator,就相當(dāng)多個(gè)動(dòng)畫的拼接,第一個(gè)動(dòng) 畫的結(jié)束點(diǎn)是第二個(gè)動(dòng)畫的開始點(diǎn)。KeyFrame是抽象類,要通過(guò)ofInt(),ofFloat(),ofObject()獲得適當(dāng)?shù)?KeyFrame,然后通過(guò)PropertyValuesHolder.ofKeyframe獲得PropertyValuesHolder對(duì)象,如以下 例子:

Keyframe kf0 = Keyframe.ofInt(0, 400);
Keyframe kf1 = Keyframe.ofInt(0.25f, 200);
Keyframe kf2 = Keyframe.ofInt(0.5f, 400);
Keyframe kf4 = Keyframe.ofInt(0.75f, 100);
Keyframe kf3 = Keyframe.ofInt(1f, 500);
PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe("width", kf0, kf1, kf2, kf4, kf3);
ObjectAnimator rotationAnim = ObjectAnimator.ofPropertyValuesHolder(btn2, pvhRotation);
rotationAnim.setDuration(2000);

  上述代碼的意思為:設(shè)置btn對(duì)象的width屬性值使其:

  • 開始時(shí) Width=400
  • 動(dòng)畫開始1/4時(shí) Width=200
  • 動(dòng)畫開始1/2時(shí) Width=400
  • 動(dòng)畫開始3/4時(shí) Width=100
  • 動(dòng)畫結(jié)束時(shí) Width=500
  第一個(gè)參數(shù)為時(shí)間百分比,第二個(gè)參數(shù)是在第一個(gè)參數(shù)的時(shí)間時(shí)的屬性值。
  定義了一些Keyframe后,通過(guò)PropertyValuesHolder類的方法ofKeyframe封裝,然后通過(guò)ObjectAnimator.ofPropertyValuesHolder獲得Animator。
  用下面的代碼可以實(shí)現(xiàn)同樣的效果:
ObjectAnimator oa=ObjectAnimator.ofInt(btn2, "width", 400,200,400,100,500);
oa.setDuration(2000);
oa.start();

3.9 Animating Views

  在View Animation中,對(duì)View應(yīng)用Animation并沒(méi)有改變View的屬性,動(dòng)畫的實(shí)現(xiàn)是通過(guò)其Parent View實(shí)現(xiàn)的,在View被drawn時(shí)Parents View改變它的繪制參數(shù),draw后再改變參數(shù)invalidate,這樣雖然View的大小或旋轉(zhuǎn)角度等改變了,但View的實(shí)際屬性沒(méi)變,所以有效 區(qū)域還是應(yīng)用動(dòng)畫之前的區(qū)域,比如你把一按鈕放大兩倍,但還是放大這前的區(qū)域可以觸發(fā)點(diǎn)擊事件。為了改變這一點(diǎn),在Android 3.0中給View增加了一些參數(shù)并對(duì)這些參數(shù)增加了相應(yīng)的getter/setter函數(shù)(ObjectAnimator要用這些函數(shù)改變這些屬性):

  • translationX,translationY:轉(zhuǎn)換坐標(biāo)(control where the View is located as a delta from its left and top coordinates which are set by its layout container.)
  • rotation,rotationX,rotationY:旋轉(zhuǎn),rotation用于2D旋轉(zhuǎn)角度,3D中用到后兩個(gè)
  • scaleX,scaleY:縮放
  • x,y:View的最終坐標(biāo)(utility properties to describe the final location of the View in its container, as a sum of the left and top values and translationX and translationY values.)
  • alpha:透明度
  跟位置有關(guān)的參數(shù)有3個(gè),以X坐標(biāo)為例,可以通過(guò)getLeft(),getX(),getTranslateX()獲得,若有一Button btn2,布局時(shí)其坐標(biāo)為(40,0):
//應(yīng)用動(dòng)畫之前
btn2.getLeft(); //40
btn2.getX(); //40
btn2.getTranslationX(); //0
//應(yīng)用translationX動(dòng)畫
ObjectAnimator oa=ObjectAnimator.ofFloat(btn2,"translationX", 200);
oa.setDuration(2000);
oa.start();
/*應(yīng)用translationX動(dòng)畫后
btn2.getLeft(); //40
btn2.getX(); //240
btn2.getTranslationX(); //200
*/
//應(yīng)用X動(dòng)畫,假設(shè)沒(méi)有應(yīng)用之前的translationX動(dòng)畫
ObjectAnimator oa=ObjectAnimator.ofFloat(btn2, "x", 200);
oa.setDuration(2000);
oa.start();
/*應(yīng)用X動(dòng)畫后
btn2.getLeft(); //40
btn2.getX(); //200
btn2.getTranslationX(); //160
*/
  無(wú)論怎樣應(yīng)用動(dòng)畫,原來(lái)的布局時(shí)的位置通過(guò)getLeft()獲得,保持不變;
  X是View最終的位置;
  translationX為最終位置與布局時(shí)初始位置這差。
  所以若就用translationX即為在原來(lái)基礎(chǔ)上移動(dòng)多少,X為最終多少
  getX()的值為getLeft()與getTranslationX()的和
  對(duì)于X動(dòng)畫,源代碼是這樣的:
case X:
info.mTranslationX = value - mView.mLeft;
break;

  Property Animation也可以在XML中定義

  • <set> - AnimatorSet
  • <animator> - ValueAnimator
  • <objectAnimator> - ObjectAnimator
  XML文件應(yīng)放大/res/animator/中,通過(guò)以下方式應(yīng)用動(dòng)畫:
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext, R.anim.property_animator);
set.setTarget(myObject);
set.start();

3.10 ViewPropertyAnimator

  如果需要對(duì)一個(gè)View的多個(gè)屬性進(jìn)行動(dòng)畫可以用ViewPropertyAnimator類,該類對(duì)多屬性動(dòng)畫進(jìn)行了優(yōu)化,會(huì)合并一些invalidate()來(lái)減少刷新視圖,該類在3.1中引入。

  以下兩段代碼實(shí)現(xiàn)同樣的效果: 

PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x", 50f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("y", 100f);
ObjectAnimator.ofPropertyValuesHolder(myView, pvhX, pvyY).start();

 

myView.animate().x(50f).y(100f);



分類: android
標(biāo)簽: android, animation
0
0
(請(qǐng)您對(duì)文章做出評(píng)價(jià))
« 博主前一篇:Android 2.0以后的Contacts API--ContactsContract
» 博主后一篇:Android Touch事件
posted @ 2011-12-02 17:16 AngelDevil 閱讀(2755) 評(píng)論(3) 編輯 收藏

發(fā)表評(píng)論
 回復(fù) 引用 查看   
#1樓2011-12-05 11:16 | qianqianlianmeng      
寫的很不錯(cuò)哈!!!不知道如何才能聯(lián)系上 作者呢??
 回復(fù) 引用 查看   
#2樓[樓主]2011-12-05 11:52 | AngelDevil      
@qianqianlianmeng
都是SDK上的嘛,簡(jiǎn)易翻譯吧

 回復(fù) 引用 查看   
#3樓2012-01-18 09:25 | vanezkw      
好文章。
posted on 2012-03-06 01:42 小果子 閱讀(1361) 評(píng)論(0)  編輯 收藏 引用

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲高清三级视频| 亚洲视频综合| 久久久免费精品| 这里是久久伊人| 在线观看日韩av电影| 国产精品jvid在线观看蜜臀| 美国成人毛片| 久久久精品国产免大香伊| 一片黄亚洲嫩模| 91久久国产综合久久| 久久一区国产| 性欧美大战久久久久久久免费观看| 99精品欧美| 亚洲精品美女久久7777777| 国外成人在线| 国产亚洲成人一区| 国产精品一区二区三区四区| 欧美日韩一区二区视频在线| 欧美成人激情在线| 久久亚洲精品一区二区| 欧美中文字幕不卡| 校园春色国产精品| 欧美一级电影久久| 亚洲一区国产| 国产精品日本欧美一区二区三区| 欧美激情第1页| 欧美护士18xxxxhd| 欧美第一黄网免费网站| 欧美a级一区二区| 亚洲视频一二| 中文日韩电影网站| 亚洲天堂成人| 亚洲欧美中文日韩v在线观看| 亚洲一区二区三区四区在线观看| 日韩一级大片在线| 一本色道久久综合亚洲精品小说| 亚洲精品一区二区三区av| 亚洲国产一区在线观看| 亚洲国内自拍| 亚洲精品乱码久久久久久按摩观| 亚洲欧洲一区二区天堂久久 | 久久成人免费电影| 性久久久久久久| 久久精品99无色码中文字幕| 久久精品五月婷婷| 欧美在线观看视频| 久久久久久久网| 欧美国产日韩一区二区三区| 欧美高清不卡| 亚洲黑丝在线| 在线视频中文亚洲| 亚洲欧美国产毛片在线| 欧美制服第一页| 欧美激情精品久久久久久黑人| 欧美成人一区二区三区| 亚洲电影在线播放| 在线视频你懂得一区| 午夜精品福利视频| 久久人人97超碰国产公开结果| 久久亚洲春色中文字幕| 欧美激情精品久久久久久黑人 | 黑人巨大精品欧美黑白配亚洲| 红桃视频国产精品| 亚洲精选大片| 亚洲欧美综合精品久久成人 | 亚洲狠狠婷婷| 中文精品99久久国产香蕉| 欧美一区二区三区在线播放| 久久久夜夜夜| 国产精品mm| 在线观看亚洲| 亚洲午夜一区二区三区| 欧美一区二区免费视频| 欧美顶级大胆免费视频| 日韩亚洲欧美一区| 欧美一区二区私人影院日本 | 亚洲国产成人高清精品| 一区二区三区日韩欧美精品| 裸体一区二区| 99精品黄色片免费大全| 久久精品国产99| 欧美日韩99| 一区在线视频观看| 在线午夜精品自拍| 久久综合伊人77777麻豆| 日韩视频在线免费| 久久久久久国产精品一区| 欧美日韩在线视频首页| 黄色亚洲大片免费在线观看| 亚洲午夜电影网| 牛牛国产精品| 久久久久久久网站| 99国产精品久久久久老师| 久久―日本道色综合久久| 欧美视频免费| 亚洲片在线观看| 久久久久久国产精品一区| 亚洲免费观看在线视频| 老司机一区二区| 国产亚洲va综合人人澡精品| 亚洲夜间福利| 亚洲国产精品一区二区尤物区| 午夜精品久久久久久久男人的天堂 | 久久综合九色99| 亚洲一区成人| 欧美日韩在线免费| 亚洲精品国产日韩| 麻豆精品传媒视频| 午夜视频一区二区| 国产精品jizz在线观看美国 | 久久综合国产精品| 亚洲免费在线观看视频| 欧美午夜在线一二页| 一区二区三区四区五区精品视频| 欧美风情在线| 久久久久国产成人精品亚洲午夜| 国产麻豆综合| 欧美一区三区二区在线观看| 一本色道久久综合一区| 欧美日韩亚洲免费| 一本色道久久综合亚洲精品高清| 欧美激情国产日韩| 久久婷婷国产综合精品青草| 国内久久视频| 久久综合成人精品亚洲另类欧美| 久久9热精品视频| 国产日韩欧美高清免费| 欧美一区二区成人| 午夜精品理论片| 国产精品自拍小视频| 欧美一级在线视频| 亚洲欧美欧美一区二区三区| 国产精品永久免费视频| 欧美在线综合| 久久精品30| 亚洲国产精品va在看黑人| 欧美黄色小视频| 欧美激情综合亚洲一二区| 亚洲精品乱码久久久久久蜜桃麻豆 | 久久精品国产精品亚洲综合 | 欧美1区视频| 亚洲精品影院| 日韩网站在线| 国产女人精品视频| 久久精品亚洲国产奇米99| 久久国产毛片| 亚洲国产欧美一区二区三区同亚洲 | 久久精品一级爱片| 亚洲国产精品传媒在线观看| 亚洲免费电影在线| 一区二区不卡在线视频 午夜欧美不卡在| 欧美日韩亚洲视频| 性欧美精品高清| 久久精品欧美日韩| 最新69国产成人精品视频免费 | 欧美成人免费网站| 欧美国产国产综合| 亚洲综合电影一区二区三区| 午夜亚洲一区| 亚洲国产日韩欧美综合久久| 亚洲精品社区| 国产欧美一区二区三区久久| 麻豆精品一区二区综合av| 欧美国产精品劲爆| 亚洲综合色网站| 久久久久久夜精品精品免费| 日韩天堂在线观看| 亚洲欧美激情精品一区二区| 伊人久久亚洲热| 亚洲私拍自拍| 久久精品国产77777蜜臀| aa级大片欧美| 欧美一区=区| 一区二区欧美在线| 欧美一区二区三区在| 亚洲免费电影在线观看| 欧美影院成人| 在线综合+亚洲+欧美中文字幕| 午夜视频在线观看一区二区三区| 亚洲三级国产| 羞羞视频在线观看欧美| 亚洲精品美女久久久久| 欧美一乱一性一交一视频| 亚洲免费电影在线| 美女国产一区| 国产精品国码视频| 欧美国产一区二区在线观看 | 欧美一区二区视频在线观看| 一区二区三区高清在线| 欧美亚洲综合网| 亚洲视频在线观看三级| 久久天堂成人| 欧美一级午夜免费电影| 欧美精品一区二区三区蜜臀| 久久全球大尺度高清视频| 国产精品成人免费| 亚洲国产一区视频| 亚洲夫妻自拍| 欧美在线高清| 欧美一区二区三区在线|