Animator --- 属性动画

来源:互联网 发布:sql 多列分组求和汇总 编辑:程序博客网 时间:2024/05/29 12:15

针对对象的某个属性做不断的改变 ( 刷新 ) 产生的效果,就是属性动画

1、要操作的属性必须有 getset 方法,如果没有那么需要去添加2、可以使用一个类来封装原始的对象,间接的提供 getset 方法来改变它属性class ViewHolder{        //原始的视图对象        View view;        private LinearLayout.LayoutParams lp;        public ViewHolder(View view){            this.view = view;            lp = (LinearLayout.LayoutParams) view.getLayoutParams();        }        public void setWidth(int width){            lp.width= width;            view.requestLayout();        }        public int getWidth(){            return lp.width;        }        public void setHeight(int height){            lp.height= height;            view.requestLayout();        }        public int getHeight(){            return lp.height;        }    }// 使用属性动画ViewHolder holder = new ViewHolder(view);// 对宽属性产生 int 类型的值,改变宽度//( 对象 , 属性名称 , 变化的数值 可以多个 )ObjectAnimator.ofInt(holder,"width",view.getMeasuredWidth(),500)        .setDuration(2000).start();

使用动画速率

ViewHolder holder = new ViewHolder(view);ObjectAnimator animator = ObjectAnimator.ofInt(holder, "width", view.getMeasuredWidth(), 500);// 设置动画速率animator.setInterpolator(new AccelerateDecelerateInterpolator());// 设置动画时间,启动动画animator.setDuration(2000).start();

动画速率中的 PathInterpolator 是 api21(android5.0) 才加上来的,低版本使用的话可以用 v4 包的 PathInterpolatorCompat 来代替

//透明度case R.id.btn_view_alpha:    ObjectAnimator alphAnim = ObjectAnimator.ofFloat(view,View.ALPHA,1,0.5f);    alphAnim.setDuration(2000).start();    break;//平移case R.id.btn_view_tran:    //x方向    ObjectAnimator tranAnim = ObjectAnimator.ofFloat(view,View.TRANSLATION_X,100);    tranAnim.setDuration(2000).start();    //y方向    ObjectAnimator.ofFloat(view,View.TRANSLATION_Y,300).setDuration(1000).start();    break;//缩放case R.id.btn_view_scale:    //宽方向    ObjectAnimator.ofFloat(view,View.SCALE_X,1,1.5f).setDuration(1000).start();    //高方向    ObjectAnimator.ofFloat(view,View.SCALE_Y,1,1.5f).setDuration(2000).start();    break;//旋转case R.id.btn_view_rotate:    // 沿着X轴旋转(上下翻转)    ObjectAnimator.ofFloat(view,View.ROTATION_X,45).setDuration(1000).start();    // 沿着 Y 轴旋转 ( 左右翻转 )    ObjectAnimator.ofFloat(view,View.ROTATION_Y,45).setDuration(1000).start();    // 沿着 Z 轴旋转 ( 平面旋转 )    ObjectAnimator.ofFloat(view,View.ROTATION,45).setDuration(1000).start();    break;

ValueAnimator

描述的时值变化过程的类,是 ObjectAnimator 的父类,一般要结合 AnimatorUpdateListener 一起使用监听值的变化

private void startValueAnimator(final int startWidth, final int endWidth) {    // 整数的因子计算对象    final IntEvaluator mEvaluator = new IntEvaluator();    // 值变化对象 ( 起始值 , 结束值 )    ValueAnimator anim = ValueAnimator.ofInt(1, 100);    anim.setDuration(2000);    anim.setInterpolator(new LinearInterpolator());    // 监听数值变化    anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {        @Override        public void onAnimationUpdate(ValueAnimator animation) {            // 获取当前产生的数值            int currentValue = (Integer) animation.getAnimatedValue();            float fraction = currentValue / 100f;            int w = mEvaluator.evaluate(fraction,startWidth,endWidth);            // Log.e("m_tag", "value:" + currentValue);            // 新的宽度            // int w = orginWidth + currentValue;            view.getLayoutParams().width = w;            view.requestLayout();        }    });    anim.start();}
原创粉丝点击