標籤:

Android之屬性動畫Animator

Android 3.0之前已有動畫框架Animation(詳見:Android之視圖動畫Animation),但存在一些局限性,當某個元素髮生視圖動畫後,其響應事件位置還在動畫前的地方。於是3.0之後,Google提出了屬性動畫。

ObjectAnimator

ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(imageView, "translationX", 300);objectAnimator1.setInterpolator(new AccelerateInterpolator());objectAnimator1.setDuration(2000);objectAnimator.setRepeatCount(ValueAnimator.INFINITE);//Animation.INFINITE 表示重複多次objectAnimator.setRepeatMode(ValueAnimator.RESTART);//RESTART表示從頭開始,REVERSE表示從末尾倒播objectAnimator1.start();

第一個參數:操縱的view

第二個參數:操縱的動畫屬性值

第三個參數:可變數組參數

動畫屬性值

translationX和translationY:增量控制view從它布局容器左上角坐標偏移

ObjectAnimator.ofFloat(imageView, "translationX", 300f);

rotation、rotationX、rotationY:控制view繞支點進行2D或3D旋轉

ObjectAnimator.ofFloat(imageView, "rotation", 360);

scaleX、scaleY:控制view繞支點進行2D縮放

ObjectAnimator.ofFloat(imageView, "scaleX", 1f, 0.5f,1f);

alpha:控制view透明度,默認是1(不透明),0完全透明(不可見)

ObjectAnimator.ofFloat(imageView, "alpha", 1f, 0.5f);

x和y:描述view在容器最終位置

可變數組參數

可以有一個到N個,如果是一個值的話默認這個值是動畫過渡值的結束值。如果有N個值,動畫就在這N個值之間過渡。

動畫監聽

ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(imageView, "alpha", 0.5f, 1f);objectAnimator1.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { }});

一般我們只關心onAnimationEnd,所以Android提供了AnimatorListenerAdapter:

ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(imageView, "alpha", 0.5f, 1f); objectAnimator1.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); } });

ValueAnimator

ValueAnimator 本身不提供任何動畫效果,像個數值 發生器,用來產生具有一點規律數字。

ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 100);valueAnimator.setTarget(imageView);valueAnimator.setDuration(2000).start();valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { Int value = (Integer) animation.getAnimatedValue(); //TODO use the value Toast.makeText(getApplicationContext(), "value=" + value, Toast.LENGTH_LONG).show(); }});

PropertyValuesHolder

針對同一個對象多個屬性,同時作用多種動畫

PropertyValuesHolder propertyValuesHolder1 = PropertyValuesHolder.ofFloat("translationX", 300f);PropertyValuesHolder propertyValuesHolder2 = PropertyValuesHolder.ofFloat("alpha", 1f, 0.5f);PropertyValuesHolder propertyValuesHolder3 = PropertyValuesHolder.ofFloat("scaleX", 1f, 0, 1f);PropertyValuesHolder propertyValuesHolder4 = PropertyValuesHolder.ofFloat("scaleY", 1f, 0, 1f);ObjectAnimator.ofPropertyValuesHolder(imageView, propertyValuesHolder1, propertyValuesHolder2, propertyValuesHolder3, propertyValuesHolder4) .setDuration(5000).start();

AnimatorSet

與PropertyValuesHolder類似,但AnimatorSet多了playTogether(同時執行)、playSequentially(順序執行)、play(objectAnimator1).with(objectAnimator2)、before、after這些方法協同工作。

ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(imageView, "alpha", 1f, 0.5f);ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(imageView, "translationY", 300);ObjectAnimator objectAnimator3 = ObjectAnimator.ofFloat(imageView, "scaleX", 1f, 0, 1f);AnimatorSet animatorSet = new AnimatorSet();animatorSet.setDuration(5000);animatorSet.playTogether(objectAnimator1, objectAnimator2,objectAnimator3);animatorSet.start();

xml使用屬性動畫

res下建立animator文件夾,然後建立res/animator/set_animator.xml

<?xml version="1.0" encoding="utf-8"?>http://schemas.android.com/apk/res/android"android:duration="2000"android:propertyName="alpha"android:valueFrom="0.1"android:valueTo="1.0"android:valueType="floatType" />

調用:

Animator animator = AnimatorInflater.loadAnimator(getApplicationContext(), R.animator.set_animator);animator.setTarget(imageView);animator.start();

動畫組合

set標籤,有一個orderring屬性設置為together,還有另一個值:sequentially(表示一個接一個執行)。

<?xml version="1.0" encoding="utf-8"?>http://schemas.android.com/apk/res/android" android:ordering="together"> <objectAnimator android:duration="1000" android:propertyName="scaleX" android:valueFrom="1" android:valueTo="0.5" /> <objectAnimator android:duration="1000" android:propertyName="scaleY" android:valueFrom="1" android:valueTo="0.5" /></set>

View的animate方法

Android 3.0後,谷歌給View增加animate方法直接驅動屬性動畫。

imageView.animate() .alpha(0.5f) .y(300) .setDuration(2000) //api min is 16 .withStartAction(new Runnable() { @Override public void run() { } }) //api min is 16 .withEndAction(new Runnable() { @Override public void run() { } }) .start();

布局動畫

設置子View過渡動畫

<?xml version="1.0" encoding="utf-8"?>http://schemas.android.com/apk/res/android" android:id="@+id/parentLayout" android:layout_width_="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="@dimen/activity_vertical_margin"> <ImageView android:id="@+id/imageMove" android:layout_width_="wrap_content" android:layout_height="wrap_content" android:background="@mipmap/ic_launcher" /></LinearLayout>

LinearLayout parentLayout = (LinearLayout) findViewById(R.id.parentLayout); ScaleAnimation scaleAnimation=new ScaleAnimation(0,1,0,1); scaleAnimation.setDuration(2000); LayoutAnimationController layoutAnimationController=new LayoutAnimationController(scaleAnimation,0.5f); layoutAnimationController.setOrder(LayoutAnimationController.ORDER_NORMAL); parentLayout.setLayoutAnimation(layoutAnimationController);

關於作者

點擊查看

本文原創發佈於微信公眾號「吳小龍同學」,不止於技術分享,不取悅別人,寫給懂的人看~公眾號二維碼


推薦閱讀:

又飄又跑還跳舞,從「愛裸漫老師」動漫OP的套路!
這部動畫要的就是:特效!

TAG:Android | 动画 |