說(shuō)明
在Android開(kāi)發(fā)中部分場(chǎng)景UI會(huì)要求根據(jù)寬度自適應(yīng)字體大小的需求忍饰,下面就簡(jiǎn)單來(lái)說(shuō)明一下怎么實(shí)現(xiàn)。
autoSizeTextType屬性
在Android 8.0 (API level 26)以上,Android提供了autoSizeTextType屬性软免,不過(guò)通過(guò)萬(wàn)能的拓展庫(kù)中的AppCompatTextView可以最低支持到Android 4.0(API Level 14)及以上的系統(tǒng)(不過(guò)你的應(yīng)用編譯的targetSDKVersion必須在26及以上)吊洼。所以現(xiàn)在可以用這個(gè)屬性直接實(shí)現(xiàn)奸远,在之前是需用自定義Textview去實(shí)現(xiàn)的磅氨,既然有了就不再去解釋之前的用法了尺栖。既要使用autoSizeTextType屬性,又要實(shí)現(xiàn)兼容烦租,注意使用AppCompatTextView代替TextView
autoSizeTextType參數(shù)介紹:none: 關(guān)閉自動(dòng)調(diào)整功能决瞳;uniform: 均勻縮放水平軸和垂直軸
示例1
//布局文件中直接使用
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tx2"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="發(fā)發(fā)呆幾個(gè)豐富"
android:maxLines="1"
android:ellipsize="end"
app:autoSizeTextType="uniform"
app:autoSizeMaxTextSize="50sp"
app:autoSizeMinTextSize="4sp"
app:autoSizeStepGranularity="1sp"
android:gravity="center_vertical"/>
//代碼中使用
binding.tx2.text = "就發(fā)發(fā)發(fā)發(fā)達(dá)"
binding.tx2.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM)
binding.tx2.setAutoSizeTextTypeUniformWithConfiguration(1,200,1,TypedValue.COMPLEX_UNIT_DIP)
布局文件中參數(shù)介紹:
autoSizeMaxTextSize:最大值;
autoSizeMinTextSize:最小值左权;
autoSizeStepGranularity:粒度值,即每次增量或減量的值(允許TextView在MinTextSize-MaxTextSize之間按StepGranularity的值為增量或減量來(lái)跳動(dòng))痴颊;
autoSizeTextType:none: 關(guān)閉自動(dòng)調(diào)整功能赏迟;uniform: 均勻縮放水平軸和垂直軸;
默認(rèn)設(shè)置:
1蠢棱,粒度xml設(shè)置時(shí)必須設(shè)置autoSizeTextType="uniform"锌杀,代碼設(shè)置setAutoSizeTextTypeUniformWithConfiguration時(shí)則已設(shè)置甩栈;
2,默認(rèn)設(shè)置其實(shí)minTextSize = 12sp糕再、maxTextSize = 112sp量没、granularity = 1px的粒度設(shè)置;
示例2:
<array name="auto_size_text_sizes">
<item>10sp</item>
<item>15sp</item>
<item>20sp</item>
<item>40sp</item>
<item>100sp</item>
</array>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tx2"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="發(fā)發(fā)呆幾個(gè)豐富fafasfasdfasdfasdfadsffghffhgfhgfhgfhgf"
android:maxLines="1"
android:ellipsize="end"
app:autoSizeTextType="uniform"
app:autoSizePresetSizes="@array/auto_size_text_sizes"
android:gravity="center_vertical"
tools:ignore="MissingConstraints" />
//代碼中設(shè)置
binding.tx1.text = "就發(fā)發(fā)發(fā)發(fā)達(dá)的飛灑發(fā)是發(fā)送到發(fā)"
val presetSizes = intArrayOf(10,15,20,25,30)
binding.tx1.setAutoSizeTextTypeUniformWithPresetSizes(presetSizes,TypedValue.COMPLEX_UNIT_SP)
預(yù)設(shè)大小突想,根據(jù)給的值自動(dòng)調(diào)整字體大小殴蹄,不連續(xù),autoSizePresetSizes:預(yù)設(shè)大小的數(shù)組猾担,建議放到res/values/arrays.xml文件里袭灯。
總結(jié)
還有2點(diǎn)需注意:
1:要設(shè)置android:maxLines="n",n可以是任意值绑嘹,不一定是1稽荧,目的就是讓其發(fā)揮作用,不能用android:singleLine="true"工腋;
2:該功能只針對(duì)已經(jīng)存在的TextView的text有效姨丈,如果你setText()或append()后改變了text,則改變后不會(huì)自適應(yīng);因此在調(diào)用setText()或append()后擅腰,要重新通過(guò)代碼調(diào)用TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration()方法蟋恬。