EditText实现单行输入,字体大小随输入的字数而改变

前言
最近在工作的时候接触了Android系统自带的Dialer,也就是拨号界面,在拨号的时候,我们可以发现它使用的EditText可以单行无限制输入,而且字体大小也会随着字数的增加而改变。个人感觉有点意思,就深入探索了一下。在此和大家做个分享。

首先,我们创建ResizingTextEditText这个类来继承EditText,创建带一个属性的构造,重写onTextChanged和onSizeChanged。这里说明一下,mOriginalTextSize代表初始字体大小,mMinTextSize代表最小值。

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.EditText;

import yrw.sagereal.com.resizingtext.R;

/**
 * Created by yrw on 11/20/19.
 */

public class ResizingTextEditText extends EditText {

    private final int mOriginalTextSize;
    private final int mMinTextSize ;

    public ResizingTextEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        mOriginalTextSize = (int) getTextSize();
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ResizingText);
        mMinTextSize =
                (int) a.getDimension(R.styleable.ResizingText_resizing_text_min_size, mOriginalTextSize);
        a.recycle();
        Log.e("yuanrongwang","mMimOriginalTextSizenTextSize"+mOriginalTextSize);
        Log.e("yuanrongwang","mMinTextSize"+mMinTextSize);
    }

    @Override
    protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
        super.onTextChanged(text, start, lengthBefore, lengthAfter);
        ViewUtil.resizeText(this, mOriginalTextSize, mMinTextSize);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        ViewUtil.resizeText(this, mOriginalTextSize, mMinTextSize);
    }
}

在重写的方法中都调用了 ViewUtil.resizeText(this, mOriginalTextSize, mMinTextSize);我们创建ViewUtil这个类,在里面定义如下方法。通过这个方法,我们可以根据传入的originalTextSize和minTextSize来实现字体大小的动态变化。

public static void resizeText(TextView textView, int originalTextSize, int minTextSize) {
        final Paint paint = textView.getPaint();
        final int width = textView.getWidth();
        Log.e("yuanrongwang","width          "+width);
        if (width == 0) {
            return;
        }
        textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, originalTextSize);
        Log.e("yuanrongwang","TypedValue.COMPLEX_UNIT_PX          "+TypedValue.COMPLEX_UNIT_PX);
        float ratio = width / paint.measureText(textView.getText().toString());
        if (ratio <= 1.0f) {
            textView.setTextSize(
                    TypedValue.COMPLEX_UNIT_PX, Math.min(minTextSize, originalTextSize * ratio));
        }
    }

最后将我们自定义的ResizingTextEditText使用起来,注意要加上android:lines="1"来保证输入框单行输入。最后我们想要的就实现了。


<yrw.sagereal.com.resizingtext.view.ResizingTextEditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:lines="1"/>
    ```

你可能感兴趣的:(Android)