Android動畫框架,讓平移動畫更添魅力
使用ObjectAnimator
ObjectAnimator是Android3.0引入的一個強大的動畫框架,用于對任何對象的屬性進行動畫處理??梢允褂肙bjectAnimator來改變View的translationX和translationY屬性來實現(xiàn)View的平移動畫。
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); // 同時執(zhí)行X軸和Y軸動畫
animatorSet.setDuration(1000); // 設(shè)置動畫時長
animatorSet.start(); // 開始動畫
使用ValueAnimator
ValueAnimator是一個更底層的動畫框架,可以在動畫過程中生成一系列的值,然后使用這些值來更新View的屬性。對于平移動畫,通過監(jiān)聽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開始,View類提供了一個animate()方法,返回一個ViewPropertyAnimator對象,可以用來鏈?zhǔn)秸{(diào)用多個動畫方法。
view.animate()
.translationX(100f) // 平移X軸
.translationY(50f) // 平移Y軸
.setDuration(1000) // 設(shè)置動畫時長
.start(); // 開始動畫
使用XML動畫
可以在XML文件中定義動畫,并在需要時加載并應(yīng)用這些動畫。
<!-- 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()方法時,View的位置在動畫結(jié)束后會重置為原始位置,除非在動畫結(jié)束時手動更新View的位置。如果希望View在動畫結(jié)束后保持在最終位置,可以考慮使用前面提到的ObjectAnimator、ValueAnimator或ViewPropertyAnimator方法。
使用drawBitmap
通過drawBitmap在不同的位置畫出圖片,適合圖片作為平移動畫的需求。
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);