3個分類
View 動畫袜炕, 屬性動畫锭吨, 幀動畫
View動畫(android 3.0以下使用) TranslateAnimation
只支持4種類型的動畫, 平移(TranslateAnimation), 縮放(ScaleAnimation)傲醉, 旋轉(zhuǎn)(RotateAnimation), 透明度(AlphaAnimation). 因此有些效果實現(xiàn)不了.
4種類型共同的父類是: Animation.
在xml中使用蝇闭, 也可以在代碼中使用.
xml的定義位置: res/anim
使用view動畫的核心: 每個view都提供了setAnimation API. framework同時提供了工具類AnimationUtils加載xml中的動畫文件.
view.startAnimation(animation);
//或者這樣
view.setAnimation(animation);
animation.start();
代碼:
Popup_menu.java
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
JLog.i();
Animation animation = AnimationUtils.loadAnimation(mContext,R.anim.view_animation_demo);
menu_download.setAnimation(animation);
animation.start();
}
res/anim/view_animation_demo.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:toXDelta="200"
android:duration="300" />
</set>
屬性動畫 ObjectAnimator
為什么叫屬性動畫? 因為實現(xiàn)原理是在一段時間內(nèi)通過持續(xù)改變一個對象的屬性值的方式, 實現(xiàn)動畫的效果.
Android 3.0以后新引入的硬毕, 對于低版本手機呻引, 可使用兼容包nineoldandroid去使用屬性動畫.
實現(xiàn)原理是: 給對象指定要改變的屬性名字以及開始值和結(jié)束值, 因此在類中必須有其對應的get和set方法. ObjectAnimator通過反射的方式, 持續(xù)調(diào)用這個屬性的set方法吐咳, 設置新的值給該屬性逻悠, 從而實現(xiàn)動畫的效果.
代碼:
TextView menu_download;
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(menu_download, "translationX", 0, 300);
objectAnimator.start();
}
以動畫的方式韭脊, 持續(xù)調(diào)用setTranslationX()方法, 改變menu_download對象的"translationX"屬性的值.
public class View {
public void setTranslationX(float translationX) {
}
}
ValueAnimator和ObjectAnimator的區(qū)別
父子繼承關系.
public final class ObjectAnimator extends ValueAnimator
使用區(qū)別:
ValueAnimator.ofInt()方法中沒有object參數(shù), 動畫修改的是"數(shù)字", 不直接作用于某個對象.
因此使用ValueAnimator完成動畫童谒, 還要配合上update listener才行.
代碼:
CircleLoadingView.java
public void startAnim() {
startViewAnim(0.0f, 1.0f, 1000);
}
private ValueAnimator startViewAnim(float startF, final float endF, long time) {
valueAnimator = ValueAnimator.ofFloat(startF, endF);
valueAnimator.setDuration(time);
valueAnimator.setInterpolator(new LinearInterpolator());
valueAnimator.setRepeatCount(ValueAnimator.INFINITE);
valueAnimator.setRepeatMode(ValueAnimator.RESTART);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
float value = (float) valueAnimator.getAnimatedValue();
startAngle = 360 * value;
invalidate();
}
});
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setColor(Color.argb(0, 0, 0, 0));
canvas.drawCircle(mWidth / 2, mWidth / 2, mWidth / 2 - mPadding, mPaint);
mPaint.setColor(getColor());
rectF = new RectF(mPadding, mPadding, mWidth - mPadding, mWidth - mPadding);
canvas.drawArc(rectF, startAngle, 270, false, mPaint);
}
View動畫和屬性動畫選誰
優(yōu)先選擇屬性動畫,
因為一是屬性動畫可以支持更多的動畫效果沪羔, 只要這個屬性名字在類中有set和get方法即可.
例如改變TextView的寬度饥伊, 就只有屬性動畫可以做到. View動畫的ScaleAnimation只是縮放, 會把TextView里面的內(nèi)容也一起進行縮放, 不滿足需求.
二是因為View動畫實施后并不改變View的實際位置, 因此在新位置點擊不到view, view的點擊事件還是發(fā)生在初始位置, 在大多數(shù)情況下琅豆, 這么做是不符合用戶預期的.
幀動畫 AnimationDrawable
耗費內(nèi)存愉豺, 因此不建議使用.
通過給view設置背景的方式實現(xiàn).
frame.xml中
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/f1" android:duration="300" />
<item android:drawable="@drawable/f2" android:duration="300" />
<item android:drawable="@drawable/f3" android:duration="300" />
<item android:drawable="@drawable/f4" android:duration="300" />
</animation-list>
java代碼:
image = (ImageView) findViewById(R.id.frame_image);
image.setBackgroundResource(R.anim.frame);
AnimationDrawable anim = (AnimationDrawable) image.getBackground();
anim.start();
--------DONE.--------------------