Android 显示/隐藏 布局(非visibility进行控制)

来源:互联网 发布:embed js获取播放时间 编辑:程序博客网 时间:2024/06/10 23:39

今天一小伙伴遇到这样的一个需求,点击隐藏布局再点击显示出来.
这里写图片描述

我想大部分的新手可能想到的就是点击之后直接

 android:visibility="gone"

然后发现一点也没有反应,然后沉浸在纠结之中….

需求分析
点击之后,有拉伸有收缩的效果,很明显这个是动画.不能采用 android:visibility=”gone”的形式去做

第一步
要测量完整展示的高度也就是收缩/拉伸布局的高度
这layout 是拉伸/收缩的布局

private int getLongHeight() {        layout.measure(0, 0);        return layout.getMeasuredHeight();    }

第二步
我还要知道不展示的时候的高度(最小值) 在这里是为0

 layoutParams = layout.getLayoutParams();        layoutParams.height = 0;        layout.setLayoutParams(layoutParams);

第三步
开始设置动画
首先需要一个布尔类型的值来判断是拉伸还是收缩

 private boolean isOpen = false;

在点击事件中我们设置一个方法

 private void expend() {        ValueAnimator valueAnimator = null;        if (!isOpen){            //点击前是关闭状态,点击后就扩展拉开            isOpen = true;            valueAnimator = ValueAnimator.ofInt(0, getLongHeight());        }else{            //点击前是开启状态,点击后就缩回去            isOpen = false;            valueAnimator = ValueAnimator.ofInt(getLongHeight(), 0);        }        if (valueAnimator != null) {            valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {                @Override                public void onAnimationUpdate(ValueAnimator valueAnimator) {                    int height = (Integer) valueAnimator.getAnimatedValue();                    layoutParams.height = height;                    layout.setLayoutParams(layoutParams);                }            });            //这个是监听动画运行状态的            valueAnimator.addListener(new Animator.AnimatorListener() {                @Override                public void onAnimationStart(Animator animation) {                }                @Override                public void onAnimationEnd(Animator animation) {                    if (isOpen){                        //扩展开箭头向上                        img_k1.setImageResource(R.mipmap.icon_c);                    }else{                        //收缩时候向下                        img_k1.setImageResource(R.mipmap.icon_k);                    }                }                @Override                public void onAnimationCancel(Animator animation) {                }                @Override                public void onAnimationRepeat(Animator animation) {                }            });        }        valueAnimator.setDuration(100);        valueAnimator.start();    }

注意 一定要设置时长 还有开启动画,不然你的界面也是没有效果的
这里写图片描述

2017年5月10日00:54:12

1 0