mirror of
https://github.com/BetterAndroid/PanguText.git
synced 2025-09-09 03:54:04 +08:00
Deploy to GitHub pages
This commit is contained in:
1
assets/404.html-6Yl8cQE3.js
Normal file
1
assets/404.html-6Yl8cQE3.js
Normal file
@@ -0,0 +1 @@
|
||||
const t=JSON.parse('{"key":"v-3706649a","path":"/404.html","title":"","lang":"en-US","frontmatter":{"layout":"NotFound"},"headers":[],"git":{},"filePathRelative":null}');export{t as data};
|
1
assets/404.html-YkmvtGWa.js
Normal file
1
assets/404.html-YkmvtGWa.js
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as e,o as c,c as t}from"./app-6WmjFGj_.js";const _={};function o(r,n){return c(),t("div")}const a=e(_,[["render",o],["__file","404.html.vue"]]);export{a as default};
|
1
assets/about.html-TshJpOH8.js
Normal file
1
assets/about.html-TshJpOH8.js
Normal file
@@ -0,0 +1 @@
|
||||
const e=JSON.parse('{"key":"v-7a15fe3b","path":"/en/about/about.html","title":"About This Document","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"License","slug":"license","link":"#license","children":[]}],"git":{"updatedTime":1744552535000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/about/about.md"}');export{e as data};
|
16
assets/about.html-bq8LJH03.js
Normal file
16
assets/about.html-bq8LJH03.js
Normal file
@@ -0,0 +1,16 @@
|
||||
import{_ as o,r as t,o as c,c as l,a,b as e,d as n,e as p}from"./app-6WmjFGj_.js";const r={},i=a("h1",{id:"关于此文档",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#关于此文档","aria-hidden":"true"},"#"),e(" 关于此文档")],-1),d={href:"https://v2.vuepress.vuejs.org/zh",target:"_blank",rel:"noopener noreferrer"},h=a("h2",{id:"许可证",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#许可证","aria-hidden":"true"},"#"),e(" 许可证")],-1),b={href:"https://github.com/BetterAndroid/PanguText/blob/main/LICENSE",target:"_blank",rel:"noopener noreferrer"},u=p(`<div class="language-text" data-ext="text"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#adbac7;">Apache License Version 2.0</span></span>
|
||||
<span class="line"><span style="color:#adbac7;"></span></span>
|
||||
<span class="line"><span style="color:#adbac7;">Copyright (C) 2019 HighCapable</span></span>
|
||||
<span class="line"><span style="color:#adbac7;"></span></span>
|
||||
<span class="line"><span style="color:#adbac7;">Licensed under the Apache License, Version 2.0 (the "License");</span></span>
|
||||
<span class="line"><span style="color:#adbac7;">you may not use this file except in compliance with the License.</span></span>
|
||||
<span class="line"><span style="color:#adbac7;">You may obtain a copy of the License at</span></span>
|
||||
<span class="line"><span style="color:#adbac7;"></span></span>
|
||||
<span class="line"><span style="color:#adbac7;"> https://www.apache.org/licenses/LICENSE-2.0</span></span>
|
||||
<span class="line"><span style="color:#adbac7;"></span></span>
|
||||
<span class="line"><span style="color:#adbac7;">Unless required by applicable law or agreed to in writing, software</span></span>
|
||||
<span class="line"><span style="color:#adbac7;">distributed under the License is distributed on an "AS IS" BASIS,</span></span>
|
||||
<span class="line"><span style="color:#adbac7;">WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></span>
|
||||
<span class="line"><span style="color:#adbac7;">See the License for the specific language governing permissions and</span></span>
|
||||
<span class="line"><span style="color:#adbac7;">limitations under the License.</span></span>
|
||||
<span class="line"><span style="color:#adbac7;"></span></span></code></pre></div><p>版权所有 © 2019 HighCapable</p>`,2);function _(y,g){const s=t("ExternalLinkIcon");return c(),l("div",null,[i,a("blockquote",null,[a("p",null,[e("此文档由 "),a("a",d,[e("VuePress"),n(s)]),e(" 强力驱动。")])]),h,a("p",null,[a("a",b,[e("Apache-2.0"),n(s)])]),u])}const m=o(r,[["render",_],["__file","about.html.vue"]]);export{m as default};
|
16
assets/about.html-pwF3sebZ.js
Normal file
16
assets/about.html-pwF3sebZ.js
Normal file
@@ -0,0 +1,16 @@
|
||||
import{_ as t,r as o,o as c,c as l,a as e,b as a,d as n,e as p}from"./app-6WmjFGj_.js";const i={},r=e("h1",{id:"about-this-document",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#about-this-document","aria-hidden":"true"},"#"),a(" About This Document")],-1),d={href:"https://v2.vuepress.vuejs.org/en",target:"_blank",rel:"noopener noreferrer"},h=e("h2",{id:"license",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#license","aria-hidden":"true"},"#"),a(" License")],-1),u={href:"https://github.com/BetterAndroid/PanguText/blob/main/LICENSE",target:"_blank",rel:"noopener noreferrer"},b=p(`<div class="language-text" data-ext="text"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#adbac7;">Apache License Version 2.0</span></span>
|
||||
<span class="line"><span style="color:#adbac7;"></span></span>
|
||||
<span class="line"><span style="color:#adbac7;">Copyright (C) 2019 HighCapable</span></span>
|
||||
<span class="line"><span style="color:#adbac7;"></span></span>
|
||||
<span class="line"><span style="color:#adbac7;">Licensed under the Apache License, Version 2.0 (the "License");</span></span>
|
||||
<span class="line"><span style="color:#adbac7;">you may not use this file except in compliance with the License.</span></span>
|
||||
<span class="line"><span style="color:#adbac7;">You may obtain a copy of the License at</span></span>
|
||||
<span class="line"><span style="color:#adbac7;"></span></span>
|
||||
<span class="line"><span style="color:#adbac7;"> https://www.apache.org/licenses/LICENSE-2.0</span></span>
|
||||
<span class="line"><span style="color:#adbac7;"></span></span>
|
||||
<span class="line"><span style="color:#adbac7;">Unless required by applicable law or agreed to in writing, software</span></span>
|
||||
<span class="line"><span style="color:#adbac7;">distributed under the License is distributed on an "AS IS" BASIS,</span></span>
|
||||
<span class="line"><span style="color:#adbac7;">WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></span>
|
||||
<span class="line"><span style="color:#adbac7;">See the License for the specific language governing permissions and</span></span>
|
||||
<span class="line"><span style="color:#adbac7;">limitations under the License.</span></span>
|
||||
<span class="line"><span style="color:#adbac7;"></span></span></code></pre></div><p>Copyright © 2019 HighCapable</p>`,2);function _(y,m){const s=o("ExternalLinkIcon");return c(),l("div",null,[r,e("blockquote",null,[e("p",null,[a("This document is powered by "),e("a",d,[a("VuePress"),n(s)]),a(".")])]),h,e("p",null,[e("a",u,[a("Apache-2.0"),n(s)])]),b])}const f=t(i,[["render",_],["__file","about.html.vue"]]);export{f as default};
|
1
assets/about.html-y0__MDXj.js
Normal file
1
assets/about.html-y0__MDXj.js
Normal file
@@ -0,0 +1 @@
|
||||
const t=JSON.parse('{"key":"v-41967128","path":"/zh-cn/about/about.html","title":"关于此文档","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"许可证","slug":"许可证","link":"#许可证","children":[]}],"git":{"updatedTime":1744552535000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"zh-cn/about/about.md"}');export{t as data};
|
1
assets/android.html-C0sED2vr.js
Normal file
1
assets/android.html-C0sED2vr.js
Normal file
@@ -0,0 +1 @@
|
||||
const e=JSON.parse('{"key":"v-cc15e9aa","path":"/en/library/android.html","title":"Android","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Configure Dependency","slug":"configure-dependency","link":"#configure-dependency","children":[{"level":3,"title":"SweetDependency (Recommended)","slug":"sweetdependency-recommended","link":"#sweetdependency-recommended","children":[]},{"level":3,"title":"Version Catalog","slug":"version-catalog","link":"#version-catalog","children":[]},{"level":3,"title":"Traditional Method","slug":"traditional-method","link":"#traditional-method","children":[]}]},{"level":2,"title":"Function Introduction","slug":"function-introduction","link":"#function-introduction","children":[{"level":3,"title":"Implementation Principle","slug":"implementation-principle","link":"#implementation-principle","children":[]},{"level":3,"title":"Integrate into Existing Projects","slug":"integrate-into-existing-projects","link":"#integrate-into-existing-projects","children":[]},{"level":3,"title":"Personalized Configuration","slug":"personalized-configuration","link":"#personalized-configuration","children":[]}]}],"git":{"updatedTime":1754158640000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":8}]},"filePathRelative":"en/library/android.md"}');export{e as data};
|
171
assets/android.html-XQpTmuqf.js
Normal file
171
assets/android.html-XQpTmuqf.js
Normal file
@@ -0,0 +1,171 @@
|
||||
import{_ as o,r as t,o as i,c as p,a as e,b as s,d as l,e as n}from"./app-6WmjFGj_.js";const c={},r=n(`<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>This is the core dependency for the Android platform. When using <code>PanguText</code> on Android, you need to include this module.</p><h2 id="configure-dependency" tabindex="-1"><a class="header-anchor" href="#configure-dependency" aria-hidden="true">#</a> Configure Dependency</h2><p>You can add this module to your project using the following method.</p><h3 id="sweetdependency-recommended" tabindex="-1"><a class="header-anchor" href="#sweetdependency-recommended" aria-hidden="true">#</a> SweetDependency (Recommended)</h3><p>Add dependency in your project's <code>SweetDependency</code> configuration file.</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>Configure dependency in your project's <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>Add dependency in your project's <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>Configure dependency in your project's <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>Please change <code><version></code> to the version displayed at the top of this document.</p><h3 id="traditional-method" tabindex="-1"><a class="header-anchor" href="#traditional-method" aria-hidden="true">#</a> Traditional Method</h3><p>Configure dependency in your project's <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>Please change <code><version></code> to the version displayed at the top of this document.</p><h2 id="function-introduction" tabindex="-1"><a class="header-anchor" href="#function-introduction" aria-hidden="true">#</a> Function Introduction</h2>`,21),d={href:"https://betterandroid.github.io/PanguText/KDoc/pangutext-android",target:"_blank",rel:"noopener noreferrer"},u=n(`<h3 id="implementation-principle" tabindex="-1"><a class="header-anchor" href="#implementation-principle" aria-hidden="true">#</a> Implementation Principle</h3><p><code>PanguText</code> provides two methods for text formatting on the Android platform: <code>SpannableString</code> (does not alter the original text length) and direct insertion of whitespace characters (alters the original text length).</p><p>The first method, <code>SpannableString</code>, adds a <code>Span</code> with spacing to the character before the one that needs spacing, changing the text style without altering the string content. The rendering is done by the <code>TextView</code> layer (or manually using <code>TextPaint</code> based on <code>Spanned</code> for layout styling), achieving non-intrusive text styling.</p><p>This method also supports processing already styled text (<code>Spanned</code>), such as text created via <code>Html.fromHtml</code>.</p><p><strong>However, it is currently experimental and may still have unexpected style errors</strong>. You can refer to the <a href="#personalized-configuration">Personalized Configuration</a> section below to disable it.</p><p>The dynamic application (injection) feature mainly targets the input state of <code>EditText</code>. It sets a custom <code>TextWatcher</code> for <code>EditText</code> to monitor input changes and formats the text from <code>afterTextChanged</code>.</p><p>The second method directly inserts whitespace characters after the characters that need spacing. This method alters the original text length and content but does not rely on the <code>TextView</code> layer for rendering. It uses <code>TextPaint</code> to draw the text directly, suitable for all scenarios, <strong>but does not support dynamic application (injection)</strong>.</p><div class="custom-container warning"><p class="custom-container-title">Unresolved Issues</p><p><code>PanguText</code> may conflict with Material components like <code>TextInputEditText</code>, <code>MaterialAutoCompleteTextView</code>, and <code>TextInputLayout</code> when using <code>setHint</code>, as <code>TextView</code> does not account for <code>Span</code> during measurement. This issue is particularly noticeable in single-line text, and there is no solution yet. Use these components cautiously.</p><p>Due to the above issue, calculating the width of a <code>TextView</code> with <code>PanguText</code> style using the <code>View.measure</code> method may also result in errors.</p><p><code>PanguText</code> currently cannot handle continuous characters like underlines or strikethroughs in <code>Spanned</code> text, as the lines will break after adding spacing. It may also cause style errors or fail to apply styles correctly to some special characters. For stability, avoid enabling <code>PanguText</code> for very complex rich text or refer to the <a href="#personalized-configuration">Personalized Configuration</a> section to set <code>excludePatterns</code>.</p></div><h3 id="integrate-into-existing-projects" tabindex="-1"><a class="header-anchor" href="#integrate-into-existing-projects" aria-hidden="true">#</a> Integrate into Existing Projects</h3><p>Integrating <code>PanguText</code> into your current project is very easy. You don't need to change much code. Choose your preferred method below to complete the integration.</p><h4 id="inject-to-layoutinflater" tabindex="-1"><a class="header-anchor" href="#inject-to-layoutinflater" aria-hidden="true">#</a> Inject to LayoutInflater</h4><p><code>PanguText</code> supports direct injection of <code>LayoutInflater.Factory2</code> or creating a <code>LayoutInflater.Factory2</code> instance for the current <code>Activity</code> to take over the entire view layout inflation. This is the recommended integration method, as it allows for non-intrusive and quick integration without modifying any existing layouts.</p><blockquote><p>The following example</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;">AppCompatActivity</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;">// Inject here.</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">Tips</p><p>Since <code>LayoutInflater.Factory2</code> is taken over, recycled layouts like <code>ListView</code> and <code>RecyclerView</code> can also be correctly handled.</p><p>After injecting the <code>LayoutInflater</code> instance in the <code>Activity</code>, the following instances attached to the current <code>Context</code> will automatically take effect:</p><ul><li><code>Fragment</code></li><li><code>Dialog</code></li><li><code>PopupWindow</code></li><li><code>Toast</code> (foreground only in higher system versions)</li></ul><p>Layouts based on <code>RemoteView</code> will not take effect because they are remote objects and do not use the current <code>Context</code>'s <code>LayoutInflater</code> for layout inflation.</p></div>`,15),y={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"},A=e("code",null,"BetterAndroid",-1),m=n(`<blockquote><p>The following example</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;">// Inject here.</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 style="color:#ADBAC7;"> </span></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>If your application does not use <code>AppCompatActivity</code> or <code>ViewBinding</code>, don't worry, you can still use the original method.</p><blockquote><p>The following example</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;">// Inject here.</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">Tips</p><p><code>PanguTextFactory2</code> can be used not only with <code>Activity</code> but also injected into any existing <code>LayoutInflater</code> instance. However, please inject it before the <code>LayoutInflater</code> instance is used to inflate the layout, otherwise it will not take effect.</p></div><h4 id="using-the-patching-tool" tabindex="-1"><a class="header-anchor" href="#using-the-patching-tool" aria-hidden="true">#</a> Using the Patching Tool</h4><p>You can use <code>PanguTextPatcher</code> to patch existing <code>View</code> or <code>ViewGroup</code> instances.</p><p>Patch the entire root layout, and <code>PanguTextPatcher</code> will automatically patch all <code>TextView</code> instances or their subclasses under the root layout.</p><blockquote><p>The following example</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;">// Assume you have a root layout.</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;">// Patch the root layout.</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>Patch a single <code>View</code>, which is of type <code>TextView</code> or a subclass of <code>TextView</code>.</p><blockquote><p>The following example</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;">// Assume this is your 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;">// Patch a single 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">Notice</p><p>When using <code>PanguTextPatcher</code> in recycled layouts such as <code>RecyclerView</code>, <code>ListView</code>, or <code>ViewPager</code>, you need to patch the <code>itemView</code> in <code>onCreateViewHolder</code> or <code>onBindViewHolder</code>, otherwise it will not take effect.</p></div><h4 id="manual-injection-or-text-formatting" tabindex="-1"><a class="header-anchor" href="#manual-injection-or-text-formatting" aria-hidden="true">#</a> Manual Injection or Text Formatting</h4><p><code>PanguText</code> also supports manual injection, allowing you to inject it into the desired <code>TextView</code> or <code>EditText</code>.</p><blockquote><p>The following example</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;">// Assume this is your 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;">// Assume this is your 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;">// Inject into existing text.</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;">// Optionally choose whether to inject Hint (default is true).</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;">// Dynamic injection, re-calling setText will automatically take effect.</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;">// Dynamic injection mainly targets the input state of 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;">// Optionally choose whether to inject Hint (default is true).</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> also extends the <code>setText</code> method of <code>TextView</code>, allowing you to directly set text with <code>PanguText</code> style.</p><blockquote><p>The following example</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;">// Assume this is your 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;">// Set text with PanguText style.</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;">// Set Hint with PanguText style.</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>You can also use the <code>PanguText.format</code> method to directly format text.</p><blockquote><p>The following example</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;">// Assume this is your 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;">// Format text using SpannableString method.</span></span>
|
||||
<span class="line"><span style="color:#768390;">// Requires passing the current TextView's Resources and text size.</span></span>
|
||||
<span class="line"><span style="color:#768390;">// If the input text is already Spannable,</span></span>
|
||||
<span class="line"><span style="color:#768390;">// it will return the original object without creating a new 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;">// Set text.</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;">// Directly format text using whitespace characters for insertion.</span></span>
|
||||
<span class="line"><span style="color:#768390;">// This method adds extra whitespace characters " " (HSP) to the text.</span></span>
|
||||
<span class="line"><span style="color:#768390;">// The result below will output the string "Xiaoming 今年 16 岁".</span></span>
|
||||
<span class="line"><span style="color:#768390;">// You can also customize the whitespace character at the end of the method.</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;">// Set text.</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 class="line-number"></div></div></div><div class="custom-container tip"><p class="custom-container-title">Tips</p><p>The <code>injectPanguText</code>, <code>injectRealTimePanguText</code>, <code>setTextWithPangu</code>, <code>setHintWithPangu</code>, and <code>PanguText.format</code> methods support the <code>config</code> parameter. You can refer to the <a href="#personalized-configuration">Personalized Configuration</a> section below.</p></div><h4 id="custom-view" tabindex="-1"><a class="header-anchor" href="#custom-view" aria-hidden="true">#</a> Custom View</h4><p><code>PanguText</code> can also be used with custom <code>View</code>. You can extend your <code>View</code> to <code>AppCompatTextView</code> and override the <code>setText</code> method.</p><blockquote><p>The following example</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;">// Manually inject here.</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">Notice</p><p>After injecting <code>PanguText</code> into <code>TextView</code>, if you use <code>android:singleLine="true"</code> in XML layout or <code>TextView.setSingleLine(true)</code> in code along with <code>android:ellipsize="..."</code>, this method of setting single-line text may cause unresolvable <code>OBJ</code> characters (truncated by ellipsis) to appear when the text exceeds the screen width, because <code>TextView</code> does not account for <code>Span</code> during measurement, leading to incorrect text width calculation.</p><p>The solution is to use <code>android:maxLines="1"</code> in XML layout or <code>TextView.setMaxLines(1)</code> in code instead.</p><blockquote><p>The following example</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="personalized-configuration" tabindex="-1"><a class="header-anchor" href="#personalized-configuration" aria-hidden="true">#</a> Personalized Configuration</h3><p><code>PanguText</code> supports personalized configuration. You can use the global static instance <code>PanguText.globalConfig</code> to get the global configuration or configure it individually.</p><blockquote><p>The following example</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;">// Get global configuration.</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;">// Enable or disable the feature.</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;">// Process Spanned text.</span></span>
|
||||
<span class="line"><span style="color:#768390;">// Processing Spanned text is enabled by default, but this feature is experimental.</span></span>
|
||||
<span class="line"><span style="color:#768390;">// If issues occur, you can disable it. When disabled, Spanned text will return the original text.</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;">// Whether to automatically re-measure the text width after processing.</span></span>
|
||||
<span class="line"><span style="color:#768390;">// Note: After [PanguText] injects text and changes the text,</span></span>
|
||||
<span class="line"><span style="color:#768390;">// the width of [TextView] will not be calculated automatically.</span></span>
|
||||
<span class="line"><span style="color:#768390;">// At this time, this feature will call [TextView.setText] to re-execute the measurements,</span></span>
|
||||
<span class="line"><span style="color:#768390;">// which can fix issues in some dynamic layouts (such as \`RecyclerView\`) where text width changes each time,</span></span>
|
||||
<span class="line"><span style="color:#768390;">// but may cause performance issues. You can choose to disable this feature.</span></span>
|
||||
<span class="line"><span style="color:#768390;">// To prevent unnecessary performance overhead,</span></span>
|
||||
<span class="line"><span style="color:#768390;">// this feature only takes effect on [TextView] with \`maxLines\` set to 1 or \`singleLine\`.</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;">// Set patterns to exclude during formatting using regular expressions.</span></span>
|
||||
<span class="line"><span style="color:#768390;">// For example, exclude all URLs.</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;">// For example, exclude emoji placeholders like "[doge]".</span></span>
|
||||
<span class="line"><span style="color:#768390;">// If you use [ImageSpan] to display emoji images, you can choose to exclude these placeholders.</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;">// Set the spacing ratio for CJK characters.</span></span>
|
||||
<span class="line"><span style="color:#768390;">// This determines the final layout effect.</span></span>
|
||||
<span class="line"><span style="color:#768390;">// It is recommended to keep the default ratio and adjust it according to personal preference.</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 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">Notice</p><p>If you integrated using the <a href="#inject-to-layoutinflater">Inject to LayoutInflater</a> method, configure <code>PanguText.globalConfig</code> before executing <code>PanguTextFactory2.inject(...)</code>, otherwise the configuration will not take effect.</p></div><p>You can also pass the <code>config</code> parameter for personalized configuration when manually injecting or formatting text.</p><blockquote><p>The following example</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;">// Assume this is your 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;">// Create a new configuration.</span></span>
|
||||
<span class="line"><span style="color:#768390;">// You can set [copyFromGlobal] to false to not copy from the global configuration.</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;">// You can also copy and create a new configuration from any configuration.</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;">// Manually inject and configure.</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>If you integrated using the <a href="#inject-to-layoutinflater">Inject to LayoutInflater</a> method, you can use the following attributes in the XML layout declaration of <code>TextView</code>, <code>EditText</code>, or their subclasses for personalized configuration.</p><ul><li><code>panguText_enabled</code> corresponds to <code>PanguTextConfig.isEnabled</code></li><li><code>panguText_processedSpanned</code> corresponds to <code>PanguTextConfig.isProcessedSpanned</code></li><li><code>panguText_autoRemeasureText</code> corresponds to <code>PanguTextConfig.isAutoRemeasureText</code></li><li><code>panguText_excludePatterns</code> corresponds to <code>PanguTextConfig.excludePatterns</code>, string array, multiple patterns separated by <code>|@|</code></li><li><code>panguText_cjkSpacingRatio</code> corresponds to <code>PanguTextConfig.cjkSpacingRatio</code></li></ul><blockquote><p>The following example</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">Notice</p><p>Due to issues with Android Studio, the above attributes may not have auto-completion hints. Please complete them manually.</p><p>Don't forget to add the declaration <code>xmlns:app="http://schemas.android.com/apk/res-auto"</code>.</p></div><p>In custom <code>View</code>, you can extend your <code>View</code> to implement the <code>PanguTextView</code> interface to achieve the same functionality. This feature is also effective for the <a href="#using-the-patching-tool">Using the Patching Tool</a> method.</p><blockquote><p>The following example</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;">// Configure your [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">Notice</p><p>The <code>PanguTextView</code> interface takes precedence over attributes used directly in the XML layout. If you use both methods for configuration, the <code>PanguTextView</code> interface configuration will override the XML layout configuration.</p><p>Individual configurations will override global configurations, and options not configured will follow the global configuration.</p></div>`,48);function v(h,D){const a=t("ExternalLinkIcon");return i(),p("div",null,[r,e("p",null,[s("You can view the KDoc "),e("a",d,[s("click here"),l(a)]),s(".")]),u,e("p",null,[s("If you are using "),e("a",y,[s("ui-component → AppBindingActivity"),l(a)]),s(" in "),A,s(", you need to slightly modify the current code.")]),m])}const B=o(c,[["render",v],["__file","android.html.vue"]]);export{B as default};
|
1
assets/android.html-er-PlyuE.js
Normal file
1
assets/android.html-er-PlyuE.js
Normal file
@@ -0,0 +1 @@
|
||||
const e=JSON.parse('{"key":"v-5339d3dc","path":"/zh-cn/library/android.html","title":"Android","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"配置依赖","slug":"配置依赖","link":"#配置依赖","children":[{"level":3,"title":"SweetDependency (推荐)","slug":"sweetdependency-推荐","link":"#sweetdependency-推荐","children":[]},{"level":3,"title":"Version Catalog","slug":"version-catalog","link":"#version-catalog","children":[]},{"level":3,"title":"传统方式","slug":"传统方式","link":"#传统方式","children":[]}]},{"level":2,"title":"功能介绍","slug":"功能介绍","link":"#功能介绍","children":[{"level":3,"title":"实现原理","slug":"实现原理","link":"#实现原理","children":[]},{"level":3,"title":"集成到现有项目","slug":"集成到现有项目","link":"#集成到现有项目","children":[]},{"level":3,"title":"个性化配置","slug":"个性化配置","link":"#个性化配置","children":[]}]}],"git":{"updatedTime":1750752059000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":5}]},"filePathRelative":"zh-cn/library/android.md"}');export{e as data};
|
167
assets/android.html-qjs2U6CQ.js
Normal file
167
assets/android.html-qjs2U6CQ.js
Normal file
@@ -0,0 +1,167 @@
|
||||
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};
|
16
assets/app-6WmjFGj_.js
Normal file
16
assets/app-6WmjFGj_.js
Normal file
File diff suppressed because one or more lines are too long
1
assets/changelog.html-34En5i-H.js
Normal file
1
assets/changelog.html-34En5i-H.js
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as l,r as a,o as d,c as s,a as e,b as t,d as n,e as r}from"./app-6WmjFGj_.js";const c={},h=r('<h1 id="changelog" tabindex="-1"><a class="header-anchor" href="#changelog" aria-hidden="true">#</a> Changelog</h1><blockquote><p>The version update history of <code>PanguText</code> is recorded here.</p></blockquote><div class="custom-container danger"><p class="custom-container-title">Pay Attention</p><p>We will only maintain the latest API version. If you are using an outdated API version, you voluntarily renounce any possibility of maintenance.</p></div><div class="custom-container warning"><p class="custom-container-title">Notice</p><p>To avoid translation time consumption, the Changelog will use <strong>Google Translation</strong> from <strong>Chinese</strong> to <strong>English</strong>. Please refer to the original text for actual reference.</p><p>Time zone of version release date: <strong>UTC+8</strong></p></div><h2 id="pangutext-android" tabindex="-1"><a class="header-anchor" href="#pangutext-android" aria-hidden="true">#</a> pangutext-android</h2>',5),u={id:"_1-0-4-2025-08-16",tabindex:"-1"},g=e("a",{class:"header-anchor",href:"#_1-0-4-2025-08-16","aria-hidden":"true"},"#",-1),_=e("ul",null,[e("li",null,[t("Exclude "),e("code",null,"TextView"),t("'s own "),e("code",null,"TextWatcher"),t(" set during "),e("code",null,"injectPanguText"),t(" execution to prevent repeated triggering of "),e("code",null,"doOnTextChanged")])],-1),p={id:"_1-0-3-2025-08-03",tabindex:"-1"},x=e("a",{class:"header-anchor",href:"#_1-0-3-2025-08-03","aria-hidden":"true"},"#",-1),f={href:"https://github.com/HighCapable/YukiReflection",target:"_blank",rel:"noopener noreferrer"},m={href:"https://github.com/HighCapable/KavaRef",target:"_blank",rel:"noopener noreferrer"},v=e("li",null,"Other known issues fixed",-1),w={id:"_1-0-2-2025-03-05",tabindex:"-1"},T=e("a",{class:"header-anchor",href:"#_1-0-2-2025-03-05","aria-hidden":"true"},"#",-1),b=r("<ul><li>Added exception handling in <code>PanguTextFactory2</code> during injection to avoid interrupting the entire process during <code>View</code> initialization</li><li>Removed duplicate injection warning logs, now duplicate injections of <code>PanguText</code> will have no effect</li><li>Added <code>PanguTextPatcher</code>, which allows injecting <code>PanguText</code> using a new method</li></ul>",1),y={id:"_1-0-1-2025-02-11",tabindex:"-1"},P=e("a",{class:"header-anchor",href:"#_1-0-1-2025-02-11","aria-hidden":"true"},"#",-1),k=e("ul",null,[e("li",null,[t("Fixed an issue where injecting "),e("code",null,"PanguText"),t(" could cause incorrect width measurement in "),e("code",null,"TextView")]),e("li",null,[t("Added "),e("code",null,"isAutoRemeasureText"),t(" to "),e("code",null,"PanguTextConfig"),t(" to control whether to automatically remeasure text width (applies to single-line text in "),e("code",null,"TextView"),t(")")])],-1),C={id:"_1-0-0-2025-02-10",tabindex:"-1"},V=e("a",{class:"header-anchor",href:"#_1-0-0-2025-02-10","aria-hidden":"true"},"#",-1),A=e("ul",null,[e("li",null,"The first version is submitted to Maven")],-1),j=e("h2",{id:"pangutext-compose",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#pangutext-compose","aria-hidden":"true"},"#"),t(" pangutext-compose")],-1),N=e("p",null,"Not yet released.",-1);function R(B,E){const o=a("Badge"),i=a("ExternalLinkIcon");return d(),s("div",null,[h,e("h3",u,[g,t(" 1.0.4 | 2025.08.16 "),n(o,{type:"tip",text:"latest",vertical:"middle"})]),_,e("h3",p,[x,t(" 1.0.3 | 2025.08.03 "),n(o,{type:"warning",text:"stale",vertical:"middle"})]),e("ul",null,[e("li",null,[t("Migrate Java reflection-related behavior from "),e("a",f,[t("YukiReflection"),n(i)]),t(" to "),e("a",m,[t("KavaRef"),n(i)])]),v]),e("h3",w,[T,t(" 1.0.2 | 2025.03.05 "),n(o,{type:"warning",text:"stale",vertical:"middle"})]),b,e("h3",y,[P,t(" 1.0.1 | 2025.02.11 "),n(o,{type:"warning",text:"stale",vertical:"middle"})]),k,e("h3",C,[V,t(" 1.0.0 | 2025.02.10 "),n(o,{type:"warning",text:"stale",vertical:"middle"})]),A,j,N])}const q=l(c,[["render",R],["__file","changelog.html.vue"]]);export{q as default};
|
1
assets/changelog.html-ZdZDMp0S.js
Normal file
1
assets/changelog.html-ZdZDMp0S.js
Normal file
@@ -0,0 +1 @@
|
||||
const e=JSON.parse('{"key":"v-0e6c3476","path":"/zh-cn/about/changelog.html","title":"更新日志","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"pangutext-android","slug":"pangutext-android","link":"#pangutext-android","children":[{"level":3,"title":"1.0.4 | 2025.08.16","slug":"_1-0-4-2025-08-16","link":"#_1-0-4-2025-08-16","children":[]},{"level":3,"title":"1.0.3 | 2025.08.03","slug":"_1-0-3-2025-08-03","link":"#_1-0-3-2025-08-03","children":[]},{"level":3,"title":"1.0.2 | 2025.03.05","slug":"_1-0-2-2025-03-05","link":"#_1-0-2-2025-03-05","children":[]},{"level":3,"title":"1.0.1 | 2025.02.11","slug":"_1-0-1-2025-02-11","link":"#_1-0-1-2025-02-11","children":[]},{"level":3,"title":"1.0.0 | 2025.02.10","slug":"_1-0-0-2025-02-10","link":"#_1-0-0-2025-02-10","children":[]}]},{"level":2,"title":"pangutext-compose","slug":"pangutext-compose","link":"#pangutext-compose","children":[]}],"git":{"updatedTime":1755275215000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":5}]},"filePathRelative":"zh-cn/about/changelog.md"}');export{e as data};
|
1
assets/changelog.html-_msERpTv.js
Normal file
1
assets/changelog.html-_msERpTv.js
Normal file
@@ -0,0 +1 @@
|
||||
const e=JSON.parse('{"key":"v-3f851d14","path":"/en/about/changelog.html","title":"Changelog","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"pangutext-android","slug":"pangutext-android","link":"#pangutext-android","children":[{"level":3,"title":"1.0.4 | 2025.08.16","slug":"_1-0-4-2025-08-16","link":"#_1-0-4-2025-08-16","children":[]},{"level":3,"title":"1.0.3 | 2025.08.03","slug":"_1-0-3-2025-08-03","link":"#_1-0-3-2025-08-03","children":[]},{"level":3,"title":"1.0.2 | 2025.03.05","slug":"_1-0-2-2025-03-05","link":"#_1-0-2-2025-03-05","children":[]},{"level":3,"title":"1.0.1 | 2025.02.11","slug":"_1-0-1-2025-02-11","link":"#_1-0-1-2025-02-11","children":[]},{"level":3,"title":"1.0.0 | 2025.02.10","slug":"_1-0-0-2025-02-10","link":"#_1-0-0-2025-02-10","children":[]}]},{"level":2,"title":"pangutext-compose","slug":"pangutext-compose","link":"#pangutext-compose","children":[]}],"git":{"updatedTime":1755275215000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":6}]},"filePathRelative":"en/about/changelog.md"}');export{e as data};
|
1
assets/changelog.html-qt_u2gKo.js
Normal file
1
assets/changelog.html-qt_u2gKo.js
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as c,r as d,o as l,c as r,a as e,b as t,d as a,e as i}from"./app-6WmjFGj_.js";const s={},h=i('<h1 id="更新日志" tabindex="-1"><a class="header-anchor" href="#更新日志" aria-hidden="true">#</a> 更新日志</h1><blockquote><p>这里记录了 <code>PanguText</code> 的版本更新历史。</p></blockquote><div class="custom-container danger"><p class="custom-container-title">特别注意</p><p>我们只会对最新的 API 版本进行维护,若你正在使用过时的 API 版本则代表你自愿放弃一切维护的可能性。</p></div><h2 id="pangutext-android" tabindex="-1"><a class="header-anchor" href="#pangutext-android" aria-hidden="true">#</a> pangutext-android</h2>',4),_={id:"_1-0-4-2025-08-16",tabindex:"-1"},u=e("a",{class:"header-anchor",href:"#_1-0-4-2025-08-16","aria-hidden":"true"},"#",-1),x=e("ul",null,[e("li",null,[t("在执行 "),e("code",null,"injectPanguText"),t(" 时排除 "),e("code",null,"TextView"),t(" 自身设置的 "),e("code",null,"TextWatcher"),t(" 防止重复触发 "),e("code",null,"doOnTextChanged")])],-1),p={id:"_1-0-3-2025-08-03",tabindex:"-1"},g=e("a",{class:"header-anchor",href:"#_1-0-3-2025-08-03","aria-hidden":"true"},"#",-1),f={href:"https://github.com/HighCapable/YukiReflection",target:"_blank",rel:"noopener noreferrer"},m={href:"https://github.com/HighCapable/KavaRef",target:"_blank",rel:"noopener noreferrer"},b=e("li",null,"其它已知问题修复",-1),T={id:"_1-0-2-2025-03-05",tabindex:"-1"},v=e("a",{class:"header-anchor",href:"#_1-0-2-2025-03-05","aria-hidden":"true"},"#",-1),P=i("<ul><li><code>PanguTextFactory2</code> 在注入时新增异常捕获,避免在 <code>View</code> 自身初始化过程中断整个处理过程</li><li>移除重复注入的警告日志,现在重复注入 <code>PanguText</code> 将无任何作用产生</li><li>新增 <code>PanguTextPatcher</code>,可以使用新的方案注入 <code>PanguText</code></li></ul>",1),k={id:"_1-0-1-2025-02-11",tabindex:"-1"},w=e("a",{class:"header-anchor",href:"#_1-0-1-2025-02-11","aria-hidden":"true"},"#",-1),V=e("ul",null,[e("li",null,[t("修复注入 "),e("code",null,"PanguText"),t(" 后 "),e("code",null,"TextView"),t(" 可能导致测量宽度不正确的问题")]),e("li",null,[e("code",null,"PanguTextConfig"),t(" 新增 "),e("code",null,"isAutoRemeasureText"),t(",用于控制是否自动重新测量文本宽度 (作用于 "),e("code",null,"TextView"),t(" 单行文本)")])],-1),y={id:"_1-0-0-2025-02-10",tabindex:"-1"},B=e("a",{class:"header-anchor",href:"#_1-0-0-2025-02-10","aria-hidden":"true"},"#",-1),C=e("ul",null,[e("li",null,"首个版本提交至 Maven")],-1),R=e("h2",{id:"pangutext-compose",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#pangutext-compose","aria-hidden":"true"},"#"),t(" pangutext-compose")],-1),I=e("p",null,"暂未发布。",-1);function N(A,E){const n=d("Badge"),o=d("ExternalLinkIcon");return l(),r("div",null,[h,e("h3",_,[u,t(" 1.0.4 | 2025.08.16 "),a(n,{type:"tip",text:"最新",vertical:"middle"})]),x,e("h3",p,[g,t(" 1.0.3 | 2025.08.03 "),a(n,{type:"warning",text:"过旧",vertical:"middle"})]),e("ul",null,[e("li",null,[t("将 Java 反射相关行为由 "),e("a",f,[t("YukiReflection"),a(o)]),t(" 迁移至 "),e("a",m,[t("KavaRef"),a(o)])]),b]),e("h3",T,[v,t(" 1.0.2 | 2025.03.05 "),a(n,{type:"warning",text:"过旧",vertical:"middle"})]),P,e("h3",k,[w,t(" 1.0.1 | 2025.02.11 "),a(n,{type:"warning",text:"过旧",vertical:"middle"})]),V,e("h3",y,[B,t(" 1.0.0 | 2025.02.10 "),a(n,{type:"warning",text:"过旧",vertical:"middle"})]),C,R,I])}const H=c(s,[["render",N],["__file","changelog.html.vue"]]);export{H as default};
|
1
assets/compose.html-6IPIfrmc.js
Normal file
1
assets/compose.html-6IPIfrmc.js
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as e,o as a,c as t,e as o}from"./app-6WmjFGj_.js";const s={},p=o('<h1 id="jetpack-compose" tabindex="-1"><a class="header-anchor" href="#jetpack-compose" aria-hidden="true">#</a> Jetpack Compose</h1><p><img src="https://img.shields.io/maven-central/v/com.highcapable.pangutext/pangutext-compose?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-compose%2Fmaven-metadata.xml&logo=apachemaven&logoColor=orange&label=highcapable-maven-releases&style=flat-square" alt="Maven metadata URL"></p><p>这是 Jetpack Compose (多平台) 的核心依赖,在 Jetpack Compose 上使用 <code>PanguText</code> 时,你需要引入此模块。</p><p>此模块尚在开发阶段,将在后期逐渐进行完善。</p>',4),c=[p];function m(n,l){return a(),t("div",null,c)}const i=e(s,[["render",m],["__file","compose.html.vue"]]);export{i as default};
|
1
assets/compose.html-Bw78KuUV.js
Normal file
1
assets/compose.html-Bw78KuUV.js
Normal file
@@ -0,0 +1 @@
|
||||
const e=JSON.parse('{"key":"v-78411699","path":"/zh-cn/library/compose.html","title":"Jetpack Compose","lang":"zh-CN","frontmatter":{},"headers":[],"git":{"updatedTime":1750752059000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"zh-cn/library/compose.md"}');export{e as data};
|
1
assets/compose.html-GjfF5jqY.js
Normal file
1
assets/compose.html-GjfF5jqY.js
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as e,o as a,c as t,e as o}from"./app-6WmjFGj_.js";const s={},n=o('<h1 id="jetpack-compose" tabindex="-1"><a class="header-anchor" href="#jetpack-compose" aria-hidden="true">#</a> Jetpack Compose</h1><p><img src="https://img.shields.io/maven-central/v/com.highcapable.pangutext/pangutext-compose?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-compose%2Fmaven-metadata.xml&logo=apachemaven&logoColor=orange&label=highcapable-maven-releases&style=flat-square" alt="Maven metadata URL"></p><p>This is the core dependency for Jetpack Compose (multiplatform). When using <code>PanguText</code> in Jetpack Compose, you need to include this module.</p><p>This module is currently under development and will be gradually improved in the future.</p>',4),p=[n];function l(c,m){return a(),t("div",null,p)}const i=e(s,[["render",l],["__file","compose.html.vue"]]);export{i as default};
|
1
assets/compose.html-ta_OKiQ7.js
Normal file
1
assets/compose.html-ta_OKiQ7.js
Normal file
@@ -0,0 +1 @@
|
||||
const e=JSON.parse('{"key":"v-82076430","path":"/en/library/compose.html","title":"Jetpack Compose","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1750752059000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/library/compose.md"}');export{e as data};
|
1
assets/contacts.html--fNpIi3D.js
Normal file
1
assets/contacts.html--fNpIi3D.js
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as a,r,o as s,c,a as e,b as n,d as o}from"./app-6WmjFGj_.js";const l={},i=e("h1",{id:"contact-us",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#contact-us","aria-hidden":"true"},"#"),n(" Contact Us")],-1),u=e("blockquote",null,[e("p",null,"If you have any questions during usage, or have any constructive suggestions, you can contact us.")],-1),h=e("p",null,"Join our developers group.",-1),d={href:"https://t.me/BetterAndroid",target:"_blank",rel:"noopener noreferrer"},_={href:"https://t.me/HighCapable_Dev",target:"_blank",rel:"noopener noreferrer"},p=e("strong",null,"Twitter",-1),f={href:"https://twitter.com/fankesyooni",target:"_blank",rel:"noopener noreferrer"},g=e("h2",{id:"help-with-maintenance",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#help-with-maintenance","aria-hidden":"true"},"#"),n(" Help with Maintenance")],-1),m=e("p",null,[n("Thank you for choosing and using "),e("code",null,"PanguText"),n(".")],-1),k=e("p",null,"If you have code-related suggestions and requests, you can submit a Pull Request on GitHub.",-1);function b(v,x){const t=r("ExternalLinkIcon");return s(),c("div",null,[i,u,h,e("ul",null,[e("li",null,[e("a",d,[n("Click to join Telegram group"),o(t)])]),e("li",null,[e("a",_,[n("Click to join Telegram group (Developer)"),o(t)])])]),e("p",null,[n("Find me on "),p,n(),e("a",f,[n("@fankesyooni"),o(t)]),n(".")]),g,m,k])}const T=a(l,[["render",b],["__file","contacts.html.vue"]]);export{T as default};
|
1
assets/contacts.html-8fmQuQW2.js
Normal file
1
assets/contacts.html-8fmQuQW2.js
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as o,r as l,o as a,c as s,a as e,b as t,d as r}from"./app-6WmjFGj_.js";const c={},_=e("h1",{id:"联系我们",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#联系我们","aria-hidden":"true"},"#"),t(" 联系我们")],-1),i=e("blockquote",null,[e("p",null,"如在使用中有任何问题,或有任何建设性的建议,都可以联系我们。")],-1),h=e("p",null,"加入我们的开发者群组。",-1),d={href:"https://t.me/BetterAndroid",target:"_blank",rel:"noopener noreferrer"},u={href:"https://t.me/HighCapable_Dev",target:"_blank",rel:"noopener noreferrer"},p={href:"https://qm.qq.com/cgi-bin/qm/qr?k=Pnsc5RY6N2mBKFjOLPiYldbAbprAU3V7&jump_from=webapi&authKey=X5EsOVzLXt1dRunge8ryTxDRrh9/IiW1Pua75eDLh9RE3KXE+bwXIYF5cWri/9lf",target:"_blank",rel:"noopener noreferrer"},f=e("strong",null,"酷安",-1),m={href:"http://www.coolapk.com/u/876977",target:"_blank",rel:"noopener noreferrer"},b=e("h2",{id:"助力维护",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#助力维护","aria-hidden":"true"},"#"),t(" 助力维护")],-1),g=e("p",null,[t("感谢您选择并使用 "),e("code",null,"PanguText"),t(",如有代码相关的建议和请求,可在 GitHub 提交 Pull Request。")],-1);function k(x,q){const n=l("ExternalLinkIcon");return a(),s("div",null,[_,i,h,e("ul",null,[e("li",null,[e("a",d,[t("点击加入 Telegram 群组"),r(n)])]),e("li",null,[e("a",u,[t("点击加入 Telegram 群组 (开发者)"),r(n)])]),e("li",null,[e("a",p,[t("点击加入 QQ 群 (开发者)"),r(n)])])]),e("p",null,[t("在 "),f,t(" 找到我 "),e("a",m,[t("@星夜不荟"),r(n)]),t("。")]),b,g])}const w=o(c,[["render",k],["__file","contacts.html.vue"]]);export{w as default};
|
1
assets/contacts.html-KJJ9aywK.js
Normal file
1
assets/contacts.html-KJJ9aywK.js
Normal file
@@ -0,0 +1 @@
|
||||
const t=JSON.parse('{"key":"v-6cf86266","path":"/zh-cn/about/contacts.html","title":"联系我们","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"助力维护","slug":"助力维护","link":"#助力维护","children":[]}],"git":{"updatedTime":1739127925000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"zh-cn/about/contacts.md"}');export{t as data};
|
1
assets/contacts.html-Tyyrr6ry.js
Normal file
1
assets/contacts.html-Tyyrr6ry.js
Normal file
@@ -0,0 +1 @@
|
||||
const t=JSON.parse('{"key":"v-193cf592","path":"/en/about/contacts.html","title":"Contact Us","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Help with Maintenance","slug":"help-with-maintenance","link":"#help-with-maintenance","children":[]}],"git":{"updatedTime":1754157305000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":3}]},"filePathRelative":"en/about/contacts.md"}');export{t as data};
|
1
assets/demo_02-Y1eWnGtu.js
Normal file
1
assets/demo_02-Y1eWnGtu.js
Normal file
@@ -0,0 +1 @@
|
||||
const s="/PanguText/images/demo_01.png",a="/PanguText/images/demo_02.gif";export{s as _,a};
|
1
assets/future.html-H3GTPPFW.js
Normal file
1
assets/future.html-H3GTPPFW.js
Normal file
@@ -0,0 +1 @@
|
||||
const e=JSON.parse('{"key":"v-3106ca14","path":"/zh-cn/about/future.html","title":"展望未来","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"未来的计划","slug":"未来的计划","link":"#未来的计划","children":[{"level":3,"title":"SpannableString 的局限性","slug":"spannablestring-的局限性","link":"#spannablestring-的局限性","children":[]},{"level":3,"title":"Jetpack Compose 计划","slug":"jetpack-compose-计划","link":"#jetpack-compose-计划","children":[]}]}],"git":{"updatedTime":1739127925000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"zh-cn/about/future.md"}');export{e as data};
|
1
assets/future.html-YFngAQwd.js
Normal file
1
assets/future.html-YFngAQwd.js
Normal file
@@ -0,0 +1 @@
|
||||
const e=JSON.parse('{"key":"v-ae7b83f2","path":"/en/about/future.html","title":"Looking Toward the Future","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Future Plans","slug":"future-plans","link":"#future-plans","children":[{"level":3,"title":"Limitations of SpannableString","slug":"limitations-of-spannablestring","link":"#limitations-of-spannablestring","children":[]},{"level":3,"title":"Jetpack Compose Plan","slug":"jetpack-compose-plan","link":"#jetpack-compose-plan","children":[]}]}],"git":{"updatedTime":1754156245000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/about/future.md"}');export{e as data};
|
1
assets/future.html-e9RoH0aV.js
Normal file
1
assets/future.html-e9RoH0aV.js
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as e,o as t,c as a,e as o}from"./app-6WmjFGj_.js";const n={},r=o('<h1 id="looking-toward-the-future" tabindex="-1"><a class="header-anchor" href="#looking-toward-the-future" aria-hidden="true">#</a> Looking Toward the Future</h1><blockquote><p>The future is bright and uncertain, let us look forward to the future development space of <code>PanguText</code>.</p></blockquote><h2 id="future-plans" tabindex="-1"><a class="header-anchor" href="#future-plans" aria-hidden="true">#</a> Future Plans</h2><blockquote><p>Features that <code>PanguText</code> may add later are included here.</p></blockquote><h3 id="limitations-of-spannablestring" tabindex="-1"><a class="header-anchor" href="#limitations-of-spannablestring" aria-hidden="true">#</a> Limitations of SpannableString</h3><p><code>PanguText</code>'s main functionality on the Android platform currently comes from <code>SpannableString</code>, which has not yet fully resolved the issues of handling complex text styles and performance overhead.</p><h3 id="jetpack-compose-plan" tabindex="-1"><a class="header-anchor" href="#jetpack-compose-plan" aria-hidden="true">#</a> Jetpack Compose Plan</h3><p><code>PanguText</code> will support Jetpack Compose in the future and plans to use <code>AnnotatedString</code> as the main text processing method to minimize intrusion into the underlying layer.</p>',8),i=[r];function d(c,s){return t(),a("div",null,i)}const l=e(n,[["render",d],["__file","future.html.vue"]]);export{l as default};
|
1
assets/future.html-zvpjuSDl.js
Normal file
1
assets/future.html-zvpjuSDl.js
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as e,o as a,c as o,e as t}from"./app-6WmjFGj_.js";const c={},n=t('<h1 id="展望未来" tabindex="-1"><a class="header-anchor" href="#展望未来" aria-hidden="true">#</a> 展望未来</h1><blockquote><p>未来是美好的,也是不确定的,让我们共同期待 <code>PanguText</code> 在未来的发展空间。</p></blockquote><h2 id="未来的计划" tabindex="-1"><a class="header-anchor" href="#未来的计划" aria-hidden="true">#</a> 未来的计划</h2><blockquote><p>这里收录了 <code>PanguText</code> 可能会在后期添加的功能。</p></blockquote><h3 id="spannablestring-的局限性" tabindex="-1"><a class="header-anchor" href="#spannablestring-的局限性" aria-hidden="true">#</a> SpannableString 的局限性</h3><p><code>PanguText</code> 目前在 Android 平台上的主要功能来自 <code>SpannableString</code>,目前尚未完全解决处理复杂的文本样式以及性能开销问题。</p><h3 id="jetpack-compose-计划" tabindex="-1"><a class="header-anchor" href="#jetpack-compose-计划" aria-hidden="true">#</a> Jetpack Compose 计划</h3><p><code>PanguText</code> 未来将会支持 Jetpack Compose,并计划采用 <code>AnnotatedString</code> 作为主要的文本处理方式以实现对底层的最小化侵入。</p>',8),d=[n];function r(i,s){return a(),o("div",null,d)}const p=e(c,[["render",r],["__file","future.html.vue"]]);export{p as default};
|
1
assets/home.html-3yl9a2Vj.js
Normal file
1
assets/home.html-3yl9a2Vj.js
Normal file
@@ -0,0 +1 @@
|
||||
const e=JSON.parse('{"key":"v-6a609e09","path":"/zh-cn/guide/home.html","title":"介绍","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"背景","slug":"背景","link":"#背景","children":[]},{"level":2,"title":"效果","slug":"效果","link":"#效果","children":[]},{"level":2,"title":"语言要求","slug":"语言要求","link":"#语言要求","children":[]},{"level":2,"title":"功能贡献","slug":"功能贡献","link":"#功能贡献","children":[]}],"git":{"updatedTime":1739127925000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"zh-cn/guide/home.md"}');export{e as data};
|
1
assets/home.html-58uN4FuZ.js
Normal file
1
assets/home.html-58uN4FuZ.js
Normal file
File diff suppressed because one or more lines are too long
1
assets/home.html-DfgIm_Cu.js
Normal file
1
assets/home.html-DfgIm_Cu.js
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as n,a as i}from"./demo_02-Y1eWnGtu.js";import{_ as c,r as s,o as d,c as h,a,b as e,d as o,e as r}from"./app-6WmjFGj_.js";const l={},p=r('<h1 id="介绍" tabindex="-1"><a class="header-anchor" href="#介绍" aria-hidden="true">#</a> 介绍</h1><blockquote><p><code>PanguText</code> 是一个中日韩 (CJK) 与英文单词、半角数字排版的解决方案。</p></blockquote><h2 id="背景" tabindex="-1"><a class="header-anchor" href="#背景" aria-hidden="true">#</a> 背景</h2><p>这个项目的起因是因为直到目前为止还没有一套公开的方案能够完美解决中文、日文、韩文与英文之间的排版问题, 正常情况下我们将 CJK (即中日韩) 与英文混排的时候,都会涉及到美观性问题,这算是一个历史遗留问题,全角文字与半角文字之间的书写规范不一样。虽然现在 W3C 规定了 CJK 排版规范, 但是还是仅有部分愿意遵守排版要求的个人或企业选择了这种方案。</p><p>目前已知的厂商解决方案如下</p><ul><li>Apple 全系 (iOS、iPadOS、macOS、tvOS、watchOS) 文本排版解决方案</li><li>小米 (HyperOS) 文本排版优化</li><li>OrginOS 基于字体的文本排版优化</li></ul><p>但是这些方案都是封闭的,无法在其他平台上使用,因此我们希望能够提供一套开源的解决方案,能够适应各种场景、侵入性低且更容易集成,让更多的开发者能够使用这个方案来解决文本排版问题。</p>',7),u={href:"https://github.com/vinta/pangu.js",target:"_blank",rel:"noopener noreferrer"},_=r('<h2 id="效果" tabindex="-1"><a class="header-anchor" href="#效果" aria-hidden="true">#</a> 效果</h2><p>如你所见,<code>PanguText</code> 的排版方案并不是向 CJK 与英文单词之间插入空格来完成,而是使用每个平台对应的处理方案自动在这些字符之间添加空白间距来达到排版效果以达到最低的侵入性。</p><blockquote><p>应用前 (上)、应用后 (下)</p></blockquote><img src="'+n+'" width="300"><blockquote><p>动态应用</p></blockquote><img src="'+i+'" width="480"><p><code>PanguText</code> 支持动态应用,它允许你在输入文本的同时动态为每个字符添加空白间距。</p><div class="custom-container tip"><p class="custom-container-title">开发者的观点</p><p>我个人依然不提倡手动为 CJK 和英文字符之间添加空格来达到排版美化效果 (如果软件、系统本身支持这种排版美化方式), 因为空格在不同的字体中的间距也是不一样的,这会造成排版效果出现问题,也会被加入本不应该出现的空格字符,在某些场景下,例如网址、文件名或者带有 “#” 的话题标签,不允许出现这些空格。但是,在一些特殊场景,例如代码的注释中,涉及到代码的说明文档,建议加入空格,因为这些范围内可能不会有排版格式化工具。</p><p>还有一点就是,在不同的语言中使用不同的标点符号,切忌全角和半角标点符号混用,如果一定要使用半角标点符号来标记全角文字,在句子未结束时将半角符号向后推进一个空格补全字符空间 (英文也是如此)。</p></div><h2 id="语言要求" tabindex="-1"><a class="header-anchor" href="#语言要求" aria-hidden="true">#</a> 语言要求</h2><p>推荐使用 Kotlin 作为首选开发语言,本项目完全使用 Kotlin 编写,在部分内容上对 Java 做了兼容处理,但也许无法做到完全兼容。</p><p>文档全部的 Demo 示例代码都将使用 Kotlin 进行描述,如果你完全不会使用 Kotlin,那么你将有可能无法获得最佳使用体验。</p><h2 id="功能贡献" tabindex="-1"><a class="header-anchor" href="#功能贡献" aria-hidden="true">#</a> 功能贡献</h2>',12),m={href:"https://github.com/BetterAndroid/PanguText/issues",target:"_blank",rel:"noopener noreferrer"};function b(f,x){const t=s("ExternalLinkIcon");return d(),h("div",null,[p,a("p",null,[e("本项目得以进行的主要来源为 "),a("a",u,[e("pangu.js"),o(t)]),e(",它提供了一套 CJK 排版的正则,我们对其加以优化,实现各个平台不需要插入空格字符即可格式化文本排版的效果, 衷心感谢这个项目的开发者提供的方案,我们在这个方案上加以扩展,提供了更多解决方案的可能性。")]),_,a("p",null,[e("本项目的维护离不开各位开发者的支持和贡献,目前这个项目处于初期阶段,可能依然存在一些问题或者缺少你需要的功能, 如果可能,欢迎提交 PR 为此项目贡献你认为需要的功能或前往 "),a("a",m,[e("GitHub Issues"),o(t)]),e(" 向我们提出建议。")])])}const K=c(l,[["render",b],["__file","home.html.vue"]]);export{K as default};
|
1
assets/home.html-JcaZNIqz.js
Normal file
1
assets/home.html-JcaZNIqz.js
Normal file
@@ -0,0 +1 @@
|
||||
const e=JSON.parse('{"key":"v-efb45d4c","path":"/en/guide/home.html","title":"Introduction","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Background","slug":"background","link":"#background","children":[]},{"level":2,"title":"Effects","slug":"effects","link":"#effects","children":[]},{"level":2,"title":"Language Requirement","slug":"language-requirement","link":"#language-requirement","children":[]},{"level":2,"title":"Contribution","slug":"contribution","link":"#contribution","children":[]}],"git":{"updatedTime":1754156245000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/guide/home.md"}');export{e as data};
|
1
assets/index.html-EYu-iNkn.js
Normal file
1
assets/index.html-EYu-iNkn.js
Normal file
@@ -0,0 +1 @@
|
||||
const e=JSON.parse('{"key":"v-8daa1a0e","path":"/","title":"","lang":"en-US","frontmatter":{"home":true,"navbar":false,"sidebar":false,"title":null,"heroAlt":null,"heroText":null,"tagline":"Select a language","actions":[{"text":"English","link":"/en/","type":"secondary"},{"text":"简体中文","link":"/zh-cn/","type":"secondary"}],"footer":"Apache-2.0 License | Copyright (C) 2019 HighCapable"},"headers":[],"git":{"updatedTime":1739127925000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"index.md"}');export{e as data};
|
1
assets/index.html-H__tmzTP.js
Normal file
1
assets/index.html-H__tmzTP.js
Normal file
@@ -0,0 +1 @@
|
||||
const e=JSON.parse('{"key":"v-c0c85b84","path":"/zh-cn/","title":"首页","lang":"zh-CN","frontmatter":{"home":true,"title":"首页","heroImage":"/images/logo.png","actions":[{"text":"快速上手","link":"/zh-cn/guide/home","type":"primary"},{"text":"更新日志","link":"/zh-cn/about/changelog","type":"secondary"}],"footer":"Apache-2.0 License | Copyright (C) 2019 HighCapable"},"headers":[],"git":{"updatedTime":1739127925000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"zh-cn/index.md"}');export{e as data};
|
1
assets/index.html-QUZQg0UG.js
Normal file
1
assets/index.html-QUZQg0UG.js
Normal file
@@ -0,0 +1 @@
|
||||
const e=JSON.parse('{"key":"v-2d0a870d","path":"/en/","title":"Home","lang":"en-US","frontmatter":{"home":true,"title":"Home","heroImage":"/images/logo.png","actions":[{"text":"Get Started","link":"/en/guide/home","type":"primary"},{"text":"Changelog","link":"/en/about/changelog","type":"secondary"}],"footer":"Apache-2.0 License | Copyright (C) 2019 HighCapable"},"headers":[],"git":{"updatedTime":1739127925000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"en/index.md"}');export{e as data};
|
1
assets/index.html-dAhbvs7X.js
Normal file
1
assets/index.html-dAhbvs7X.js
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as e,o as c,c as t}from"./app-6WmjFGj_.js";const n={};function _(o,r){return c(),t("div")}const a=e(n,[["render",_],["__file","index.html.vue"]]);export{a as default};
|
1
assets/index.html-hmQ6cGF4.js
Normal file
1
assets/index.html-hmQ6cGF4.js
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as e,o as c,c as t}from"./app-6WmjFGj_.js";const n={};function _(o,r){return c(),t("div")}const a=e(n,[["render",_],["__file","index.html.vue"]]);export{a as default};
|
1
assets/index.html-zXy82L0K.js
Normal file
1
assets/index.html-zXy82L0K.js
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as e,o as c,c as t}from"./app-6WmjFGj_.js";const n={};function _(o,r){return c(),t("div")}const a=e(n,[["render",_],["__file","index.html.vue"]]);export{a as default};
|
26
assets/quick-start.html-1kKh8kqs.js
Normal file
26
assets/quick-start.html-1kKh8kqs.js
Normal file
@@ -0,0 +1,26 @@
|
||||
import{_ as r,r as l,o as p,c,a as e,b as n,d as s,w as i,e as t}from"./app-6WmjFGj_.js";const d={},u=t('<h1 id="quick-start" tabindex="-1"><a class="header-anchor" href="#quick-start" aria-hidden="true">#</a> Quick Start</h1><blockquote><p>Integrate <code>PanguText</code> into your project.</p></blockquote><h2 id="project-requirements" tabindex="-1"><a class="header-anchor" href="#project-requirements" aria-hidden="true">#</a> Project Requirements</h2><p>The project needs to be created using <code>Android Studio</code> or <code>IntelliJ IDEA</code> and be of type Android or Kotlin Multiplatform project with integrated Kotlin environment dependencies.</p>',4),h={href:"https://developer.android.com/studio",target:"_blank",rel:"noopener noreferrer"},m={href:"https://www.jetbrains.com/idea",target:"_blank",rel:"noopener noreferrer"},y=e("li",null,[e("p",null,"Kotlin 1.9.0+, Gradle 8+, Java 17+, Android Gradle Plugin 8+")],-1),v=e("h3",{id:"configure-repositories",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#configure-repositories","aria-hidden":"true"},"#"),n(" Configure Repositories")],-1),b=e("p",null,[n("The dependencies of "),e("code",null,"PanguText"),n(" are published in "),e("strong",null,"Maven Central"),n(" and our public repository. You can use the following method to configure repositories.")],-1),A={href:"https://github.com/HighCapable/SweetDependency",target:"_blank",rel:"noopener noreferrer"},D=t(`<h4 id="sweetdependency-recommended" tabindex="-1"><a class="header-anchor" href="#sweetdependency-recommended" aria-hidden="true">#</a> SweetDependency (Recommended)</h4><p>Configure repositories in your project's <code>SweetDependency</code> configuration file.</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;">repositories</span><span style="color:#ADBAC7;">:</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#8DDB8C;">google</span><span style="color:#ADBAC7;">:</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#8DDB8C;">maven-central</span><span style="color:#ADBAC7;">:</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;"># (Optional) You can add this URL to use our public repository</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;"># When Sonatype-OSS fails and cannot publish dependencies, this repository is added as a backup</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;"># For details, please visit: https://github.com/HighCapable/maven-repository</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#8DDB8C;">highcapable-maven-releases</span><span style="color:#ADBAC7;">:</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#8DDB8C;">url</span><span style="color:#ADBAC7;">: </span><span style="color:#96D0FF;">https://raw.githubusercontent.com/HighCapable/maven-repository/main/repository/releases</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><h4 id="traditional-method" tabindex="-1"><a class="header-anchor" href="#traditional-method" aria-hidden="true">#</a> Traditional Method</h4><p>Configure repositories in your project's <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;">repositories</span><span style="color:#ADBAC7;"> {</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">google</span><span style="color:#ADBAC7;">()</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">mavenCentral</span><span style="color:#ADBAC7;">()</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// (Optional) You can add this URL to use our public repository</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// When Sonatype-OSS fails and cannot publish dependencies, this repository is added as a backup</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// For details, please visit: https://github.com/HighCapable/maven-repository</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">maven</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"https://raw.githubusercontent.com/HighCapable/maven-repository/main/repository/releases"</span><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><h3 id="configure-java-version" tabindex="-1"><a class="header-anchor" href="#configure-java-version" aria-hidden="true">#</a> Configure Java Version</h3><p>Modify the Java version of Kotlin in your project's <code>build.gradle.kts</code> to 17 or above.</p><blockquote><p>Kotlin DSL</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:#DCBDFB;">android</span><span style="color:#ADBAC7;"> {</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">compileOptions</span><span style="color:#ADBAC7;"> {</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> sourceCompatibility </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> JavaVersion.VERSION_17</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> targetCompatibility </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> JavaVersion.VERSION_17</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">kotlinOptions</span><span style="color:#ADBAC7;"> {</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> jvmTarget </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">"17"</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><h2 id="functional-overview" tabindex="-1"><a class="header-anchor" href="#functional-overview" aria-hidden="true">#</a> Functional Overview</h2><p>The project is divided into multiple modules: Android platform and Jetpack Compose (multiplatform). You can choose the module you wish to include as a dependency in your project.</p><p>Click the corresponding module below to view detailed feature descriptions.</p>`,13),C=e("h2",{id:"demo",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#demo","aria-hidden":"true"},"#"),n(" Demo")],-1),g=e("p",null,"You can find some examples below. Check out the corresponding demo projects to get a better understanding of how these features work and quickly select the functionality you need.",-1),B={href:"https://github.com/BetterAndroid/PanguText/tree/main/demo-android",target:"_blank",rel:"noopener noreferrer"},f={href:"https://github.com/BetterAndroid/PanguText/tree/main/demo-compose",target:"_blank",rel:"noopener noreferrer"};function _(k,x){const a=l("ExternalLinkIcon"),o=l("RouterLink");return p(),c("div",null,[u,e("ul",null,[e("li",null,[e("p",null,[n("Android Studio (It is recommended to get the latest version from "),e("a",h,[n("here"),s(a)]),n(")")])]),e("li",null,[e("p",null,[n("IntelliJ IDEA (It is recommended to get the latest version from "),e("a",m,[n("here"),s(a)]),n(")")])]),y]),v,b,e("p",null,[n("We recommend using Kotlin DSL as the Gradle build script language and "),e("a",A,[n("SweetDependency"),s(a)]),n(" to manage dependencies.")]),D,e("ul",null,[e("li",null,[s(o,{to:"/en/library/android.html"},{default:i(()=>[n("Android")]),_:1})]),e("li",null,[s(o,{to:"/en/library/compose.html"},{default:i(()=>[n("Jetpack Compose")]),_:1})])]),C,g,e("ul",null,[e("li",null,[e("a",B,[n("Android"),s(a)])]),e("li",null,[e("a",f,[n("Jetpack Compose (Coming soon)"),s(a)])])])])}const F=r(d,[["render",_],["__file","quick-start.html.vue"]]);export{F as default};
|
28
assets/quick-start.html-SQ1_-HIx.js
Normal file
28
assets/quick-start.html-SQ1_-HIx.js
Normal file
@@ -0,0 +1,28 @@
|
||||
import{_ as t,r as o,o as p,c,a as s,b as n,d as e,w as r,e as i}from"./app-6WmjFGj_.js";const d={},u=i('<h1 id="快速开始" tabindex="-1"><a class="header-anchor" href="#快速开始" aria-hidden="true">#</a> 快速开始</h1><blockquote><p>集成 <code>PanguText</code> 到你的项目中。</p></blockquote><h2 id="项目要求" tabindex="-1"><a class="header-anchor" href="#项目要求" aria-hidden="true">#</a> 项目要求</h2><p>项目需要使用 <code>Android Studio</code> 或 <code>IntelliJ IDEA</code> 创建且类型为 Android 或 Kotlin Multiplatform 项目并已集成 Kotlin 环境依赖。</p>',4),h={href:"https://developer.android.com/studio",target:"_blank",rel:"noopener noreferrer"},m={href:"https://www.jetbrains.com/idea",target:"_blank",rel:"noopener noreferrer"},A=s("li",null,[s("p",null,"Kotlin 1.9.0+、Gradle 8+、Java 17+、Android Gradle Plugin 8+")],-1),y=s("h3",{id:"配置存储库",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#配置存储库","aria-hidden":"true"},"#"),n(" 配置存储库")],-1),v=s("p",null,[s("code",null,"PanguText"),n(" 的依赖发布在 "),s("strong",null,"Maven Central"),n(" 和我们的公共存储库中,你可以使用如下方式配置存储库。")],-1),b={href:"https://github.com/HighCapable/SweetDependency",target:"_blank",rel:"noopener noreferrer"},D=i(`<h4 id="sweetdependency-推荐" tabindex="-1"><a class="header-anchor" href="#sweetdependency-推荐" aria-hidden="true">#</a> SweetDependency (推荐)</h4><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;">repositories</span><span style="color:#ADBAC7;">:</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#8DDB8C;">google</span><span style="color:#ADBAC7;">:</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#8DDB8C;">maven-central</span><span style="color:#ADBAC7;">:</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;"># (可选) 你可以添加此 URL 以使用我们的公共存储库</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;"># 当 Sonatype-OSS 发生故障无法发布依赖时,此存储库作为备选进行添加</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;"># 详情请前往:https://github.com/HighCapable/maven-repository</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#8DDB8C;">highcapable-maven-releases</span><span style="color:#ADBAC7;">:</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;"># 中国大陆用户请将下方的 "raw.githubusercontent.com" 修改为 "raw.gitmirror.com"</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#8DDB8C;">url</span><span style="color:#ADBAC7;">: </span><span style="color:#96D0FF;">https://raw.githubusercontent.com/HighCapable/maven-repository/main/repository/releases</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><h4 id="传统方式" tabindex="-1"><a class="header-anchor" href="#传统方式" aria-hidden="true">#</a> 传统方式</h4><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;">repositories</span><span style="color:#ADBAC7;"> {</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">google</span><span style="color:#ADBAC7;">()</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">mavenCentral</span><span style="color:#ADBAC7;">()</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// (可选) 你可以添加此 URL 以使用我们的公共存储库</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// 当 Sonatype-OSS 发生故障无法发布依赖时,此存储库作为备选进行添加</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// 详情请前往:https://github.com/HighCapable/maven-repository</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// 中国大陆用户请将下方的 "raw.githubusercontent.com" 修改为 "raw.gitmirror.com"</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">maven</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"https://raw.githubusercontent.com/HighCapable/maven-repository/main/repository/releases"</span><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><h3 id="配置-java-版本" tabindex="-1"><a class="header-anchor" href="#配置-java-版本" aria-hidden="true">#</a> 配置 Java 版本</h3><p>在你的项目 <code>build.gradle.kts</code> 中修改 Kotlin 的 Java 版本为 17 及以上。</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;">android</span><span style="color:#ADBAC7;"> {</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">compileOptions</span><span style="color:#ADBAC7;"> {</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> sourceCompatibility </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> JavaVersion.VERSION_17</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> targetCompatibility </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> JavaVersion.VERSION_17</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">kotlinOptions</span><span style="color:#ADBAC7;"> {</span></span>
|
||||
<span class="line"><span style="color:#ADBAC7;"> jvmTarget </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">"17"</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><h2 id="功能一览" tabindex="-1"><a class="header-anchor" href="#功能一览" aria-hidden="true">#</a> 功能一览</h2><p>整个项目分为多个模块,Android 平台与 Jetpack Compose (多平台),你可以选择你希望引入的模块作为依赖应用到你的项目中。</p><p>你可以点击下方对应的模块前往查看详细的功能介绍。</p>`,12),C=s("h2",{id:"demo",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#demo","aria-hidden":"true"},"#"),n(" Demo")],-1),B=s("p",null,"你可以在下方找到一些示例,查看对应的演示项目来更好地了解这些功能的运作方式,快速地挑选出你需要的功能。",-1),_={href:"https://github.com/BetterAndroid/PanguText/tree/main/demo-android",target:"_blank",rel:"noopener noreferrer"},g={href:"https://github.com/BetterAndroid/PanguText/tree/main/demo-compose",target:"_blank",rel:"noopener noreferrer"};function k(f,x){const a=o("ExternalLinkIcon"),l=o("RouterLink");return p(),c("div",null,[u,s("ul",null,[s("li",null,[s("p",null,[n("Android Studio (建议从 "),s("a",h,[n("这里"),e(a)]),n(" 获取最新版本)")])]),s("li",null,[s("p",null,[n("IntelliJ IDEA (建议从 "),s("a",m,[n("这里"),e(a)]),n(" 获取最新版本)")])]),A]),y,v,s("p",null,[n("我们推荐使用 Kotlin DSL 作为 Gradle 构建脚本语言并推荐使用 "),s("a",b,[n("SweetDependency"),e(a)]),n(" 来管理依赖。")]),D,s("ul",null,[s("li",null,[e(l,{to:"/zh-cn/library/android.html"},{default:r(()=>[n("Android")]),_:1})]),s("li",null,[e(l,{to:"/zh-cn/library/compose.html"},{default:r(()=>[n("Jetpack Compose")]),_:1})])]),C,B,s("ul",null,[s("li",null,[s("a",_,[n("Android"),e(a)])]),s("li",null,[s("a",g,[n("Jetpack Compose (敬请期待)"),e(a)])])])])}const S=t(d,[["render",k],["__file","quick-start.html.vue"]]);export{S as default};
|
1
assets/quick-start.html-ddi7SydO.js
Normal file
1
assets/quick-start.html-ddi7SydO.js
Normal file
@@ -0,0 +1 @@
|
||||
const e=JSON.parse('{"key":"v-24840ff0","path":"/zh-cn/guide/quick-start.html","title":"快速开始","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"项目要求","slug":"项目要求","link":"#项目要求","children":[{"level":3,"title":"配置存储库","slug":"配置存储库","link":"#配置存储库","children":[]},{"level":3,"title":"配置 Java 版本","slug":"配置-java-版本","link":"#配置-java-版本","children":[]}]},{"level":2,"title":"功能一览","slug":"功能一览","link":"#功能一览","children":[]},{"level":2,"title":"Demo","slug":"demo","link":"#demo","children":[]}],"git":{"updatedTime":1754158640000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"zh-cn/guide/quick-start.md"}');export{e as data};
|
1
assets/quick-start.html-gd9ccG0P.js
Normal file
1
assets/quick-start.html-gd9ccG0P.js
Normal file
@@ -0,0 +1 @@
|
||||
const e=JSON.parse('{"key":"v-72889797","path":"/en/guide/quick-start.html","title":"Quick Start","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Project Requirements","slug":"project-requirements","link":"#project-requirements","children":[{"level":3,"title":"Configure Repositories","slug":"configure-repositories","link":"#configure-repositories","children":[]},{"level":3,"title":"Configure Java Version","slug":"configure-java-version","link":"#configure-java-version","children":[]}]},{"level":2,"title":"Functional Overview","slug":"functional-overview","link":"#functional-overview","children":[]},{"level":2,"title":"Demo","slug":"demo","link":"#demo","children":[]}],"git":{"updatedTime":1754158005000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":4}]},"filePathRelative":"en/guide/quick-start.md"}');export{e as data};
|
1
assets/r8-proguard.html-69xTqe-J.js
Normal file
1
assets/r8-proguard.html-69xTqe-J.js
Normal file
@@ -0,0 +1 @@
|
||||
const e=JSON.parse('{"key":"v-29d6c1ba","path":"/en/config/r8-proguard.html","title":"R8 & Proguard Obfuscate","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1739127925000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"en/config/r8-proguard.md"}');export{e as data};
|
1
assets/r8-proguard.html-D-RxO_Ql.js
Normal file
1
assets/r8-proguard.html-D-RxO_Ql.js
Normal file
@@ -0,0 +1 @@
|
||||
const t=JSON.parse('{"key":"v-154d6f69","path":"/zh-cn/config/r8-proguard.html","title":"R8 与 Proguard 混淆","lang":"zh-CN","frontmatter":{},"headers":[],"git":{"updatedTime":1739127925000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"zh-cn/config/r8-proguard.md"}');export{t as data};
|
1
assets/r8-proguard.html-PqTZGCA2.js
Normal file
1
assets/r8-proguard.html-PqTZGCA2.js
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as t,o as a,c as r,a as e,b as o}from"./app-6WmjFGj_.js";const s={},n=e("h1",{id:"r8-proguard-obfuscate",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#r8-proguard-obfuscate","aria-hidden":"true"},"#"),o(" R8 & Proguard Obfuscate")],-1),c=e("blockquote",null,[e("p",null,"In most scenarios, the app packages can be compressed through obfuscation, here is an introduction to how to configure obfuscation rules.")],-1),u=e("p",null,[e("code",null,"PanguText"),o(" does not require any additional obfuscation rules.")],-1),d=[n,c,u];function i(l,_){return a(),r("div",null,d)}const f=t(s,[["render",i],["__file","r8-proguard.html.vue"]]);export{f as default};
|
1
assets/r8-proguard.html-uJ-Di8s4.js
Normal file
1
assets/r8-proguard.html-uJ-Di8s4.js
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as o,o as t,c as a,a as e,b as r}from"./app-6WmjFGj_.js";const c={},n=e("h1",{id:"r8-与-proguard-混淆",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#r8-与-proguard-混淆","aria-hidden":"true"},"#"),r(" R8 与 Proguard 混淆")],-1),s=e("blockquote",null,[e("p",null,"大部分场景下应用程序安装包可通过混淆压缩体积,这里介绍了混淆规则的配置方法。")],-1),d=e("p",null,[e("code",null,"PanguText"),r(" 不需要额外配置混淆规则。")],-1),_=[n,s,d];function l(u,i){return t(),a("div",null,_)}const p=o(c,[["render",l],["__file","r8-proguard.html.vue"]]);export{p as default};
|
1
assets/style-Rgr8LWAc.css
Normal file
1
assets/style-Rgr8LWAc.css
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user