Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 安卓動畫之補間動畫(Tween Animations)

安卓動畫之補間動畫(Tween Animations)

編輯:關於Android編程

Tween動畫,就是對場景裡的對象不斷的進行圖像變化來產生動畫效果(旋轉、平移、放縮和漸變)

使用動畫來進行旋轉、平移、放縮和漸變比通過手動重新繪制Canvas來達到相似效果要消耗更少的資源,實現更簡單

1.創建補間動畫

AlphaAnimation

java:

 

Animation alphaAnimation = new AlphaAnimation(0.1f, 1.0f);  
alphaAnimation.setDuration(3000);  
this.startAnimation(alphaAnimation); 

 

其中AlphaAnimation類第一個參數fromAlpha表示動畫起始時的透明度, 第二個參數toAlpha表示動畫結束時的透明度。

setDuration用來設置動畫持續時間。

xml:

 

  
  
      
 

RotateAnimation

java:

 

Animation rotateAnimation = new RotateAnimation(0f, 360f);  
rotateAnimation.setDuration(1000);  
this.startAnimation(rotateAnimation);

 

其中RotateAnimation類第一個參數fromDegrees表示動畫起始時的角度, 第二個參數toDegrees表示動畫結束時的角度。

另外還可以設置伸縮模式pivotXType、pivotYType, 伸縮動畫相對於x,y 坐標的開始位置pivotXValue、pivotYValue等。

xml:

 

  
  
      

ScaleAnimation

java:

 

Animation scaleAnimation = new ScaleAnimation(0.1f, 1.0f,0.1f,1.0f);  
scaleAnimation.setDuration(500);  
this.startAnimation(scaleAnimation); 

 

 

第一個參數fromX ,第二個參數toX:分別是動畫起始、結束時X坐標上的伸縮尺寸。

第三個參數fromY ,第四個參數toY:分別是動畫起始、結束時Y坐標上的伸縮尺寸。

另外還可以設置伸縮模式pivotXType、pivotYType, 伸縮動畫相對於x,y 坐標的開始位置pivotXValue、pivotYValue等。

xml:

 

  
  
         

TranslateAnimation

java:

Animation translateAnimation = new TranslateAnimation(0.1f, 100.0f,0.1f,100.0f);  
translateAnimation.setDuration(1000);  
this.startAnimation(translateAnimation);  

 

第一個參數fromXDelta ,第二個參數toXDelta:分別是動畫起始、結束時X坐標。

第三個參數fromYDelta,第四個參數toYDelta:分別是動畫起始、結束時Y坐標。

xml:

 

  
  
      

 

AnimationSet

java:

translateAnimation = new TranslateAnimation(0.1f, 100.0f,0.1f,100.0f);  
alphaAnimation = new AlphaAnimation(0.1f, 1.0f);   
AnimationSet set = new AnimationSet(true);  
set.addAnimation(translateAnimation);  
set.addAnimation(alphaAnimation);  
set.setDuration(1000);  
this.startAnimation(set);
xml:


    
    透明度漸變
    
    
    

 

2.使用補間動畫

 

動畫資源存放在項目的res/anim文件夾下

如何來使用這些xml文件呢?其實也很簡單,此時需要用到AnimationUtils類。 通過該類中loadAnimation 方法來加載這些布局文件。

 

Animation anim = AnimationUtils.loadAnimation(this.getContext(), R.anim.alpha_anim);
調用View的startAnimation方法,動畫序列只會運行一次,然後停止。但是可以使用動畫或動畫集的setRepeatMode和setRepeatCount修改這種行為。


animation.setRepeatMode(Animation.REVERSE);  
animation.setRepeatCount(Animation.INFINITE); 
view.startAnimation(animation);

3.使用動畫監聽器

動畫還可以添加監聽事件,監聽到動畫的開始,結束和重復

 

mAnimationSet.setAnimationListener(new AnimationListener() {		
			@Override
			public void onAnimationStart(Animation animation) {
				// TODO Auto-generated method stub
			}
			
			@Override
			public void onAnimationRepeat(Animation animation) {
				// TODO Auto-generated method stub
			}
			
			@Override
			public void onAnimationEnd(Animation animation) {
				// TODO Auto-generated method stub
			}
		});

3.為布局和View Group添加動畫

LayoutAnimation

LayoutAnimation可以來為viewGroup添加動畫,並按照順序把一個動畫應用到viewGroup中的每一個子View上

xml:

 


animationOrder,這個是說子view按照什麼順序來執行anim,可以使normal(正常,0-n),reverse(反序,n-0),random(隨機)

 

delay,用於延遲的每個子view的動畫開始動畫持續時間的浮點數。越大間隔越長。0.3或者30%的字樣。

使用動畫是直接在viewGroup布局定義中使用android:LayoutAnimation來完成的

 

android:layoutAnimation="@anim/layout_more_in"
java:
在java中使用LayoutAnimation要借助LayoutAnimationController

 

 

LinearLayout ll = (LinearLayout) findViewById(R.id.ll);  
ScaleAnimation sa = new ScaleAnimation(0, 1, 0, 1);  
sa.setDuration(2000);  
// 第二個參數dely : the delay by which each child's animation must be offset  
LayoutAnimationController lac = new LayoutAnimationController(sa, 0.5F);  
// 設置顯示的順序 這個必須要在dely不為0的時候才有效  
lac.setOrder(LayoutAnimationController.ORDER_NORMAL);  
ll.setLayoutAnimation(lac);

通常情況下,布局動畫會在viewGroup第一次進行布局的時候執行一次,可以通過對viewGroup對象調用scheduleLayoutAnimation強制它再次執行,當viewGroup在下次布局的時候,這個動畫會再次執行

 

 

viewGroup.scheduleLayoutAnimation();

 

LayoutTransition

public class AnimateLayoutTransition extends Activity {  
  
    private LinearLayout ll;  
    private LayoutTransition mTransition = new LayoutTransition();  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.animate_layout_transition);  
  
        ll = (LinearLayout) findViewById(R.id.ll);  
        setupCustomAnimations();  
        ll.setLayoutTransition(mTransition);  
    }  
  
    public void add(View view) {  
        final Button button = new Button(this);  
        ll.addView(button);  
        button.setOnClickListener(new OnClickListener() {  
  
            @Override  
            public void onClick(View arg0) {  
                ll.removeView(button);  
            }  
        });  
    }  
  
    // 生成自定義動畫  
    private void setupCustomAnimations() {  
        // 動畫:CHANGE_APPEARING  
        // Changing while Adding  
        PropertyValuesHolder pvhLeft = PropertyValuesHolder.ofInt("left", 0, 1);  
        PropertyValuesHolder pvhTop = PropertyValuesHolder.ofInt("top", 0, 1);  
        PropertyValuesHolder pvhRight = PropertyValuesHolder.ofInt("right", 0,  
                1);  
        PropertyValuesHolder pvhBottom = PropertyValuesHolder.ofInt("bottom",  
                0, 1);  
        PropertyValuesHolder pvhScaleX = PropertyValuesHolder.ofFloat("scaleX",  
                1f, 0f, 1f);  
        PropertyValuesHolder pvhScaleY = PropertyValuesHolder.ofFloat("scaleY",  
                1f, 0f, 1f);  
  
        final ObjectAnimator changeIn = ObjectAnimator.ofPropertyValuesHolder(  
                this, pvhLeft, pvhTop, pvhRight, pvhBottom, pvhScaleX,  
                pvhScaleY).setDuration(  
                mTransition.getDuration(LayoutTransition.CHANGE_APPEARING));  
        mTransition.setAnimator(LayoutTransition.CHANGE_APPEARING, changeIn);  
        changeIn.addListener(new AnimatorListenerAdapter() {  
            public void onAnimationEnd(Animator anim) {  
                View view = (View) ((ObjectAnimator) anim).getTarget();  
                // View也支持此種動畫執行方式了  
                view.setScaleX(1f);  
                view.setScaleY(1f);  
            }  
        });  
  
        // 動畫:CHANGE_DISAPPEARING  
        // Changing while Removing  
        Keyframe kf0 = Keyframe.ofFloat(0f, 0f);  
        Keyframe kf1 = Keyframe.ofFloat(.9999f, 360f);  
        Keyframe kf2 = Keyframe.ofFloat(1f, 0f);  
        PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe(  
                "rotation", kf0, kf1, kf2);  
        final ObjectAnimator changeOut = ObjectAnimator  
                .ofPropertyValuesHolder(this, pvhLeft, pvhTop, pvhRight,  
                        pvhBottom, pvhRotation)  
                .setDuration(  
                        mTransition  
                                .getDuration(LayoutTransition.CHANGE_DISAPPEARING));  
        mTransition  
                .setAnimator(LayoutTransition.CHANGE_DISAPPEARING, changeOut);  
        changeOut.addListener(new AnimatorListenerAdapter() {  
            public void onAnimationEnd(Animator anim) {  
                View view = (View) ((ObjectAnimator) anim).getTarget();  
                view.setRotation(0f);  
            }  
        });  
  
        // 動畫:APPEARING  
        // Adding  
        ObjectAnimator animIn = ObjectAnimator.ofFloat(null, "rotationY", 90f,  
                0f).setDuration(  
                mTransition.getDuration(LayoutTransition.APPEARING));  
        mTransition.setAnimator(LayoutTransition.APPEARING, animIn);  
        animIn.addListener(new AnimatorListenerAdapter() {  
            public void onAnimationEnd(Animator anim) {  
                View view = (View) ((ObjectAnimator) anim).getTarget();  
                view.setRotationY(0f);  
            }  
        });  
  
        // 動畫:DISAPPEARING  
        // Removing  
        ObjectAnimator animOut = ObjectAnimator.ofFloat(null, "rotationX", 0f,  
                90f).setDuration(  
                mTransition.getDuration(LayoutTransition.DISAPPEARING));  
        mTransition.setAnimator(LayoutTransition.DISAPPEARING, animOut);  
        animOut.addListener(new AnimatorListenerAdapter() {  
            public void onAnimationEnd(Animator anim) {  
                View view = (View) ((ObjectAnimator) anim).getTarget();  
                view.setRotationX(0f);  
            }  
        });  
  
    }  
}  
  過渡的類型一共有四種:
LayoutTransition.APPEARING 當一個View在ViewGroup中出現時,對此View設置的動畫
LayoutTransition.CHANGE_APPEARING當一個View在ViewGroup中出現時,此View對其他View位置造成影響,對其他View設置的動畫
LayoutTransition.DISAPPEARING當一個View在ViewGroup中消失時,對此View設置的動畫
LayoutTransition.CHANGE_DISAPPEARING當一個View在ViewGroup中消失時,此View對其他View位置造成影響,對其他View設置的動畫
LayoutTransition.CHANGE 不是由於View出現或消失造成對其他View位置造成影響,然後對其他View設置的動畫。
注意動畫到底設置在誰身上,此View還是其他View。

AnimateLayoutChanges

ViewGroup的xml屬性中有一個默認的animateLayoutChanges屬性,設置該屬性,可以添加ViewGroup增加view的過渡效果:
  

 

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved