猿问

如何调整文本字体大小以适应文本视图

如何调整文本字体大小以适应文本视图

Android中是否有任何方法来调整文本视图中的文本大小以适应它所占用的空间?

我用的是TableLayout加上几个TextView到每一行去。因为我不想TextView我宁愿看到它降低了内容的字体大小。

有什么想法吗?

我试过了measureText,但由于我不知道列的大小,使用起来似乎很麻烦。这是我想要将字体大小更改为适合的代码。

TableRow row = new TableRow(this);   for (int i=0; i < ColumnNames.length; i++) {    
    TextView textColumn = new TextView(this);      
    textColumn.setText(ColumnNames[i]);
    textColumn.setPadding(0, 0, 1, 0);
    textColumn.setTextColor(getResources().getColor(R.drawable.text_default));          
    row.addView(textColumn, new TableRow.LayoutParams()); } table.addView(row, new TableLayout.LayoutParams());


炎炎设计
浏览 757回答 3
3回答

犯罪嫌疑人X

下面的解决方案包含了这里的所有建议。它从最初由Dunni发布的内容开始。它使用像gjpc这样的二进制搜索,但它的可读性更强一些。它还包括gregm的bug修复和我自己的bug修复。import&nbsp;android.content.Context;import&nbsp;android.graphics.Paint;import&nbsp;android.util.AttributeSet;import&nbsp;android.util.TypedValue; import&nbsp;android.widget.TextView;public&nbsp;class&nbsp;FontFitTextView&nbsp;extends&nbsp;TextView&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;FontFitTextView(Context&nbsp;context)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(context); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initialise(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;FontFitTextView(Context&nbsp;context,&nbsp;AttributeSet&nbsp;attrs)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(context,&nbsp;attrs); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initialise(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;initialise()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mTestPaint&nbsp;=&nbsp;new&nbsp;Paint(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mTestPaint.set(this.getPaint()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//max&nbsp;size&nbsp;defaults&nbsp;to&nbsp;the&nbsp;initially&nbsp;specified&nbsp;text&nbsp;size&nbsp;unless&nbsp;it&nbsp;is&nbsp;too&nbsp;small &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Re&nbsp;size&nbsp;the&nbsp;font&nbsp;so&nbsp;the&nbsp;specified&nbsp;text&nbsp;fits&nbsp;in&nbsp;the&nbsp;text&nbsp;box &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;assuming&nbsp;the&nbsp;text&nbsp;box&nbsp;is&nbsp;the&nbsp;specified&nbsp;width. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;refitText(String&nbsp;text,&nbsp;int&nbsp;textWidth)&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(textWidth&nbsp;<=&nbsp;0) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;targetWidth&nbsp;=&nbsp;textWidth&nbsp;-&nbsp;this.getPaddingLeft()&nbsp;-&nbsp;this.getPaddingRight(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;hi&nbsp;=&nbsp;100; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;lo&nbsp;=&nbsp;2; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;float&nbsp;threshold&nbsp;=&nbsp;0.5f;&nbsp;//&nbsp;How&nbsp;close&nbsp;we&nbsp;have&nbsp;to&nbsp;be &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mTestPaint.set(this.getPaint()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((hi&nbsp;-&nbsp;lo)&nbsp;>&nbsp;threshold)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;size&nbsp;=&nbsp;(hi+lo)/2; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mTestPaint.setTextSize(size); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(mTestPaint.measureText(text)&nbsp;>=&nbsp;targetWidth)&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hi&nbsp;=&nbsp;size;&nbsp;//&nbsp;too&nbsp;big &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lo&nbsp;=&nbsp;size;&nbsp;//&nbsp;too&nbsp;small &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Use&nbsp;lo&nbsp;so&nbsp;that&nbsp;we&nbsp;undershoot&nbsp;rather&nbsp;than&nbsp;overshoot &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.setTextSize(TypedValue.COMPLEX_UNIT_PX,&nbsp;lo); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;void&nbsp;onMeasure(int&nbsp;widthMeasureSpec,&nbsp;int&nbsp;heightMeasureSpec) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.onMeasure(widthMeasureSpec,&nbsp;heightMeasureSpec); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;parentWidth&nbsp;=&nbsp;MeasureSpec.getSize(widthMeasureSpec); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;height&nbsp;=&nbsp;getMeasuredHeight(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;refitText(this.getText().toString(),&nbsp;parentWidth); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.setMeasuredDimension(parentWidth,&nbsp;height); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;void&nbsp;onTextChanged(final&nbsp;CharSequence&nbsp;text,&nbsp;final&nbsp;int&nbsp;start,&nbsp;final&nbsp;int&nbsp;before,&nbsp;final&nbsp;int&nbsp;after)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;refitText(text.toString(),&nbsp;this.getWidth()); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;void&nbsp;onSizeChanged&nbsp;(int&nbsp;w,&nbsp;int&nbsp;h,&nbsp;int&nbsp;oldw,&nbsp;int&nbsp;oldh)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(w&nbsp;!=&nbsp;oldw)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;refitText(this.getText().toString(),&nbsp;w); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;//Attributes &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Paint&nbsp;mTestPaint;}

富国沪深

我编写了一个类,它扩展了TextView并完成了这个任务。它只是使用度量文本,如你所建议的。基本上,它有一个最大的文本大小和最小的文本大小(可以更改),它只是在它们之间的大小之间以递减1的方式运行,直到找到最适合的大小。不太优雅,但我不知道还有什么别的方法。以下是代码:import&nbsp;android.content.Context;import&nbsp;android.graphics.Paint;import&nbsp;android.util.AttributeSet;import&nbsp;android.widget.TextView; public&nbsp;class&nbsp;FontFitTextView&nbsp;extends&nbsp;TextView&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;FontFitTextView(Context&nbsp;context)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(context); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initialise(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;FontFitTextView(Context&nbsp;context,&nbsp;AttributeSet&nbsp;attrs)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(context,&nbsp;attrs); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initialise(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;initialise()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testPaint&nbsp;=&nbsp;new&nbsp;Paint(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testPaint.set(this.getPaint()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//max&nbsp;size&nbsp;defaults&nbsp;to&nbsp;the&nbsp;intially&nbsp;specified&nbsp;text&nbsp;size&nbsp;unless&nbsp;it&nbsp;is&nbsp;too&nbsp;small &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxTextSize&nbsp;=&nbsp;this.getTextSize(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(maxTextSize&nbsp;<&nbsp;11)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxTextSize&nbsp;=&nbsp;20; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minTextSize&nbsp;=&nbsp;10; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Re&nbsp;size&nbsp;the&nbsp;font&nbsp;so&nbsp;the&nbsp;specified&nbsp;text&nbsp;fits&nbsp;in&nbsp;the&nbsp;text&nbsp;box &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;assuming&nbsp;the&nbsp;text&nbsp;box&nbsp;is&nbsp;the&nbsp;specified&nbsp;width. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;refitText(String&nbsp;text,&nbsp;int&nbsp;textWidth)&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(textWidth&nbsp;>&nbsp;0)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;availableWidth&nbsp;=&nbsp;textWidth&nbsp;-&nbsp;this.getPaddingLeft()&nbsp;-&nbsp;this.getPaddingRight(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;trySize&nbsp;=&nbsp;maxTextSize; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testPaint.setTextSize(trySize); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;((trySize&nbsp;>&nbsp;minTextSize)&nbsp;&&&nbsp;(testPaint.measureText(text)&nbsp;>&nbsp;availableWidth))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trySize&nbsp;-=&nbsp;1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(trySize&nbsp;<=&nbsp;minTextSize)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trySize&nbsp;=&nbsp;minTextSize; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testPaint.setTextSize(trySize); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.setTextSize(trySize); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;void&nbsp;onTextChanged(final&nbsp;CharSequence&nbsp;text,&nbsp;final&nbsp;int&nbsp;start,&nbsp;final&nbsp;int&nbsp;before,&nbsp;final&nbsp;int&nbsp;after)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;refitText(text.toString(),&nbsp;this.getWidth()); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;void&nbsp;onSizeChanged&nbsp;(int&nbsp;w,&nbsp;int&nbsp;h,&nbsp;int&nbsp;oldw,&nbsp;int&nbsp;oldh)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(w&nbsp;!=&nbsp;oldw)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;refitText(this.getText().toString(),&nbsp;w); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;//Getters&nbsp;and&nbsp;Setters &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;float&nbsp;getMinTextSize()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;minTextSize; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setMinTextSize(int&nbsp;minTextSize)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.minTextSize&nbsp;=&nbsp;minTextSize; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;float&nbsp;getMaxTextSize()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;maxTextSize; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setMaxTextSize(int&nbsp;minTextSize)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.maxTextSize&nbsp;=&nbsp;minTextSize; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;//Attributes &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Paint&nbsp;testPaint; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;float&nbsp;minTextSize; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;float&nbsp;maxTextSize;}
随时随地看视频慕课网APP

相关分类

Android
我要回答