高级UI自定义控件Android经验

android 评论框 缩小/放大

2019-07-05  本文已影响94人  一个冬季
知识点学习地址

https://blog.csdn.net/ringopaul/article/details/52597109

图片.gif
需求

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();
    }

github地址
https://github.com/caocao123/TestAndroid

上一篇下一篇

猜你喜欢

热点阅读