1
我爲list.i創建了一個行佈局,使用了自定義textview來調整文本大小。 但文字在高亮區域顯示的底部切割。 任何人都可以知道它爲什麼會發生。請給我提供一些解決方案。文本在TextView中從底部切割
public class AutoFitTextView extends TextView
{
private static final float THRESHOLD = 0.5f
private enum Mode { Width, Height, Both, None }
private int minTextSize = 1;
private int maxTextSize = 16;
private Mode mode = Mode.None;
private boolean inComputation;
private int widthMeasureSpec;
private int heightMeasureSpec;
public AutoFitTextView(Context context) {
super(context);
}
public AutoFitTextView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public AutoFitTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
TypedArray tAttrs = context.obtainStyledAttributes(
attrs, R.styleable.com_techdeals_ui_widget_AutoFitTextView, defStyle, 0);
maxTextSize = tAttrs.getDimensionPixelSize(
R.styleable.com_techdeals_ui_widget_AutoFitTextView_maxTextSize, maxTextSize);
minTextSize = tAttrs.getDimensionPixelSize(
R.styleable.com_techdeals_ui_widget_AutoFitTextView_minTextSize, minTextSize);
tAttrs.recycle();
}
private void resizeText() {
if (getWidth() <= 0 || getHeight() <= 0)
return;
if(mode == Mode.None)
return;
final int targetWidth = getWidth();
final int targetHeight = getHeight();
inComputation = true;
float higherSize = maxTextSize;
float lowerSize = minTextSize;
float textSize = getTextSize();
while(higherSize - lowerSize > THRESHOLD) {
textSize = (higherSize + lowerSize)/2;
if (isTooBig(textSize, targetWidth, targetHeight)) {
higherSize = textSize;
} else {
lowerSize = textSize;
}
}
setTextSize(TypedValue.COMPLEX_UNIT_PX, lowerSize);
measure(widthMeasureSpec, heightMeasureSpec);
inComputation = false;
}
private boolean isTooBig(float textSize, int targetWidth, int targetHeight) {
setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
measure(0, 0);
if(mode == Mode.Both)
return getMeasuredWidth() >= targetWidth || getMeasuredHeight() >= targetHeight;
if(mode == Mode.Width)
return getMeasuredWidth() >= targetWidth;
else
return getMeasuredHeight() >= targetHeight;
}
private Mode getMode(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
if(widthMode == MeasureSpec.EXACTLY && heightMode == MeasureSpec.EXACTLY)
return Mode.Both;
if(widthMode == MeasureSpec.EXACTLY)
return Mode.Width;
if(heightMode == MeasureSpec.EXACTLY)
return Mode.Height;
return Mode.None;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if(!inComputation) {
this.widthMeasureSpec = widthMeasureSpec;
this.heightMeasureSpec = heightMeasureSpec;
mode = getMode(widthMeasureSpec, heightMeasureSpec);
resizeText();
}
}
@Override
protected int getSuggestedMinimumWidth() {
Drawable background = getBackground();
setBackground(null);
int minWidth = super.getSuggestedMinimumWidth();
setBackground(background);
return minWidth;
}
@Override
protected int getSuggestedMinimumHeight() {
Drawable background = getBackground();
setBackground(null);
int minHeight = super.getSuggestedMinimumHeight();
setBackground(background);
return minHeight;
}
public void setBackground(Drawable background) {
/*if(Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN)
super.setBackground(background);
else*/
setBackgroundDrawable(background);
}
@Override
protected void onTextChanged(final CharSequence text, final int start, final int before, final int after) {
resizeText();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
if (w != oldw || h != oldh)
resizeText();
}
public int getMinTextSize() {
return minTextSize;
}
public void setMinTextSize(int minTextSize) {
this.minTextSize = minTextSize;
resizeText();
}
public int getMaxTextSize() {
return maxTextSize;
}
public void setMaxTextSize(int maxTextSize) {
this.maxTextSize = maxTextSize;
resizeText();
}
}
在此先感謝。
應用填充到TextView的.. –
填充文本視圖高度包裝內容 – duggu
TextView的高度已經WRAP_CONTENT –