mirror of
https://github.com/BetterAndroid/PanguText.git
synced 2025-09-04 01:35:37 +08:00
168 lines
55 KiB
JavaScript
168 lines
55 KiB
JavaScript
import{_ as o,r as p,o as c,c as t,a as n,b as s,d as l,e as a}from"./app-6WmjFGj_.js";const i={},r=a(`<h1 id="android" tabindex="-1"><a class="header-anchor" href="#android" aria-hidden="true">#</a> Android</h1><p><img src="https://img.shields.io/maven-central/v/com.highcapable.pangutext/pangutext-android?logo=apachemaven&logoColor=orange&style=flat-square" alt="Maven Central"><span style="margin-left:5px;"></span><img src="https://img.shields.io/maven-metadata/v?metadataUrl=https%3A%2F%2Fraw.githubusercontent.com%2FHighCapable%2Fmaven-repository%2Frefs%2Fheads%2Fmain%2Frepository%2Freleases%2Fcom%2Fhighcapable%2Fpangutext%2Fpangutext-android%2Fmaven-metadata.xml&logo=apachemaven&logoColor=orange&label=highcapable-maven-releases&style=flat-square" alt="Maven metadata URL"><span style="margin-left:5px;"></span><img src="https://img.shields.io/badge/Min SDK-21-orange?logo=android&style=flat-square" alt="Android Min SDK"></p><p>这是 Android 平台的核心依赖,在 Android 平台上使用 <code>PanguText</code> 时,你需要引入此模块。</p><h2 id="配置依赖" tabindex="-1"><a class="header-anchor" href="#配置依赖" aria-hidden="true">#</a> 配置依赖</h2><p>你可以使用如下方式将此模块添加到你的项目中。</p><h3 id="sweetdependency-推荐" tabindex="-1"><a class="header-anchor" href="#sweetdependency-推荐" aria-hidden="true">#</a> SweetDependency (推荐)</h3><p>在你的项目 <code>SweetDependency</code> 配置文件中添加依赖。</p><div class="language-yaml line-numbers-mode" data-ext="yml"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#8DDB8C;">libraries</span><span style="color:#ADBAC7;">:</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#8DDB8C;">com.highcapable.pangutext</span><span style="color:#ADBAC7;">:</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#8DDB8C;">pangutext-android</span><span style="color:#ADBAC7;">:</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#8DDB8C;">version</span><span style="color:#ADBAC7;">: </span><span style="color:#96D0FF;">+</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>在你的项目 <code>build.gradle.kts</code> 中配置依赖。</p><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#DCBDFB;">implementation</span><span style="color:#ADBAC7;">(com.highcapable.pangutext.pangutext.android)</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><h3 id="version-catalog" tabindex="-1"><a class="header-anchor" href="#version-catalog" aria-hidden="true">#</a> Version Catalog</h3><p>在你的项目 <code>gradle/libs.versions.toml</code> 中添加依赖。</p><div class="language-toml line-numbers-mode" data-ext="toml"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#ADBAC7;">[</span><span style="color:#F69D50;">versions</span><span style="color:#ADBAC7;">]</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">pangutext-android = </span><span style="color:#96D0FF;">"<version>"</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#ADBAC7;">[</span><span style="color:#F69D50;">libraries</span><span style="color:#ADBAC7;">]</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">pangutext-android = { module = </span><span style="color:#96D0FF;">"com.highcapable.pangutext:pangutext-android"</span><span style="color:#ADBAC7;">, version.ref = </span><span style="color:#96D0FF;">"pangutext-android"</span><span style="color:#ADBAC7;"> }</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>在你的项目 <code>build.gradle.kts</code> 中配置依赖。</p><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#DCBDFB;">implementation</span><span style="color:#ADBAC7;">(libs.pangutext.android)</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>请将 <code><version></code> 修改为此文档顶部显示的版本。</p><h3 id="传统方式" tabindex="-1"><a class="header-anchor" href="#传统方式" aria-hidden="true">#</a> 传统方式</h3><p>在你的项目 <code>build.gradle.kts</code> 中配置依赖。</p><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#DCBDFB;">implementation</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"com.highcapable.pangutext:pangutext-android:<version>"</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>请将 <code><version></code> 修改为此文档顶部显示的版本。</p><h2 id="功能介绍" tabindex="-1"><a class="header-anchor" href="#功能介绍" aria-hidden="true">#</a> 功能介绍</h2>`,21),d={href:"https://betterandroid.github.io/PanguText/KDoc/pangutext-android",target:"_blank",rel:"noopener noreferrer"},y=a(`<h3 id="实现原理" tabindex="-1"><a class="header-anchor" href="#实现原理" aria-hidden="true">#</a> 实现原理</h3><p><code>PanguText</code> 在 Android 平台有两种方案对文本进行格式化,一种为 <code>SpannableString</code> (不破坏原始文本长度),另一种则是直接插入空白字符 (破坏原始文本长度)。</p><p>第一种方案为 <code>SpannableString</code>,它会在需要增加间距的字符的前一个字符后增加应用了间距的 <code>Span</code> 来实现文本在样式上的改变,而不实际改变字符串的内容,最后交由 <code>TextView</code> 层完成渲染 (或手动使用 <code>TextPaint</code> 基于 <code>Spanned</code> 做布局样式处理),实现无侵入式为文本设置样式。</p><p>第一种方案同样支持直接处理已经应用了样式的文本 (<code>Spanned</code>),例如通过 <code>Html.fromHtml</code> 创建的文本,<strong>但是目前尚处于实验性阶段,可能仍然会出现非预期样式错误问题</strong>, 你可以参考下方的 <a href="#%E4%B8%AA%E6%80%A7%E5%8C%96%E9%85%8D%E7%BD%AE">个性化配置</a> 选择禁用它。</p><p>动态应用 (注入) 功能主要针对 <code>EditText</code> 的输入状态,它会为 <code>EditText</code> 设置一个自定义的 <code>TextWatcher</code> 来监听输入状态,当输入状态发生变化时,从 <code>afterTextChanged</code> 中获取 <code>Editable</code> 并进行格式化。</p><p>第二种方案则是直接插入空白字符,它会直接在需要增加间距的字符后插入空白字符,这种方案会破坏原始文本的长度并且会改变文本内容自身, 但是可以不依赖于 <code>TextView</code> 层完成渲染,直接使用 <code>TextPaint</code> 绘制文本即可,适用于所有场景,<strong>但不支持动态应用 (注入)</strong>。</p><div class="custom-container warning"><p class="custom-container-title">尚未解决的问题</p><p><code>PanguText</code> 可能会与 Material 组件 <code>TextInputEditText</code>、<code>MaterialAutoCompleteTextView</code> 与 <code>TextInputLayout</code> 结合时在 <code>setHint</code> 效果上产生冲突, 因为 <code>TextView</code> 不会在测量时计算文本中的 <code>Span</code>,在单行文本中此类问题尤为明显,暂时还没有解决方案,请谨慎配合此类组件使用。</p><p>受制于上述问题,通过 <code>View.measure</code> 方法计算包含了 <code>PanguText</code> 风格的 <code>TextView</code> 宽度时也可能会出现错误。</p><p><code>PanguText</code> 目前不能处理 <code>Spanned</code> 文本中的下划线、删除线这种连续的字符,添加空白间距后线条会中断, 并且它可能会在一些特殊字符上发生样式错误或样式没有被正确应用,为了稳定性考虑请尽量不要对非常复杂的富文本启用 <code>PanguText</code> 或参考下方的 <a href="#%E4%B8%AA%E6%80%A7%E5%8C%96%E9%85%8D%E7%BD%AE">个性化配置</a> 设置 <code>excludePatterns</code>。</p></div><h3 id="集成到现有项目" tabindex="-1"><a class="header-anchor" href="#集成到现有项目" aria-hidden="true">#</a> 集成到现有项目</h3><p>将 <code>PanguText</code> 集成到你的当前项目中非常容易,你不需要改动过多代码,挑选以下你喜欢的方案进行,即可完成集成。</p><h4 id="注入布局装载器-layoutinflater" tabindex="-1"><a class="header-anchor" href="#注入布局装载器-layoutinflater" aria-hidden="true">#</a> 注入布局装载器 (LayoutInflater)</h4><p><code>PanguText</code> 支持直接注入 <code>LayoutInflater.Factory2</code> 或为当前 <code>Activity</code> 创建 <code>LayoutInflater.Factory2</code> 实例以接管整个视图, 这是推荐的集成方案,这种方式不需要修改任何现有布局即可实现无侵入式快速集成。</p><blockquote><p>示例如下</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">class</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">MainActivity</span><span style="color:#ADBAC7;"> : </span><span style="color:#F69D50;">AppCompactActivity</span><span style="color:#ADBAC7;">() {</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> binding </span><span style="color:#F47067;">by</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">lazy</span><span style="color:#ADBAC7;"> { ActivityMainBinding.</span><span style="color:#DCBDFB;">inflate</span><span style="color:#ADBAC7;">(layoutInflater) }</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">override</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">onCreate</span><span style="color:#ADBAC7;">(savedInstanceState: </span><span style="color:#F69D50;">Bundle</span><span style="color:#ADBAC7;">?) {</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">super</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">onCreate</span><span style="color:#ADBAC7;">(savedInstanceState)</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// 在这里注入</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> PanguTextFactory2.</span><span style="color:#DCBDFB;">inject</span><span style="color:#ADBAC7;">(</span><span style="color:#6CB6FF;">this</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">setContentView</span><span style="color:#ADBAC7;">(binding.root)</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">}</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="custom-container tip"><p class="custom-container-title">小提示</p><p>由于接管了 <code>LayoutInflater.Factory2</code>,所以包括类似 <code>ListView</code>、<code>RecyclerView</code> 的回收式布局也能被正确接管。</p><p>注入 <code>Activity</code> 中的 <code>LayoutInflater</code> 实例后,以下附属于当前 <code>Context</code> 的实例都会自动生效。</p><ul><li><code>Fragment</code></li><li><code>Dialog</code></li><li><code>PopupWindow</code></li><li><code>Toast</code> (在高版本系统中仅前台)</li></ul><p>基于 <code>RemoteView</code> 的布局将无法生效,因为它们是远程对象,不会使用当前 <code>Context</code> 的 <code>LayoutInflater</code> 进行布局装载。</p></div>`,14),A=n("code",null,"BetterAndroid",-1),u={href:"https://betterandroid.github.io/BetterAndroid/KDoc/ui-component/ui-component/com.highcapable.betterandroid.ui.component.activity/-app-binding-activity",target:"_blank",rel:"noopener noreferrer"},v=a(`<blockquote><p>示例如下</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">class</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">MainActivity</span><span style="color:#ADBAC7;"> : </span><span style="color:#F69D50;">AppBindingActivity</span><span style="color:#ADBAC7;"><</span><span style="color:#F69D50;">ActivityMainBinding</span><span style="color:#ADBAC7;">>() {</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">override</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">onPrepareContentView</span><span style="color:#ADBAC7;">(savedInstanceState: </span><span style="color:#F69D50;">Bundle</span><span style="color:#ADBAC7;">?): </span><span style="color:#F69D50;">LayoutInflater</span><span style="color:#ADBAC7;"> {</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> inflater </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">super</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">onPrepareContentView</span><span style="color:#ADBAC7;">(savedInstanceState)</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// 在这里注入</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> PanguTextFactory2.</span><span style="color:#DCBDFB;">inject</span><span style="color:#ADBAC7;">(inflater)</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">return</span><span style="color:#ADBAC7;"> inflater</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">override</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">onCreate</span><span style="color:#ADBAC7;">(savedInstanceState: </span><span style="color:#F69D50;">Bundle</span><span style="color:#ADBAC7;">?) {</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">super</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">onCreate</span><span style="color:#ADBAC7;">(savedInstanceState)</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Your code here.</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">}</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>如果你的应用程序没有使用 <code>AppCompatActivity</code> 也没有使用 <code>ViewBinding</code>,没有关系,你依然可以使用最初的方案进行。</p><blockquote><p>示例如下</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">class</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">MainActivity</span><span style="color:#ADBAC7;"> : </span><span style="color:#F69D50;">Activity</span><span style="color:#ADBAC7;">() {</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">override</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">onCreate</span><span style="color:#ADBAC7;">(savedInstanceState: </span><span style="color:#F69D50;">Bundle</span><span style="color:#ADBAC7;">?) {</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">super</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">onCreate</span><span style="color:#ADBAC7;">(savedInstanceState)</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// 在这里注入</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> PanguTextFactory2.</span><span style="color:#DCBDFB;">inject</span><span style="color:#ADBAC7;">(</span><span style="color:#6CB6FF;">this</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">setContentView</span><span style="color:#ADBAC7;">(R.layout.activity_main)</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">}</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="custom-container tip"><p class="custom-container-title">小提示</p><p><code>PanguTextFactory2</code> 除了可以配合 <code>Activity</code> 使用,它还支持注入到任何现有的 <code>LayoutInflater</code> 实例中,但请在 <code>LayoutInflater</code> 实例被用于装载布局前进行注入,否则将无法生效。</p></div><h4 id="使用修补工具" tabindex="-1"><a class="header-anchor" href="#使用修补工具" aria-hidden="true">#</a> 使用修补工具</h4><p>你可以使用 <code>PanguTextPatcher</code> 修补现有的 <code>View</code> 或 <code>ViewGroup</code> 实例。</p><p>修补整个根布局,<code>PanguTextPatcher</code> 会自动修补根布局下的所有 <code>TextView</code> 或继承于其的组件。</p><blockquote><p>示例如下</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#768390;">// 假设你有一个根布局</span></span>
|
||
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> root: </span><span style="color:#F69D50;">ViewGroup</span></span>
|
||
<span class="line"><span style="color:#768390;">// 修补根布局</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">PanguTextPatcher.</span><span style="color:#DCBDFB;">patch</span><span style="color:#ADBAC7;">(root)</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>修补单个 <code>View</code>,类型为 <code>TextView</code> 或继承于 <code>TextView</code> 的组件。</p><blockquote><p>示例如下</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#768390;">// 假设这就是你的 TextView</span></span>
|
||
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> textView: </span><span style="color:#F69D50;">TextView</span></span>
|
||
<span class="line"><span style="color:#768390;">// 修补单个 View</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">PanguTextPatcher.</span><span style="color:#DCBDFB;">patch</span><span style="color:#ADBAC7;">(textView)</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="custom-container warning"><p class="custom-container-title">注意</p><p>在 <code>RecyclerView</code>、<code>ListView</code>、<code>ViewPager</code> 等回收式布局中使用 <code>PanguTextPatcher</code> 时,你需要在 <code>onCreateViewHolder</code> 或 <code>onBindViewHolder</code> 中获取到 <code>itemView</code> 后进行修补,否则不会生效。</p></div><h4 id="手动注入或格式化文本" tabindex="-1"><a class="header-anchor" href="#手动注入或格式化文本" aria-hidden="true">#</a> 手动注入或格式化文本</h4><p><code>PanguText</code> 同样支持手动注入,你可以在需要的 <code>TextView</code> 或 <code>EditText</code> 上手动进行注入。</p><blockquote><p>示例如下</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#768390;">// 假设这就是你的 TextView</span></span>
|
||
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> textView: </span><span style="color:#F69D50;">TextView</span></span>
|
||
<span class="line"><span style="color:#768390;">// 假设这就是你的 EditText</span></span>
|
||
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> editText: </span><span style="color:#F69D50;">EditText</span></span>
|
||
<span class="line"><span style="color:#768390;">// 注入到现有文本</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">textView.</span><span style="color:#DCBDFB;">injectPanguText</span><span style="color:#ADBAC7;">()</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">editText.</span><span style="color:#DCBDFB;">injectPanguText</span><span style="color:#ADBAC7;">()</span></span>
|
||
<span class="line"><span style="color:#768390;">// 可以选择是否同时注入 Hint (默认是)</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">textView.</span><span style="color:#DCBDFB;">injectPanguText</span><span style="color:#ADBAC7;">(injectHint </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">false</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">editText.</span><span style="color:#DCBDFB;">injectPanguText</span><span style="color:#ADBAC7;">(injectHint </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">false</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"><span style="color:#768390;">// 动态注入,重新调用 setText 也会自动生效</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">textView.</span><span style="color:#DCBDFB;">injectRealTimePanguText</span><span style="color:#ADBAC7;">()</span></span>
|
||
<span class="line"><span style="color:#768390;">// 动态注入主要针对于 EditText 的输入状态</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">editText.</span><span style="color:#DCBDFB;">injectRealTimePanguText</span><span style="color:#ADBAC7;">()</span></span>
|
||
<span class="line"><span style="color:#768390;">// 同样可以选择是否同时注入 Hint (默认是)</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">textView.</span><span style="color:#DCBDFB;">injectRealTimePanguText</span><span style="color:#ADBAC7;">(injectHint </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">false</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">editText.</span><span style="color:#DCBDFB;">injectRealTimePanguText</span><span style="color:#ADBAC7;">(injectHint </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">false</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>PanguText</code> 还对 <code>TextView</code> 的 <code>setText</code> 方法进行了扩展,你可以使用如下方式直接设置带有 <code>PanugText</code> 样式的文本。</p><blockquote><p>示例如下</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#768390;">// 假设这就是你的 TextView</span></span>
|
||
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> textView: </span><span style="color:#F69D50;">TextView</span></span>
|
||
<span class="line"><span style="color:#768390;">// 设置带有 PanguText 样式的文本</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">textView.</span><span style="color:#DCBDFB;">setTextWithPangu</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"Xiaoming今年16岁"</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"><span style="color:#768390;">// 设置带有 PanguText 样式的 Hint</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">textView.</span><span style="color:#DCBDFB;">setHintWithPangu</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"输入Xiaoming的年龄"</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>你还可以使用 <code>PanguText.format</code> 方法直接格式化文本。</p><blockquote><p>示例如下</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#768390;">// 假设这就是你的 TextView</span></span>
|
||
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> textView: </span><span style="color:#F69D50;">TextView</span></span>
|
||
<span class="line"><span style="color:#768390;">// 使用 SpannableString 方案格式化文本</span></span>
|
||
<span class="line"><span style="color:#768390;">// 需要传入当前 TextView 的 Resources 以及字体大小</span></span>
|
||
<span class="line"><span style="color:#768390;">// 如果传入的文本自身为 Spannable 类型,则不会创建新的 SpannableString,而是返回原始对象</span></span>
|
||
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> text </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> PanguText.</span><span style="color:#DCBDFB;">format</span><span style="color:#ADBAC7;">(textView.resources, textView.textSize, </span><span style="color:#96D0FF;">"Xiaoming今年16岁"</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"><span style="color:#768390;">// 设置文本</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">textView.text </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> text</span></span>
|
||
<span class="line"><span style="color:#768390;">// 直接使用空白字符以插入破坏的方式格式化文本</span></span>
|
||
<span class="line"><span style="color:#768390;">// 这个方案会为文本增加额外的空白字符 " " (HSP)</span></span>
|
||
<span class="line"><span style="color:#768390;">// 下方的结果会输出字符串 "Xiaoming 今年 16 岁"</span></span>
|
||
<span class="line"><span style="color:#768390;">// 你也可以在方法末位自定义要使用的空白字符</span></span>
|
||
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> text </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> PanguText.</span><span style="color:#DCBDFB;">format</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"Xiaoming今年16岁"</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"><span style="color:#768390;">// 设置文本</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">textView.text </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> text</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="custom-container tip"><p class="custom-container-title">小提示</p><p><code>injectPanguText</code>、<code>injectRealTimePanguText</code>、<code>setTextWithPangu</code>、<code>setHintWithPangu</code>、<code>PanguText.format</code> 方法支持 <code>config</code> 参数,你可以参考下方的 <a href="#%E4%B8%AA%E6%80%A7%E5%8C%96%E9%85%8D%E7%BD%AE">个性化配置</a>。</p></div><h4 id="自定义-view" tabindex="-1"><a class="header-anchor" href="#自定义-view" aria-hidden="true">#</a> 自定义 View</h4><p><code>PanguText</code> 还可以配合自定义 <code>View</code> 进行使用,你可以将你的 <code>View</code> 继承到 <code>AppCompatTextView</code> 并重写 <code>setText</code> 方法。</p><blockquote><p>示例如下</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">class</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">MyTextView</span><span style="color:#ADBAC7;">(context: </span><span style="color:#F69D50;">Context</span><span style="color:#ADBAC7;">, attrs: </span><span style="color:#F69D50;">AttributeSet</span><span style="color:#ADBAC7;">? </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">null</span><span style="color:#ADBAC7;">) : </span><span style="color:#F69D50;">AppCompatTextView</span><span style="color:#ADBAC7;">(</span><span style="color:#F69D50;">context</span><span style="color:#ADBAC7;">, </span><span style="color:#F69D50;">attrs</span><span style="color:#ADBAC7;">) {</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">override</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">setText</span><span style="color:#ADBAC7;">(text: </span><span style="color:#F69D50;">CharSequence</span><span style="color:#ADBAC7;">?, type: </span><span style="color:#F69D50;">BufferType</span><span style="color:#ADBAC7;">?) {</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// 在这里手动进行注入</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> panguText </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> text?.</span><span style="color:#DCBDFB;">let</span><span style="color:#ADBAC7;"> { PanguText.</span><span style="color:#DCBDFB;">format</span><span style="color:#ADBAC7;">(resources, textSize, it) }</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">super</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">setText</span><span style="color:#ADBAC7;">(panguText, type)</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">}</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="custom-container warning"><p class="custom-container-title">注意</p><p><code>TextView</code> 在注入 <code>PanguText</code> 后,如果你在 XML 布局中使用了 <code>android:singleLine="true"</code> 或在代码中使用了 <code>TextView.setSingleLine(true)</code> 并且配合 <code>android:elipsize="..."</code>, 那么这种方式设置单行文本可能会造成文本超出屏幕后其中会中显示出无法解析的 <code>OBJ</code> 字符 (被省略号截断),因为 <code>TextView</code> 不会在测量时计算文本中的 <code>Span</code>,这会导致文本宽度计算错误。 解决方案为在 XML 布局中使用 <code>android:maxLines="1"</code> 或在代码中使用 <code>TextView.setMaxLines(1)</code> 来代替。</p><blockquote><p>示例如下</p></blockquote><div class="language-xml line-numbers-mode" data-ext="xml"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#ADBAC7;"><</span><span style="color:#8DDB8C;">TextView</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">android:id</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"@+id/text"</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">android:layout_width</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"wrap_content"</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">android:layout_height</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"wrap_content"</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">android:text</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"这是一段很长很长长长长长长长长长长长长还有English混入的的文本"</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">android:maxLines</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"1"</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">android:ellipsize</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"end"</span><span style="color:#ADBAC7;"> /></span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div><h3 id="个性化配置" tabindex="-1"><a class="header-anchor" href="#个性化配置" aria-hidden="true">#</a> 个性化配置</h3><p><code>PanguText</code> 支持个性化配置,你可以使用全局静态实例 <code>PanguText.globalConfig</code> 获取全局配置,或单独进行配置。</p><blockquote><p>示例如下</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#768390;">// 获取全局配置</span></span>
|
||
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> config </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> PanguText.globalConfig</span></span>
|
||
<span class="line"><span style="color:#768390;">// 开关,禁用将使所有功能失效</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">config.isEnabled </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">true</span></span>
|
||
<span class="line"><span style="color:#768390;">// 处理 Spanned 文本</span></span>
|
||
<span class="line"><span style="color:#768390;">// Spanned 文本处理默认启用,但此功能尚处于实验性阶段,</span></span>
|
||
<span class="line"><span style="color:#768390;">// 如果发生问题你可以选择禁用,禁用后遇到 Spanned 文本将返回原始文本</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">config.isProcessedSpanned </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">true</span></span>
|
||
<span class="line"><span style="color:#768390;">// 是否要在处理后自动重新测量文本宽度</span></span>
|
||
<span class="line"><span style="color:#768390;">// 注意:[PanguText] 注入文本并更改文本后,[TextView] 的宽度将不会自动计算</span></span>
|
||
<span class="line"><span style="color:#768390;">// 目前,此功能将调用 [TextView.setText] 重新执行测量结果,</span></span>
|
||
<span class="line"><span style="color:#768390;">// 该测量可以在某些动态布局 (例如 \`RecyclerView\`) 中每次修复文本宽度,</span></span>
|
||
<span class="line"><span style="color:#768390;">// 但可能会导致性能问题,你可以选择禁用此功能</span></span>
|
||
<span class="line"><span style="color:#768390;">// 为了防止不必要的性能开销,此功能仅在 \`maxlines\` 设置为 1 或 \`singleLine\` 的 [TextView] 上生效</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">config.isAutoRemeasureText </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">true</span></span>
|
||
<span class="line"><span style="color:#768390;">// 设置在格式化过程中以正则形式定义需要排除的内容</span></span>
|
||
<span class="line"><span style="color:#768390;">// 例如排除全部 URL</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">config.excludePatterns.</span><span style="color:#DCBDFB;">add</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"https?://</span><span style="color:#F47067;">\\\\</span><span style="color:#96D0FF;">S+"</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">toRegex</span><span style="color:#ADBAC7;">())</span></span>
|
||
<span class="line"><span style="color:#768390;">// 例如排除类似 "[doge]" 的 emoji 占位符,</span></span>
|
||
<span class="line"><span style="color:#768390;">// 如果你需要使用 [ImageSpan] 显示 emoji 图片,你可以选择排除这些占位符</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">config.excludePatterns.</span><span style="color:#DCBDFB;">add</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"</span><span style="color:#F47067;">\\\\</span><span style="color:#96D0FF;">[.*?]"</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">toRegex</span><span style="color:#ADBAC7;">())</span></span>
|
||
<span class="line"><span style="color:#768390;">// 设置 CJK 空白占位间距比例</span></span>
|
||
<span class="line"><span style="color:#768390;">// 这会决定最终的排版效果,建议保持默认比例,然后再以此跟随个人喜好进行调整</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">config.cjkSpacingRatio </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">7f</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="custom-container warning"><p class="custom-container-title">注意</p><p>如果你使用了 <a href="#%E6%B3%A8%E5%85%A5%E5%B8%83%E5%B1%80%E8%A3%85%E8%BD%BD%E5%99%A8-layoutinflater">注入布局装载器</a> 的方案进行集成,请在 <code>PanguTextFactory2.inject(...)</code> 执行前配置 <code>PanguText.globalConfig</code>,否则配置将无法生效。</p></div><p>你还可以在手动注入或格式化文本时传入 <code>config</code> 参数以进行个性化配置。</p><blockquote><p>示例如下</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#768390;">// 假设这就是你的 TextView</span></span>
|
||
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> textView: </span><span style="color:#F69D50;">TextView</span></span>
|
||
<span class="line"><span style="color:#768390;">// 创建一个新配置</span></span>
|
||
<span class="line"><span style="color:#768390;">// 你可以设置 [copyFromGlobal] 为 false 来不从全局配置中复制配置</span></span>
|
||
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> config </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">PanguTextConfig</span><span style="color:#ADBAC7;">(copyFromGlobal </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">false</span><span style="color:#ADBAC7;">) {</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> excludePatterns.</span><span style="color:#DCBDFB;">add</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"https?://</span><span style="color:#F47067;">\\\\</span><span style="color:#96D0FF;">S+"</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">toRegex</span><span style="color:#ADBAC7;">())</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> excludePatterns.</span><span style="color:#DCBDFB;">add</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"</span><span style="color:#F47067;">\\\\</span><span style="color:#96D0FF;">[.*?]"</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">toRegex</span><span style="color:#ADBAC7;">())</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> cjkSpacingRatio </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">7f</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">}</span></span>
|
||
<span class="line"><span style="color:#768390;">// 你还可以从任意一个配置中复制并创建新配置</span></span>
|
||
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> config2 </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> config.</span><span style="color:#DCBDFB;">copy</span><span style="color:#ADBAC7;"> {</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> excludePatterns.</span><span style="color:#DCBDFB;">clear</span><span style="color:#ADBAC7;">()</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> excludePatterns.</span><span style="color:#DCBDFB;">add</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"https?://</span><span style="color:#F47067;">\\\\</span><span style="color:#96D0FF;">S+"</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">toRegex</span><span style="color:#ADBAC7;">())</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> excludePatterns.</span><span style="color:#DCBDFB;">add</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"</span><span style="color:#F47067;">\\\\</span><span style="color:#96D0FF;">[.*?]"</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">toRegex</span><span style="color:#ADBAC7;">())</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> cjkSpacingRatio </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">7f</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">}</span></span>
|
||
<span class="line"><span style="color:#768390;">// 手动注入并配置</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">textView.</span><span style="color:#DCBDFB;">injectPanguText</span><span style="color:#ADBAC7;">(config </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> config2)</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>如果你使用了 <a href="#%E6%B3%A8%E5%85%A5%E5%B8%83%E5%B1%80%E8%A3%85%E8%BD%BD%E5%99%A8-layoutinflater">注入布局装载器</a> 的方案进行集成,你可以在 <code>TextView</code>、<code>EditText</code> 或继承于它们的 XML 布局声明中使用以下属性来进行个性化配置。</p><ul><li><code>panguText_enabled</code> 对应 <code>PanguTextConfig.isEnabled</code></li><li><code>panguText_processedSpanned</code> 对应 <code>PanguTextConfig.isProcessedSpanned</code></li><li><code>panguText_autoRemeasureText</code> 对应 <code>PanguTextConfig.isAutoRemeasureText</code></li><li><code>panguText_excludePatterns</code> 对应 <code>PanguTextConfig.excludePatterns</code>,字符串数组,多个使用 <code>|@|</code> 分隔</li><li><code>panguText_cjkSpacingRatio</code> 对应 <code>PanguTextConfig.cjkSpacingRatio</code></li></ul><blockquote><p>示例如下</p></blockquote><div class="language-xml line-numbers-mode" data-ext="xml"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#ADBAC7;"><</span><span style="color:#8DDB8C;">TextView</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">android:id</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"@+id/text"</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">android:layout_width</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"wrap_content"</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">android:layout_height</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"wrap_content"</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">android:text</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"Xiaoming今年16岁"</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">app:panguText_enabled</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"true"</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">app:panguText_processedSpanned</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"true"</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">app:panguText_autoRemeasureText</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"true"</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">app:panguText_excludePatterns</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"https?://\\\\S+;\\\\[.*?]|@|\\\\[.*?]"</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">app:panguText_cjkSpacingRatio</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"7.0"</span><span style="color:#ADBAC7;"> /></span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="custom-container warning"><p class="custom-container-title">注意</p><p>由于 Android Studio 的问题,上述属性可能不会有补全提示,请自行补全。</p><p>不要忘记加入声明 <code>xmlns:app="http://schemas.android.com/apk/res-auto"</code>。</p></div><p>在自定义 <code>View</code> 中,你可以将你的 <code>View</code> 继承于 <code>PanguTextView</code> 接口以同样实现上述功能,此功能对 <a href="#%E4%BD%BF%E7%94%A8%E4%BF%AE%E8%A1%A5%E5%B7%A5%E5%85%B7">使用修补工具</a> 方案同样有效。</p><blockquote><p>示例如下</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">class</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">MyTextView</span><span style="color:#ADBAC7;">(context: </span><span style="color:#F69D50;">Context</span><span style="color:#ADBAC7;">, attrs: </span><span style="color:#F69D50;">AttributeSet</span><span style="color:#ADBAC7;">? </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">null</span><span style="color:#ADBAC7;">) : </span><span style="color:#F69D50;">AppCompatTextView</span><span style="color:#ADBAC7;">(</span><span style="color:#F69D50;">context</span><span style="color:#ADBAC7;">, </span><span style="color:#F69D50;">attrs</span><span style="color:#ADBAC7;">),</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">PanguTextView</span><span style="color:#ADBAC7;"> {</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">override</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">configurePanguText</span><span style="color:#ADBAC7;">(config: </span><span style="color:#F69D50;">PanguTextConfig</span><span style="color:#ADBAC7;">) {</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// 配置你的 [PanguTextConfig]</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">}</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="custom-container warning"><p class="custom-container-title">注意</p><p><code>PanguTextView</code> 接口的优先级将高于直接在 XML 布局中使用的属性,如果你同时使用了这两种方式进行配置,<code>PanguTextView</code> 接口的配置将覆盖 XML 布局中的配置。</p><p>单独配置将覆盖全局配置,未配置的选项将跟随全局配置。</p></div>`,48);function D(B,C){const e=p("ExternalLinkIcon");return c(),t("div",null,[r,n("p",null,[s("你可以 "),n("a",d,[s("点击这里"),l(e)]),s(" 查看 KDoc。")]),y,n("p",null,[s("如果你正在使用 "),A,s(" 中的 "),n("a",u,[s("ui-compoment → AppBindingActivity"),l(e)]),s(",你需要稍微改动当前代码。")]),v])}const b=o(i,[["render",D],["__file","android.html.vue"]]);export{b as default};
|