今天一小伙伴遇到这样的一个需求,点击隐藏布局再点击显示出来.
我想大部分的新手可能想到的就是点击之后直接
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