傳統(tǒng)的Animation
動(dòng)畫雖然使用方便,但是不適合做具有交互性的動(dòng)畫效果,僅僅適合做展示性的動(dòng)畫,而Animator
,屬性動(dòng)畫,是改變了該view
的內(nèi)部屬性,適合有交互功能的動(dòng)畫。
代碼:
//第一個(gè)參數(shù),動(dòng)畫的對(duì)象,第二個(gè)參數(shù),需要改變的動(dòng)畫屬性,后邊參數(shù),變化的具體值(像素)//若寫多個(gè),則動(dòng)畫會(huì)同時(shí)實(shí)行,此例中即旋轉(zhuǎn)360°的同時(shí)向x軸和y軸平移ObjectAnimator.ofFloat(iv, "rotation", 0f, 360f).setDuration(1000).start();ObjectAnimator.ofFloat(iv, "translationX", 0f, 200f).setDuration(1000).start();ObjectAnimator.ofFloat(iv, "translationY", 0f, 200f).setDuration(1000).start();可用的屬性有
屬性名 | 含義 |
---|---|
translationX和translationY | x軸和y軸的偏移量 |
rotation、rotationX和rotationY | 圍繞支點(diǎn)旋轉(zhuǎn) |
scaleX和scaleY | 縮放 |
pivotX和pivotY | 控制著view對(duì)象的支點(diǎn)位置,圍繞該支點(diǎn)旋轉(zhuǎn)縮放處理,默認(rèn)是view中心點(diǎn) |
alpha | 透明度 |
代碼:
//效果同上,但動(dòng)畫效果做了優(yōu)化,而且更有效率PropertyValuesHolder p1 = PropertyValuesHolder.ofFloat("rotation", 0f, 360f);PropertyValuesHolder p2 = PropertyValuesHolder.ofFloat("translationX", 0f, 200f);PropertyValuesHolder p3 = PropertyValuesHolder.ofFloat("translationY", 0f, 200f);//調(diào)用ofPropertyValuesHolder方法傳入要?jiǎng)赢嫷目丶蚉ropertyValuesHolderObjectAnimator.ofPropertyValuesHolder(iv, p1, p2, p3).setDuration(1000).start();提供了更多的動(dòng)畫控制效果
代碼:
ObjectAnimator animator1 = ObjectAnimator.ofFloat(iv, "rotation", 0f, 360f);ObjectAnimator animator2 = ObjectAnimator.ofFloat(iv, "translationX", 0f, 200f);ObjectAnimator animator3 = ObjectAnimator.ofFloat(iv, "translationY", 0f, 200f);AnimatorSet set = new AnimatorSet();set.playTogether(animator1, animator2, animator3);//同時(shí)執(zhí)行// set.playSequentially(animator1, animator2, animator3); //按順序執(zhí)行set.setDuration(1000);set.start();還可以先x軸和y軸同時(shí)平移,最后才旋轉(zhuǎn)
代碼:
//將set.playTogether()替換為如下代碼set.play(animator2).with(animator3);//with表示同時(shí)一起執(zhí)行set.play(animator1).after(animator2);//after 2 或者 3 都可以代碼:
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv, "alpha", 0f, 1f);objectAnimator.setDuration(1000);//添加adapter來(lái)只監(jiān)聽某個(gè)事件或者如下注釋的全部監(jiān)聽objectAnimator.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); Toast.makeText(getapplicationContext(), "別點(diǎn)了!", Toast.LENGTH_LONG).show(); }});// objectAnimator.addListener(new Animator.AnimatorListener() {// @Override// public void onAnimationStart(Animator animation) {//// }//// @Override// public void onAnimationEnd(Animator animation) {// Toast.makeText(getApplicationContext(), "別點(diǎn)了!", Toast.LENGTH_LONG).show();// }//// @Override// public void onAnimationCancel(Animator animation) {//// }//// @Override// public void onAnimationRepeat(Animator animation) {//// }// });objectAnimator.start();ValueAnimator
可以當(dāng)做數(shù)值發(fā)生器,生產(chǎn)具有一定規(guī)律的數(shù)字,從而來(lái)控制動(dòng)畫的過程。
例如:
代碼:按鈕的點(diǎn)擊事件中,設(shè)置ValueAnimator
ValueAnimator animator = ValueAnimator.ofInt(0, 100);animator.setDuration(5000);animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { //獲取動(dòng)畫過程中的value(上邊定義的0~100),用以其他邏輯,例如設(shè)置文字 Integer value = (Integer) animation.getAnimatedValue(); bt.setText("" + value); }});animator.start();View
直接就有animate()
方法,用以直接驅(qū)動(dòng)簡(jiǎn)單的屬性動(dòng)畫
代碼:
bt_time.animate() .alpha(0). setDuration(1000). withStartAction(new Runnable() { @Override public void run() { } }) .withEndAction(new Runnable() { @Override public void run() { } }) .start();新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注