Android RTL適配:需要做哪些工作呢?
一. 序
越來越多的公司 App,都開始淘金海外,尋找更多的機會。然而海外市場千差萬別晨缴,無論是市場還是用戶的使用習慣译秦,都有諸多的不同。
當你接觸一款出海 App 的時候击碗,除了需要了解海外 Google Service 的整個生態(tài)圈筑悴,還要做好不同語言的適配。語言適配最通用的做法就是根據(jù)不同系統(tǒng)語言設定延都,配置不同的語言資源(strings.xml)雷猪,而其中比較特殊的就是例如阿拉伯的 RTL 布局,它不僅改變了語言晰房,還改變了 UI 布局和使用習慣求摇。
我們常用的習慣,稱之為 LTR(Left-To-Right)殊者,其意為我們的閱讀和書寫習慣与境,是從左向右延伸的。而 RTL(Right-To-Left) 則正好相反猖吴,它的閱讀和使用的習慣都是從右向左摔刁,常見使用 RTL 習慣的語言有阿拉伯語、希伯來語等海蔽。
今天就來聊聊共屈,一個成熟的 Android App,想要做 RTL 適配党窜,需要關(guān)注什么拗引,想要適配 RTL 有哪些任務清單。
如果你維護的 App 有國際化的要求幌衣,那這個問題是遲早需要面對的矾削。
二. Android 支持 RTL
2.1 什么是 RTL?
正如前面介紹的,RTL 是 Right-to-left 的縮寫哼凯,其意為閱讀和書寫的習慣欲间,是從右向左延伸的。再對比一下我國人自身的使用習慣断部,都是 LTR 的猎贴,也就是從左向右。
RTL 可以簡單理解是 LTR 的鏡像家坎,當需要適配 RTL 的時候嘱能,除了翻譯語言本身,還需要做到的就是 UI 布局虱疏,從中軸上鏡像反轉(zhuǎn)惹骂。
雖然 RTL 不符合我們國人的使用習慣,但是全球范圍內(nèi)依然有一部分人保持著 RTL 的習慣做瞪,比較常見的就是阿拉伯語对粪、希伯來語等。
就 Android 系統(tǒng)來說装蓬,Android 4.1 開始就在 TextView 和 EditView 中增加了對雙向文本的優(yōu)先支持著拭,允許其文本內(nèi)容從左向右(LTR)到從右向左(RTL)的顯示和切換。而在 Android 4.2 開始牍帚,增加了對 RTL 鏡像布局完全原生的支持儡遮。
也就是在 Android 4.2(Api Level 17)及之后,在 UI 上的布局鏡像暗赶,是原生支持的鄙币。在這些系統(tǒng)版本上,只要用戶系統(tǒng)語言切換到「RTL 系語言」蹂随,首先系統(tǒng) UI 會直接左右鏡像切換十嘿,此時如果你的 App 支持 RTL 鏡像布局時,也會自動切換布局方向岳锁。
2.2 App 如何支持 RTL 鏡像
正如前面介紹的一樣绩衷,LTR 到 RTL 的切換,不是由開發(fā)者控制的激率,而通常是由系統(tǒng)語言來控制的咳燕。
當系統(tǒng)語言切換為「RTL 系語言」時,還需要你的 App 支持 RTL 鏡像布局乒躺。
這里所謂的支持迟郎,其實只需要配置一個屬性即可,就是 AndroidManifest.xml 配置文件中的一個清單元素聪蘸。需要在?<applictaion>?標簽下,配置元素?android:supportsRtl="true"。
此時當系統(tǒng)語言切換的時候健爬,你的 App 也會跟著切換 UI 布局為鏡像后的效果控乾。
除了需要開啟?supportsRtl?屬性之外,還需要一些布局屬性的配合娜遵。
簡單來說蜕衡,就是將布局需要的所有 xxxLeft/xxxRight "替換"為 xxxStart/xxxEnd。
例如我們常用的 Padding 和 Margin设拟,都有類似 paddingLeft 和 layout_marginRight 屬性慨仿,這些就需要"替換"成 paddingStart 和 layout_marginEnd 屬性。當然不止于此纳胧,還有一些 gravity镰吆、drawableLeft 等屬性需要"替換"。原則上跑慕,所有?Left/Right?都需要變換為?Start/End?就好了万皿。
這些屬性,官方文檔中已經(jīng)幫我們列舉出來了核行。
到這里應該了解了牢硅,Android App 支持 RTL 鏡像的主要流程,就兩步:
App 增加?android:supports="true"?屬性芝雪。
調(diào)整 UI 布局屬性减余,從?left/right?到?start/end?切換。
那么問題來了惩系,我們在日常編碼的過程中位岔,應該使用 left/right 還是 start/end?還是兩者都需要蛆挫?
注意到我前面提到的 UI 布局屬性的替換時赃承,是打了引號的,你是否需要使用?start/end?來完全替換?left/right?悴侵,完全取決于 App 當前的 minSdkVersion 值瞧剖。
正如前面所提到的,Android 對 RTL 的原生支持可免,是在 Android 4.2 中才具備的抓于,也就是說,如果 App 的 minSdkVersion 大于等于 4.2浇借,你只需要使用?start/end?屬性捉撮,但如果還需要支持 4.2 以下的設備用戶,那就需要保留?left/right?和?start/end?兩者妇垢。
在低于 4.2 的系統(tǒng)中巾遭,不識別?supportsRtl?和?start/end?屬性肉康,所以不會造成影響。但是需要注意灼舍,在適配完成之后吼和,后續(xù)開發(fā)新頁面時的編碼習慣。
2.3 AS 助力調(diào)整布局屬性
如果當前需要適配的是一個成熟項目骑素,并且其中的布局習慣還是使用?left/right?系的屬性炫乓,那么針對所有頁面布局文件,進行手工調(diào)整就是一個非常大的工作量了献丑。
所幸的是 AS 提供了自動化的支持末捣。
你可以在?Refactor → Add RTL Support Where Possible?來開啟 RTL 的自動調(diào)整。
它會自動將項目中所有的?left/right?屬性都替換為?start/end?屬性创橄,如果想要適配 Android 4.2 以下的設備箩做,需要保留兩者,那么在 Run 之前筐摘,勾選?Relpace Left/Right Properties with Start/End Properties?選項即可卒茬。
早期的 AS 自動支持 RTL 布局的時候,效率會有一些問題咖熟,轉(zhuǎn)換的時候如果布局過多圃酵,可能會卡死,但是新版的 AS 已經(jīng)優(yōu)化了很多馍管,轉(zhuǎn)換效率上還是可以接受的郭赐。
另外這畢竟是自動替換,在替換完成之后确沸,還是需要每個頁面都測試一遍捌锭,看看效果才算完,有時候還需要我們做一些微調(diào)的工作罗捎。例如 AS 自動替換 RTL 布局的時候观谦,如果使用了?include?標簽,其中用到的方向?qū)傩圆粫惶鎿Q桨菜。
自動化雖然方便了我們機械的重復豁状,但也必須介入人工的干預符合預期。
三. RTL 細節(jié)調(diào)整
要做這種全全局的改動倒得,必然會有一些細節(jié)需要微調(diào)的泻红,這里簡單寫一些 RTL 布局中會需要使用到的細節(jié)調(diào)整技巧。
3.1 利用全局樣式霞掺,批量修改屬性
在適配 RTL 的過程中谊路,無法避免的就是有一些屬性必須要設置。例如 EditView 就需要設置以下屬性菩彬。
android:textAlignment="viewStart"
android:gravity="start"
android:textDirection="locale"
那我們就可以將這些屬性在 style.xml 中全局為 EditText 設置上缠劝。
...@style/EditTextStyle.Alignment...viewStartstartlocale
同時 TextView 也需要設置?android:textDirection?屬性潮梯,也可以采用相同的方法用 Style 的方式全局設置。
3.2 針對 RTL 的資源適配
除了布局上的適配之外剩彬,還有一些資源的適配酷麦,資源適配主要說兩塊內(nèi)容:Drawable(mipmap) 以及 Layout 布局資源。
先來說說 Drawable 的適配喉恋。例如在不同方向的布局下,使用不同的圖標母廷。
上圖就是個很典型的例子轻黑,在調(diào)整布局到 RTL 時,還需要注意返回「←」的圖標也需要替換成「→」琴昆。
這里依然使用 Android 對資源使用的限定符的方式氓鄙,可以創(chuàng)建?drawable-ldrtl?目錄,將翻轉(zhuǎn)后的圖標业舍,放在這個目錄下抖拦。如果需要限定 dpi,可以在目錄名后面追加舷暮。
res/
? drawable/
? ? a.png?
? drawable-ldrtl/
? ? a.png? // 對標 drawable/a.png 的 RTL 圖標
? drawable-xhdpi/
? ? b.png?
? drawable-ldrtl-xhdpi/
? ? b.png? // 對標 drawable-xhdpi/b.png 的 RTL 圖標
接下來再說說 Layout 布局的 RTL 布局效果適配态罪。有些特殊的頁面,可能光鏡像化還不夠下面,還需要針對性的做一些 UI 上的調(diào)整复颈,那最簡單的做法就是做兩套布局,互不影響沥割。
既然 Drawable 可以通過資源限定符的方式耗啦,設置 RTL 布局下使用的圖標,其實布局也可以机杜。
對于布局文件帜讲,可以在目錄下追加限定符?layout-ldrtl/,如果想對某個語言做布局適配椒拗,也可以增加語言限定似将,例如阿拉伯語可以用?layout-ar/。
res/? layout/? ? main.xml// 默認布局layout-ar/? ? main.xml// 阿拉伯語布局layout-ldrtl/? ? main.xml// RTL 布局
針對 RTL 的 UI 布局規(guī)范陡叠,Material Design 下有一個規(guī)范的文檔(https://material.io/design/usability/bidirectionality.html#localization)玩郊,設計師可以參考。
3.3 代碼判斷是否 RTL枉阵?
有些控件的屬性译红,是通過代碼動態(tài)調(diào)整的,那在使用的過程中兴溜,就需要在代碼中侦厚,判斷當前的環(huán)境耻陕,是 RTL 還是 LTF,才可以確定后續(xù)的屬性設置刨沦。
通過獲取 Configuration 的 locale 來判斷當前的環(huán)境诗宣,為了兼容,在 TextUtilsCompat 下也提供了類似的方法想诅。
publicbooleanisRtl(){returnTextUtilsCompat.getLayoutDirectionFromLocale(getContext().getResources().getConfiguration().locale) == ViewCompat.LAYOUT_DIRECTION_RTL;}
isRtl()?方法可以直接拿來使用召庞,依此判斷結(jié)果,執(zhí)行后續(xù)的操作来破。
3.4 不是所有控件都支持 RTL
雖說從 Android 4.2 開始篮灼,原生支持 RTL 方向布局,但是也有一些控件是不支持的徘禁,例如 ViewPager诅诱,就不支持 RTL 的方向。
這其實沒有什么很好的辦法送朱,要么和產(chǎn)品商量對此處的容忍娘荡,要么找一些其他的解決方案。
針對 ViewPager 的 RTL 化驶沼,在 Github 就有對應的開源庫 RtlViewPager(https://github.com/diego-gomez-olvera/RtlViewPager)?可供使用炮沐。其原理也是將數(shù)據(jù)進行倒序重排,沒什么好說的商乎,源碼不多央拖,有興趣可以自己看看。
四. 適配 RTL 要如何估期鹉戚?
再來聊聊適配 RTL 時鲜戒,估算開發(fā)周期的問題。
除了 App 本身在設計研發(fā)之初抹凳,就是為了中東的土豪設計的之外遏餐,多數(shù)情況下,我們都是因為各種外部原因赢底,需要在一款成熟的 App 上失都,適配 RTL 鏡像布局。例如市場驗證有大量「RTL 系語言」的付費用戶幸冻,或者產(chǎn)品經(jīng)理認為存在「RTL 系語言」的潛在用戶粹庞。
什么時候適配 RTL,完全是由外部因素決定的洽损。但是當需要適配的時候庞溜,我們作為開發(fā)者,最直觀要面對的現(xiàn)實問題就是碑定,適配 RTL 需要做哪些事流码?這個任務需要多少時間能夠完成又官?需要哪些人來配合,哪些任務是可以并行的漫试?
要精確估計 App 的 RTL 化六敬,很難,因為工作量主要來自適配驾荣,說到適配外构,工作量就可大可小了计贰。App 大量使用第三方控件的就比只使用原生控件的工作量大樊拓;產(chǎn)品經(jīng)理和設計師,允許部分頁面適配有差異的琉雳,也會比高要求還原的工作量大叮趴。
這些在適配完成之前,誰也不知道效果如何权烧,既然沒有什么好的方法眯亦,那就試一試吧,只需要三步般码,你可以拿著一個明確的鏡面翻轉(zhuǎn)效果妻率,來估計適配的難度。
設置?android:supportsRtl="true"板祝,讓 App 支持 RTL宫静。
AS 自動轉(zhuǎn)換布局屬性,支持 RTL 布局效果券时。
打開開發(fā)者選項中的「強制使用從右到左的布局方向」孤里,強制 RTL 布局。
此時你基本上可以看到一個 80% RTL 化的 App橘洞,剩下的就是把頁面都檢查一遍捌袜,看看有沒有用到哪些控件不支持 RTL,哪些 Drawable 需要替換炸枣、哪些布局需要微調(diào)虏等。然后針對性的調(diào)整即可。
有一些控件不支持 RTL 就會比較麻煩适肠,有源碼的就改改源碼霍衫,沒源碼的就看有沒有地方可以 Hook 解決。
總之需要做什么侯养,清單是固定的敦跌。有了明確的任務,自然就容易估計開發(fā)周期了沸毁。
列舉一下適配 RTL 的任務清單:
App 支持 RTL峰髓,AS 自動轉(zhuǎn)換布局屬性支持 RTL傻寂,從開發(fā)者選項里強制 RTL 布局方向。
按頁面排查携兵,檢查出需要翻轉(zhuǎn)的 Drawable 資源疾掰,打包交給設計師,反轉(zhuǎn)后替換徐紧。
檢查布局翻轉(zhuǎn)后的效果静檬,和設計師確定需要適配翻轉(zhuǎn)后的 UI 效果。
找到不支持 RTL 化的控件并级,可以從源碼的角度分析拂檩,能改源碼的改源碼,不能改源碼的嘗試 Hook 解決或找替代方案嘲碧。
翻譯 RTL 系語言資源 strings.xml稻励,放入對應的資源目錄,例如阿拉伯語需要放入 /values-ar/strings.xml 目錄愈涩,將系統(tǒng)語言切換到阿拉伯語望抽,排查所有頁面文字與控件的匹配度。
整體驗收履婉,微調(diào)效果煤篙。
其中需要和產(chǎn)品、設計毁腿、翻譯配合的辑奈,都可以提前準備,讓任務并行化已烤。當然在適配的過程中鸠窗,還有一些實際的問題,就需要遇到問題再解決問題了草戈。
五. 小結(jié)時刻
本文聊了如何在一個成熟的 App 上塌鸯,適配 RTL 鏡像效果,以及如何快速的適配唐片。最后還列出了一個適配時丙猬,需要調(diào)整關(guān)注的清單列表,希望對你有所幫助费韭。
本文就到這里茧球,如果有所幫助,留言星持、轉(zhuǎn)發(fā)抢埋、點好看是最大的支持,謝謝!
轉(zhuǎn)自:https://www.cnblogs.com/plokmju/p/android_rtl.html