Animator --- 属性动画

针对对象的某个属性做不断的改变 ( 刷新 ) 产生的效果,就是属性动画
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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值