1. 程式人生 > >三種動畫效果(Frame, View, Property)實現

三種動畫效果(Frame, View, Property)實現

> 動畫效果(Frame, View, Property)的區別:

動畫通過不斷的呼叫OnDraw方法來進行UI的繪製,而屬性動畫一般只調用ViewGroup進行繪製。

ViewGroup的繪製:
ViewGroup通常是不需要繪製的,因為本身就沒有需要繪製的東西。
如果不是指定ViewGroup的背景色,那麼ViewGroup的o'nDraw方法都不會被呼叫。
ViewGroup會使用dispatchDraw()方法繪製子View,其過程是遍歷子View,呼叫子View的繪製方法進行繪製。

-- Frame/View/Property,是哪些版本加入的,並向前相容??組合動畫?純Java程式碼或XML與Java實現??


Android動畫- http://blog.csdn.net/q4878802/article/category/5671159
Android 用Animation-list實現逐幀動畫:http://blog.csdn.net/aminfo/article/details/7847761
Android開發—View動畫、幀動畫和屬性動畫詳解-- http://blog.csdn.net/SEU_Calvin/article/details/52724655
Android動畫之一,Drawable Animation: http://blog.csdn.net/chziroy/article/details/40424343
Android動畫效果translate、scale、alpha、rotate詳解- http://blog.csdn.net/sun6255028/article/details/6735025
Android開發--圖形影象與動畫(二)--Animation實現影象的 漸變、縮放、位移、旋轉- http://blog.csdn.net/dlutbrucezhang/article/details/8543708
 

> 動畫示例如下:

package com.desaco.differentanimation.frame_animation;
import com.desaco.differentanimation.R;
import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.ImageView;

public class FrameAnimationActivity extends Activity {
private ImageView animationIV;
private Button buttonA, buttonB, buttonC;
private AnimationDrawable animationDrawable;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_frame_animation);

animationIV = (ImageView) findViewById(R.id.animationIV);
buttonA = (Button) findViewById(R.id.buttonA);
buttonB = (Button) findViewById(R.id.buttonB);
buttonC = (Button) findViewById(R.id.buttonC);
// 順序顯示
buttonA.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
animationIV.setImageResource(R.drawable.frame_order_animation);
animationDrawable = (AnimationDrawable) animationIV
.getDrawable();
animationDrawable.start();
}


});
// 停止
buttonB.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
animationDrawable = (AnimationDrawable) animationIV
.getDrawable();
animationDrawable.stop();
}


});
// 倒序顯示
buttonC.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
animationIV
.setImageResource(R.drawable.frame_reverse_animation);
animationDrawable = (AnimationDrawable) animationIV
.getDrawable();
animationDrawable.start();
}
});
}

}

 > frame_order_animation.xml

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true" >
    <item
        android:drawable="@drawable/wifi_0"
        android:duration="150">
    </item>
    <item
        android:drawable="@drawable/wifi_1"
        android:duration="150">
    </item>
    <item
        android:drawable="@drawable/wifi_2"
        android:duration="150">
    </item>
    <item
        android:drawable="@drawable/wifi_3"
        android:duration="150">
    </item>
    <item
        android:drawable="@drawable/wifi_4"
        android:duration="150">
    </item>
    <item
        android:drawable="@drawable/wifi_5"
        android:duration="150">
    </item>
</animation-list>

> frame_reverse_animation.xml

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true" >


    <item
        android:drawable="@drawable/wifi_5"
        android:duration="150">
    </item>
    <item
        android:drawable="@drawable/wifi_4"
        android:duration="150">
    </item>
    <item
        android:drawable="@drawable/wifi_3"
        android:duration="150">
    </item>
    <item
        android:drawable="@drawable/wifi_2"
        android:duration="150">
    </item>
    <item
        android:drawable="@drawable/wifi_1"
        android:duration="150">
    </item>
    <item
        android:drawable="@drawable/wifi_0"
        android:duration="150">
    </item>


</animation-list>

AlphaAnimation:透明度(alpha)漸變效果,對應<alpha/>標籤。
TranslateAnimation:位移漸變,需要指定移動點的開始和結束座標,對應<translate/>標籤。
ScaleAnimation:縮放漸變,可以指定縮放的參考點,對應<scale/>標籤。
RotateAnimation:旋轉漸變,可以指定旋轉的參考點,對應<rotate/>標籤。
AnimationSet:組合漸變,支援組合多種漸變效果,對應<set/>標籤。

> 動畫

import android.view.animation.Animation


Animation ivAnimation = AnimationUtils.loadAnimation(this,
                R.anim.dash_scale);
Animation ivAnimation = AnimationUtils.loadAnimation(this,
                R.anim.dash_scale);
        ImageView imageView = (ImageView) favourView
                .findViewById(R.id.iv_favour);
        imageView.setImageResource(R.drawable.xf_comment_like_c);
        imageView.startAnimation(ivAnimation);

<?xml version="1.0" encoding="utf-8"?>
<set
  xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha android:duration="200" android:pivotX="50.0%" android:pivotY="75.0%" android:fromAlpha="0.0" android:toAlpha="1.0" />
    <scale android:duration="200" android:pivotX="50.0%" android:pivotY="75.0%" android:fromXScale="0.38" android:toXScale="1.1" android:fromYScale="0.38" android:toYScale="1.1" />
    <scale android:duration="240" android:pivotX="50.0%" android:pivotY="75.0%" android:startOffset="200" android:fromXScale="1.1" android:toXScale="0.85" android:fromYScale="1.1" android:toYScale="0.85" />
    <scale android:duration="160" android:pivotX="50.0%" android:pivotY="75.0%" android:startOffset="440" android:fromXScale="0.95" android:toXScale="1.07" android:fromYScale="0.95" android:toYScale="1.07" />
</set>

------------------------------------------

/*
     * 載入中
     */
    protected void MyPostExecuteProgress() {
        AlphaAnimation animation = new AlphaAnimation(1.0f, 0.0f);
        animation.setDuration(400);
        in_xf_huxing_progress.startAnimation(animation);
        animation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                // 動畫結束時執行此方法
                progress.setVisibility(View.GONE);
            }
        });
    }

----------------------------------------------------------------

> 屬性動畫,SDK3.0加入的

// 1.屬性動畫-旋轉Rotate
// 動畫實際執行  
    private void startPropertyAnim() {  
        // 第二個引數"rotation"表明要執行旋轉  
        // 0f -> 360f,從旋轉360度,也可以是負值,負值即為逆時針旋轉,正值是順時針旋轉。  
        ObjectAnimator anim = ObjectAnimator.ofFloat(text, "rotation", 0f, 360f);  
        // 動畫的持續時間,執行多久?  
        anim.setDuration(5000);   
        // 回撥監聽  
        anim.addUpdateListener(new AnimatorUpdateListener() {  
  
            @Override  
            public void onAnimationUpdate(ValueAnimator animation) {  
                float value = (Float) animation.getAnimatedValue();  
                Log.d("zhangphil", value + "");  
            }  
        });  
  
        // 正式開始啟動執行動畫  
        anim.start();  
    } 

// 2.透明度漸變屬性動畫,此處將實現屬性動畫的動畫實際執行  
    private void startPropertyAnim() {  
        // 將直接把TextView這個view物件的透明度漸變。  
        // 注意第二個引數:"alpha",指明瞭是透明度漸變屬性動畫  
        // 透明度變化從1—>0.1—>1—>0.5—>1,TextView物件經歷4次透明度漸變  
        ObjectAnimator anim = ObjectAnimator.ofFloat(text, "alpha", 1f, 0.1f, 1f, 0.5f, 1f);  
  
        anim.setDuration(5000);// 動畫持續時間  
  
        // 這裡是一個回撥監聽,獲取屬性動畫在執行期間的具體值  
        anim.addUpdateListener(new AnimatorUpdateListener() {  
  
            @Override  
            public void onAnimationUpdate(ValueAnimator animation) {  
                float value = (Float) animation.getAnimatedValue();  
                Log.d("zhangphil", value + "");  
            }  
        });  
  
        anim.start();  
    }  

// 3.位移動畫,translationX,translationY
    private void startPropertyAnim() {  
        // X軸方向上的座標  
        float translationX = text.getTranslationX();  
  
        // 向右移動500pix,然後再移動到原來的位置復原。  
        // 引數“translationX”指明在x座標軸位移,即水平位移。  
        ObjectAnimator anim = ObjectAnimator.ofFloat(text, "translationX", translationX, -500f, translationX);  
  
        anim.setDuration(5000);  
  
        // 回撥監聽,可以有也可以無。  
        // 根據情況,如果需要監聽動畫執行到何種“進度”,那麼就監聽之。  
        anim.addUpdateListener(new AnimatorUpdateListener() {  
  
            @Override  
            public void onAnimationUpdate(ValueAnimator animation) {  
                float value = (Float) animation.getAnimatedValue();  
                Log.d("zhangphil", value + "");  
            }  
        });  
  
        // 正式開始啟動執行動畫  
        anim.start();  
    } 


// 4.scale縮放動畫 ,scaleX,scaleY,
 public void propertyValuesHolder(View view) {
        PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("alpha", 1f, 0f, 1f);
        PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleX", 1f, 0, 1f);
        PropertyValuesHolder pvhZ = PropertyValuesHolder.ofFloat("scaleY", 1f, 0, 1f);
        ObjectAnimator.ofPropertyValuesHolder(view, pvhX, pvhY, pvhZ).setDuration(1000).start();
    }

// 動畫實際執行  
    private void startPropertyAnim() {  
        // 將一個TextView沿垂直方向先從原大小(1f)放大到5倍大小(5f),然後再變回原大小。  
        ObjectAnimator anim = ObjectAnimator.ofFloat(text, "scaleY", 1f, 5f, 1f);  
        anim.setDuration(5000);  
        // 回撥監聽,可以有也可以無。  
        // 根據情況,如果需要監聽動畫執行到何種“進度”,那麼就監聽之。  
        anim.addUpdateListener(new AnimatorUpdateListener() {  
            @Override  
            public void onAnimationUpdate(ValueAnimator animation) {  
                float value = (Float) animation.getAnimatedValue();  
                Log.d("zhangphil", value + "");  
            }  
        });  
        // 正式開始啟動執行動畫  
        anim.start();  
    }

mRotateAnimat.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
//                view.setVisibility(View.GONE);
                view.clearAnimation();
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });