NineOldAndroid开源库简单使用demo
看到很多开源库都使用了这个动画框架,就自己试了一下,果然很强大。把测试代码贴上,方便以后使用
package com.test.animation; import android.animation.ValueAnimator; import android.app.Activity; import android.os.Bundle; import android.view.Gravity; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; import com.nineoldandroids.animation.Animator; import com.nineoldandroids.animation.AnimatorSet; import com.nineoldandroids.animation.ObjectAnimator; import com.nineoldandroids.animation.PropertyValuesHolder; import com.nineoldandroids.view.ViewHelper; import com.nineoldandroids.view.ViewPropertyAnimator; public class AnimationActivity extends Activity { Button button; private void initView() { LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); layout.setGravity(Gravity.CENTER_HORIZONTAL); button = new Button(this); button.setText("target"); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); layout.addView(button, params); setContentView(layout); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initView(); // testAnim00(); // testAnim0(); // testAnim1(); // testAnim2(); testAnim3(); // testAnim4(); // testAnim5(); // testAnim6(); // testAnim7(); // startActivity(new Intent(this,AnimationContextMenuActivity.class)); } private void testAnim00() { Animator animator1 = AnimatorUtils.rotationCloseToRight(button).setDuration(2000); Animator animator2 = AnimatorUtils.rotationOpenFromRight(button).setDuration(2000); Animator animator3 = AnimatorUtils.rotationCloseVertical(button).setDuration(2000); Animator animator4 = AnimatorUtils.rotationOpenVertical(button).setDuration(2000); Animator animator5 = AnimatorUtils.alphaDisappear(button).setDuration(2000); Animator animator6 = AnimatorUtils.alphaAppear(button).setDuration(2000); Animator animator7 = AnimatorUtils.translationRight(button, 100).setDuration(2000); Animator animator8 = AnimatorUtils.translationLeft(button, 100).setDuration(2000); final AnimatorSet set = new AnimatorSet(); // set.play(animator1).before(animator2)/*.after(animator3).after(animator4).after(animator5).after(animator6).after(animator7).after(animator8)*/; // set.play(animator2).before(animator3); // set.play(animator3).before(animator4); // set.play(animator4).before(animator5); // set.play(animator5).before(animator6); // set.play(animator6).before(animator7); // set.play(animator7).before(animator8); /*===============//after before只能有两个,注意 before/after的顺序 或者用下面的===========================*/ set.playSequentially(animator1,animator2,animator3,animator4,animator5,animator6,animator7,animator8); set.start(); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { set.start(); } }); } private void testAnim0() { Animator anim1 = ObjectAnimator.ofFloat(button, "rotationX", 90, 0).setDuration(2000); Animator anim2 = ObjectAnimator.ofFloat(button, "rotationX", 0, 90).setDuration(2000); final AnimatorSet set = new AnimatorSet(); set.play(anim1).after(anim2); set.start(); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { set.start(); } }); } private void testAnim1() { ObjectAnimator.ofFloat(button, "translationY", 100).setDuration(1000).start(); } private void testAnim2() { Animator animator = ObjectAnimator.ofFloat(button, "translationX", 100).setDuration(1000); animator.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animator) { } @Override public void onAnimationEnd(Animator animator) { ObjectAnimator.ofFloat(button, "translationX", 0).setDuration(1000).start(); } @Override public void onAnimationCancel(Animator animator) { } @Override public void onAnimationRepeat(Animator animator) { } }); animator.start(); } private void testAnim3() { ViewPropertyAnimator.animate(button).translationY(100).start(); final ValueAnimator animator = ValueAnimator.ofFloat(0, 360).setDuration(2000); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { // ViewHelper.setPivotX(button,0); // ViewHelper.setRotationX(button, (Float) animation.getAnimatedValue()); ViewHelper.setPivotY(button, 0); ViewHelper.setRotationY(button, (Float) animation.getAnimatedValue()); //配套使用 } }); animator.start(); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { animator.start(); } }); } private void testAnim4() { //左移动100,右移动100,alpha 变为0.2 跟5效果一样 AnimatorSet set = new AnimatorSet(); set.playTogether(ObjectAnimator.ofFloat(button, "translationX", 100), ObjectAnimator.ofFloat(button, "translationY", 100), ObjectAnimator.ofFloat(button, "alpha", 1, 0.2f)); set.setDuration(2000).start(); } private void testAnim5() { //左移动100,右移动100,alpha 变为0.2 ObjectAnimator.ofPropertyValuesHolder(button, PropertyValuesHolder.ofFloat("translationX", -100), PropertyValuesHolder.ofFloat("translationY", 100), PropertyValuesHolder.ofFloat("alpha", 1, 0.3f)).setDuration(2000).start(); } private void testAnim6() { // ViewPropertyAnimator.animate(button).translationX(100).translationY(100).setDuration(2000).start(); // ViewPropertyAnimator.animate(button).translationY(100).rotationYBy(720).setDuration(2000).start(); ViewPropertyAnimator.animate(button).rotationYBy(360).x(300).y(500).setDuration(2000).start();//旋转角度为360的倍数,x(..)y(..)后面为动画后位置 } //===========================================================================demo========================================================= private void testAnim7() { final LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); layout.setGravity(Gravity.CENTER_HORIZONTAL); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); for (int i = 0; i < 5; i++) { Button btn = new Button(this); btn.setText("btn" + i); btn.setTag(i); layout.addView(btn, params); } Button startBtn = new Button(this); startBtn.setText("start"); startBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (!isAdimateOpen) { isAdimateOpen = true; doAnimateOpen(layout.getChildAt(0), 0, 5, 300); doAnimateOpen(layout.getChildAt(1), 1, 5, 300); doAnimateOpen(layout.getChildAt(2), 2, 5, 300); doAnimateOpen(layout.getChildAt(3), 3, 5, 300); doAnimateOpen(layout.getChildAt(4), 4, 5, 300); } else { isAdimateOpen = false; doAnimateClose(layout.getChildAt(0), 0, 5, 300); doAnimateClose(layout.getChildAt(1), 1, 5, 300); doAnimateClose(layout.getChildAt(2), 2, 5, 300); doAnimateClose(layout.getChildAt(3), 3, 5, 300); doAnimateClose(layout.getChildAt(4), 4, 5, 300); } } }); layout.addView(startBtn, params); setContentView(layout); } boolean isAdimateOpen = false; /** * 打开菜单的动画 * * @param view 执行动画的view * @param index view在动画序列中的顺序 * @param total 动画序列的个数 * @param radius 动画半径 */ private void doAnimateOpen(View view, int index, int total, int radius) { if (view.getVisibility() != View.VISIBLE) { view.setVisibility(View.VISIBLE); } double degree = Math.PI * index / ((total - 1) * 2); int translationX = (int) (radius * Math.cos(degree)); int translationY = (int) (radius * Math.sin(degree)); AnimatorSet set = new AnimatorSet(); //包含平移、缩放和透明度动画 set.playTogether( ObjectAnimator.ofFloat(view, "translationX", 0, translationX), ObjectAnimator.ofFloat(view, "translationY", 0, translationY), ObjectAnimator.ofFloat(view, "scaleX", 1f, 1.5f), ObjectAnimator.ofFloat(view, "scaleY", 1f, 1.5f), ObjectAnimator.ofFloat(view, "alpha", 1f, 1.5f)); //动画周期为500ms set.setDuration(1000).start(); } /** * 关闭菜单的动画 * * @param view 执行动画的view * @param index view在动画序列中的顺序 * @param total 动画序列的个数 * @param radius 动画半径 */ private void doAnimateClose(final View view, int index, int total, int radius) { if (view.getVisibility() != View.VISIBLE) { view.setVisibility(View.VISIBLE); } double degree = Math.PI * index / ((total - 1) * 2); int translationX = (int) (radius * Math.cos(degree)); int translationY = (int) (radius * Math.sin(degree)); AnimatorSet set = new AnimatorSet(); //包含平移、缩放和透明度动画 set.playTogether( ObjectAnimator.ofFloat(view, "translationX", translationX, 0), ObjectAnimator.ofFloat(view, "translationY", translationY, 0), ObjectAnimator.ofFloat(view, "scaleX", 1.5f, 1f), ObjectAnimator.ofFloat(view, "scaleY", 1.5f, 1f), ObjectAnimator.ofFloat(view, "scaleY", 1.5f, 1f)); set.setDuration(1000).start(); } }