使用ValueAnimator制作两款可伸展的动画

效果图:

一,定义基类:使用ValueAnimator定义动画执行的流程,具体的动画由子类实现

public abstract class BaseAnim {
    private ValueAnimator animator;
    protected View target;//执行动画的目标view
    public BaseAnim(View target,int startvalue,int endvalue) {
        this.target = target;
        animator = ValueAnimator.ofInt(startvalue, endvalue);
        //监听动画的执行流程,具体的动画由子类实现
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                int animatedValue = (int) animator.getAnimatedValue();
                doAnim(animatedValue);
            }
        });

    }
    /**
     * 由子类实现的具体的动画
     * @param animatedValue
     */
    protected abstract void doAnim(int animatedValue) ;
    /**
     * 开启动画
     * @param duration
     */
    public void start(int duration){
        animator.setDuration(duration).start();
    }
}

二,定义子类

1,PaddingTopAnim执行:

@Override
protected void doAnim(int animatedValue) {
    target.setPadding(target.getPaddingLeft(), animatedValue, target.getPaddingRight(), target.getPaddingBottom());
}
2,HeightAnim执行:

(与PaddingTopAnim不同的是,因为改变布局的高度可能使整个布局的高度大于屏幕的高度,故需要在布局上包裹一层ScrollView,通过接口暴露出动画变化的值传给ScrollView)


@Override
protected void doAnim(int animatedValue) {
    ViewGroup.LayoutParams params = target.getLayoutParams();
    params.height = animatedValue;
    target.setLayoutParams(params);
    //将动画变化的值通过接口暴露给外界(可用来让外界的scrollview移动)
    if (mOnHeightChangeListener != null) {
        mOnHeightChangeListener.OnHeightChange(animatedValue);
    }
}
private OnHeightChangeListener mOnHeightChangeListener;

public void setmOnHeightChangeListener(OnHeightChangeListener mOnHeightChangeListener) {
    this.mOnHeightChangeListener = mOnHeightChangeListener;
}
private interface OnHeightChangeListener {
    void OnHeightChange(int animatedValue);
}
具体使用:略..(看demo吧嘻嘻)

demo地址:点击打开链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值