Android動(dòng)畫(huà)框架,讓平移動(dòng)畫(huà)更添魅力
使用ObjectAnimator
ObjectAnimator是Android3.0引入的一個(gè)強(qiáng)大的動(dòng)畫(huà)框架,用于對(duì)任何對(duì)象的屬性進(jìn)行動(dòng)畫(huà)處理。可以使用ObjectAnimator來(lái)改變View的translationX和translationY屬性來(lái)實(shí)現(xiàn)View的平移動(dòng)畫(huà)。
View view = findViewById(R.id.view);
ObjectAnimator animatorX = ObjectAnimator.ofFloat(view, "translationX", 0f, 100f); // 平移X軸
ObjectAnimator animatorY = ObjectAnimator.ofFloat(view, "translationY", 0f, 50f); // 平移Y軸
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(animatorX).with(animatorY); // 同時(shí)執(zhí)行X軸和Y軸動(dòng)畫(huà)
animatorSet.setDuration(1000); // 設(shè)置動(dòng)畫(huà)時(shí)長(zhǎng)
animatorSet.start(); // 開(kāi)始動(dòng)畫(huà)
使用ValueAnimator
ValueAnimator是一個(gè)更底層的動(dòng)畫(huà)框架,可以在動(dòng)畫(huà)過(guò)程中生成一系列的值,然后使用這些值來(lái)更新View的屬性。對(duì)于平移動(dòng)畫(huà),通過(guò)監(jiān)聽(tīng)ValueAnimator的值變化更新View的translationX和translationY屬性。
ValueAnimator animator = ValueAnimator.ofFloat(0f, 100f); // 生成0到100的值
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value = (float) animation.getAnimatedValue();
view.setTranslationX(value); // 更新View的X軸位置
}
});
animator.setDuration(1000);
animator.start();
使用ViewPropertyAnimator
從Android 3.0開(kāi)始,View類提供了一個(gè)animate()方法,返回一個(gè)ViewPropertyAnimator對(duì)象,可以用來(lái)鏈?zhǔn)秸{(diào)用多個(gè)動(dòng)畫(huà)方法。
view.animate()
.translationX(100f) // 平移X軸
.translationY(50f) // 平移Y軸
.setDuration(1000) // 設(shè)置動(dòng)畫(huà)時(shí)長(zhǎng)
.start(); // 開(kāi)始動(dòng)畫(huà)
使用XML動(dòng)畫(huà)
可以在XML文件中定義動(dòng)畫(huà),并在需要時(shí)加載并應(yīng)用這些動(dòng)畫(huà)。
<!-- res/anim/translate_animation.xml -->
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0%p"
android:toXDelta="100%p"
android:fromYDelta="0%p"
android:toYDelta="50%p"
android:duration="1000"/>
</set>
Animation animation = AnimationUtils.loadAnimation(this, R.anim.translate_animation);
view.startAnimation(animation);
注意:使用startAnimation()方法時(shí),View的位置在動(dòng)畫(huà)結(jié)束后會(huì)重置為原始位置,除非在動(dòng)畫(huà)結(jié)束時(shí)手動(dòng)更新View的位置。如果希望View在動(dòng)畫(huà)結(jié)束后保持在最終位置,可以考慮使用前面提到的ObjectAnimator、ValueAnimator或ViewPropertyAnimator方法。
使用drawBitmap
通過(guò)drawBitmap在不同的位置畫(huà)出圖片,適合圖片作為平移動(dòng)畫(huà)的需求。
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.image);
int width = ScreenUtils.getScreenWidth() - bitmap.getWidth();
//int height = bitmap.getHeight();
//繪制原圖
//canvas.drawBitmap(bitmap, 0, 0, paint);
canvas.drawBitmap(bitmap, progress * width / 100, 0, null);
//平移圖片
Matrix matrix = new Matrix();
matrix.postTranslate(progress * width / 100, height);
canvas.drawBitmap(bitmap, matrix, null);