三種動畫效果(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) {
}
});