动画杂谈

来源:互联网 发布:磨刀器哪个牌子好 知乎 编辑:程序博客网 时间:2024/06/07 18:55

动画分类

xxx

示例

晃动

/** * 补间晃动 * * @param cycleTimes * @return */public static Animation shakeAnimation(float cycleTimes, long duration) {    Animation translateAnimation = new TranslateAnimation(0, 10, 0, 10);    translateAnimation.setInterpolator(new CycleInterpolator(cycleTimes));    translateAnimation.setDuration(duration);    return translateAnimation;}

位移

/*** 补间位移** @param fromX* @param toX* @param fromY* @param toY* @param duration* @return*/public Animation translateAnimation(float fromX, float toX, float fromY, float toY, long duration) {    TranslateAnimation translateAnimation = new TranslateAnimation(fromX, toX, fromY, toY);    translateAnimation.setDuration(duration);    translateAnimation.setFillAfter(true);    return translateAnimation;}
/** * 属性Y位移 * * @param v * @param duration */public static void translationY(View v, float trEnd, long duration) {    float curTranslationY = v.getTranslationY();    ObjectAnimator oa = ObjectAnimator.ofFloat(v, "translationY", curTranslationY, trEnd);    oa.setDuration(duration);}

缩放

/** * 属性XY缩放 * * @param view */public static void scaleProperty(View view, long duration) {    ObjectAnimator animatorX = ObjectAnimator.ofFloat(view, "scaleX", 1f, 0, 1f);    ObjectAnimator animatorY = ObjectAnimator.ofFloat(view, "scaleY", 1f, 0, 1f);    AnimatorSet animSet = new AnimatorSet();    animSet.play(animatorX).with(animatorY);    animSet.setDuration(duration);    animSet.start();}

渐变

/** * 属性XY渐变 * * @param v * @param start * @param end * @param duration */public static void gradual(final View v, int start, int end, long duration, int interpolator) {    ValueAnimator va = ValueAnimator.ofInt(start, end);    final ViewGroup.LayoutParams params = v.getLayoutParams();    va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {        @Override        public void onAnimationUpdate(ValueAnimator animation) {            int h = (int) animation.getAnimatedValue();            params.height = h;            v.setLayoutParams(params);            v.requestLayout();        }    });    va.addListener(new AnimatorListenerAdapter() {        @Override        public void onAnimationStart(Animator animation) {            super.onAnimationStart(animation);        }        @Override        public void onAnimationEnd(Animator animation) {            super.onAnimationEnd(animation);        }    });    switch (interpolator) {        case 1:            va.setInterpolator(new AccelerateInterpolator(2f));            break;        case 2:            va.setInterpolator(new BounceInterpolator());            break;        default:            break;    }    va.setDuration(duration);    va.start();}
/** * 属性XY渐变 * * @param v * @param start * @param end * @param duration * @return */public static ValueAnimator gradualReturn(final View v, int start, int end, long duration) {    ValueAnimator va = ValueAnimator.ofInt(start, end);    final ViewGroup.LayoutParams params = v.getLayoutParams();    va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {        @Override        public void onAnimationUpdate(ValueAnimator animation) {            int h = (int) animation.getAnimatedValue();            params.height = h;            v.setLayoutParams(params);            v.requestLayout();        }    });    va.setDuration(duration);    return va;}

透变

/** * 属性透变 * * @param v * @param duration */public static void alphaView(View v, long duration) {    ObjectAnimator oa = ObjectAnimator.ofFloat(v, "alpha", 0f, 1f);    oa.setDuration(duration);}

比较

  • 位移动画改变位置即对View操作,属性位移改变位置与属性值即对值操作。控件发生位移动画,位置改变但属性值不变,结束后不可点;发生属性位移,位置与属性值同变,结束后仍可点。
  • 属性渐变适用布局宽高渐变,渐变过程内容无上下左右移动,仅宽高上下左右渐变并实时刷新重绘。

延伸

  • RecyclerView内容为图且对图设透变动画需在图显后,图显前无效;平移动画亦如此。
  • 如图。黑1/橙2为RecyclerView且平级,黑1宽高match_parent,橙2宽match_parentwrap_content。正常情况下橙2于屏幕下方不可见。黑1执行属性XY渐变动画后橙2上移显示;黑1不动,橙2执行属性XY渐变动画无效,仍不显。
原创粉丝点击