android 评论框 缩小/放大
2019-07-05 本文已影响94人
一个冬季
知识点学习地址
https://blog.csdn.net/ringopaul/article/details/52597109
需求
1、点击文本输入框,文本输入框整体拉长,右边的布局消失不见
2、点击空白的地方要进行还原的操作
开发期间遇见的问题
1、由于float类型和int类型的精度不同,会导致有些许误差,主要是因为etEditLayoutParams.width类型是int类型,所以在转换的时候会丢失进度,比如最后几次增加的dist是0.85748,在int类型下直接是0了,所以宽度就没那么宽了。那么我们就可以考虑进行四舍五入
2、当初我设置constraintLayout.setTranslationX,里面存放int类型,导致不能很好的展示数据,所以我们再设置值的时候需要设置float类型
总结
1、TextView在xml里面设置Width=100px,marginLeft=20px,textView.getWidth()为100px
2、在xml里面父布局是LinearLayout,子布layout_width=0dp,layout_weight=1,子view.getLayoutParams().width获取的宽度是0,只能通过子view.getWidth()才能获取到宽度
3、setTranslationX是属于属性动画,会改变点击位置
4、layoutParams.height 可以跟view.getHeight()不同,第一个是期望多高,第二个是最后显示在屏幕上真实的高度
部分代码展示
/**
* @date: 2019/7/4 0004
* @author: gaoxiaoxiong
* @description: 输入框展开
**/
private void etTextToExpand() {
final int[] constrainStart = {defaultConsoleLayout};
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0.0f, 1.0f);
valueAnimator.setDuration(animatorDurtime);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float currentValue = (float) animation.getAnimatedValue();//0---->1逐渐变大
float toSmalScale = 1 - currentValue;
float dist = constrainStart[0] - (constrainStart[0] * toSmalScale);//每次增加的量
//这里进行4舍五入的目的是为了保存缩小后的最大值,这样的误差才是最小的,用户看着不会别扭
constrainStart[0] = Math.round(constrainStart[0] * toSmalScale);//4舍五入
constraintLayout.setTranslationX(constraintLayout.getTranslationX() + dist);
//扩大
LinearLayout.LayoutParams etEditLayoutParams = (LinearLayout.LayoutParams) etFlowDetail.getLayoutParams();
etEditLayoutParams.width = etEditLayoutParams.width + Math.round(dist);//这里需要对每次增加的量进行四舍五入,因为它会直接影响到我最后的宽度因素
etFlowDetail.setLayoutParams(etEditLayoutParams);
}
});
valueAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
anmoIsLoading = false;
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
valueAnimator.start();
}