前言
最近在工作的时候接触了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"/>
```