View動畫、幀動畫、屬性動畫
阿新 • • 發佈:2019-02-05
轉載請註明出處,謝謝
View動畫:
1、View可以使用程式碼來設定也可以使用xml檔案來設定,在xml檔案裡面對應的標籤為: <translate>…………</translate>:用於平移 <scale>…………</scale>:用於縮放<rotate>…………</rotate>:用於旋轉
<alpha>…………</alpha>:用於透明度的變化
上程式碼:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:shareInterpolator="true"> <translate android:fromXDelta="0" android:toXDelta="100" android:fromYDelta="0" android:toYDelta="100" android:duration="100" /> <rotate android:fromDegrees="0" android:toDegrees="270" android:duration="300" android:pivotX="0" android:pivotY="0" /> <alpha android:fromAlpha="0" android:toAlpha="1" /> <scale android:fromXScale="20" android:toXScale="100" android:fromYScale="40" android:toYScale="80" android:pivotY="20" android:pivotX="40" /> </set>
程式碼控制分別為Animation的4個子類:TranslateAnimation、ScaleAnimation、RotateAnimation、AlphaAnimation 程式碼也可以實現動畫:
mAlphaAnimation = new AlphaAnimation(0, 1);
mAlphaAnimation.setDuration(200);
mMenu.startAnimation(mAlphaAnimation);<span> </span>
2、程式碼中獲取xml中的View動畫 動畫物件=AnimationUtils.load(上下文,R.anim.動畫檔案的名字); 執行動畫的物件.startAnimation(動畫物件); 上程式碼:
mMenu = (SlidingMenu) findViewById(R.id.id_menu); mAnimation = AnimationUtils.loadAnimation(this, R.anim.animation_set); mMenu.startAnimation(mAnimation); mAnimation.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } });
3、監聽View動畫 View動畫的監聽使用setAnimationListener 4、View動畫的特殊使用場景 在ViewGroup中控制元素的進出效果,在控制元件的屬性中加上layoutAnimation就可以,也可以在程式碼中設定 listView.setLayoutAnimation(new LayoutAnimationController(AnimationUtils.loadAnimation(上下文,R.anim.anim_item))); 當然還有Acticity預設的切換效果:使用overridePendingTransition(Acticity被開啟的的動畫的ID,Acticity被關閉下的動畫的id); 這個方法必須在startActivity或者finish的後面,否則起不到效果。
幀動畫(AnimationDrawable)
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<!--oneshot:代表是否執行一次-->
<item android:drawable="@drawable/ic"
android:duration="500"
/>
<item android:drawable="@drawable/ic_launcher"
android:duration="500"
/>
<item android:drawable="@drawable/ic_action_github"
android:duration="500"
/>
<item android:drawable="@drawable/img_1"
android:duration="500"
/>
</animation-list>
獲取xml中的動畫: 執行動畫的物件.setBackgroundResource(R.drawable.動畫的檔名); 幀動畫的物件.執行動畫的物件.getBackground(); 幀動畫物件.start(); 上程式碼:
mMenu.setBackgroundResource(R.drawable.frame_animation);
mBackground = (AnimationDrawable)mMenu.getBackground();
mBackground.start();
幀動畫有個缺點就是比較容易導致OOM。
屬性動畫
ValueAnimator、ObjectAnimator、AnimatorSet…… mAnimatorSet = new AnimatorSet();
mAnimatorSet.playTogether(ObjectAnimator.ofFloat(mMenu,"rotationX",0,360),
ObjectAnimator.ofFloat(mMenu,"rotationY",0,180),
ObjectAnimator.ofFloat(mMenu,"ratation",0,-90),
ObjectAnimator.ofFloat(mMenu,"scaleX",1,1.5f),
ObjectAnimator.ofFloat(mMenu,"scaleY",1,0.5f),
ObjectAnimator.ofFloat(mMenu,"alpha",1,0.25f,1));
mAnimatorSet.setDuration(5*1000).start();
使用方法:ObjectAniamtor.ofFloat(執行動畫的物件,“動畫的屬性”,-myObject.getHeight()).start(); 也可以使用xml中的屬性動畫 呼叫xml中的屬性動畫:set=(AnimatorInflater.loadAnimator(上下文,動畫的id)); set.setTarget(mButton); set.start(); 監聽屬性動畫:
ObjectAnimator.ofFloat(mMenu, "rotationX", 0, 360).addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
}
});