一、效果图如下,TextView 文字大小仅显示一行,超过后自动调整大小。
二、源码
1、源码预览
2、重载TextView类,SingleLineZoomTextView 文件
package com.giada.textviewautozoom;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.widget.TextView;
public class SingleLineZoomTextView extends TextView {
private Paint mPaint;
private float mTextSize;
public SingleLineZoomTextView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public SingleLineZoomTextView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public SingleLineZoomTextView(Context context, AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
// TODO Auto-generated constructor stub
}
/**
* getTextSize 返回值是以像素(px)为单位的,而 setTextSize() 默认是 sp 为单位
* 因此我们要传入像素单位 setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
*/
private void refitText(String text, int textWidth) {
if (textWidth > 0) {
mTextSize = this.getTextSize();//这个返回的单位为px
mPaint = new Paint();
mPaint.set(this.getPaint());
int drawWid = 0;//drawableLeft,Right,Top,Buttom 所有图片的宽
Drawable[] draws = getCompoundDrawables();
for (int i = 0; i < draws.length; i++) {
if(draws[i]!= null){
drawWid += draws[i].getBounds().width();
}
}
//获得当前TextView的有效宽度
int availableWidth = textWidth - this.getPaddingLeft()
- this.getPaddingRight()- getCompoundDrawablePadding()- drawWid;
//所有字符所占像素宽度
float textWidths = getTextLength(mTextSize, text);
while(textWidths > availableWidth){
mPaint.setTextSize(--mTextSize);//这里传入的单位是 px
textWidths = getTextLength(mTextSize, text);
}
this.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize);//这里设置单位为 px
}
}
/**
* @param textSize
* @param text
* @return 字符串所占像素宽度
*/
private float getTextLength(float textSize,String text){
mPaint.setTextSize(textSize);
return mPaint.measureText(text);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
refitText(getText().toString(), this.getWidth());
}
}
3、com\giada\textviewautozoom\MainActivity.java
package com.giada.textviewautozoom;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
((SingleLineZoomTextView)findViewById(R.id.single_line_two)).setText("商鞅回顾自己这一生,施行变法,得到国君的信任,自己也飞黄腾达。");
}
}
4、布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.giada.textviewautozoom.SingleLineZoomTextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:text="鬼灭之刃"
android:textSize="20sp"
android:gravity="center"
/>
<TextView
android:id="@+id/normal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:text="鬼灭之刃是日本漫画家吾峠呼世晴所著的少年漫画"
android:textSize="20sp"
android:gravity="center"
/>
<com.giada.textviewautozoom.SingleLineZoomTextView
android:id="@+id/single_line"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:text="鬼灭之刃是日本漫画家吾峠呼世晴所著的少年漫画"
android:textSize="20sp"
android:gravity="center"
/>
<TextView
android:id="@+id/another"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:text="秦国的商鞅带着家眷一行人等走在昏暗的小路上"
android:textSize="20sp"
android:gravity="center"
/>
<com.giada.textviewautozoom.SingleLineZoomTextView
android:id="@+id/single_line_two"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:text="商鞅虽然死了但是他国家强盛必先穷其民的治国理念却没有被废"
android:textSize="20sp"
android:gravity="center"
/>
</LinearLayout>
二、有价值的参考文章
1、Android 自动调整 TextView 文字大小仅显示一行 - 简书
2、android简单实现textview自动缩小文字_henkun的博客-CSDN博客_textview自动缩小 PS:这个方法文字多的时候会先显示两行的再缩小,效果不好。