丈夫志四海,万里犹比邻。 —曹植《赠白马王彪》
如上图所示,RTL(Right To Left)即视图的表现形式是从右开始向左结束。我们日常更习惯于LTR(Left To Right)视图,但在中东的阿拉伯语系里他们视觉习惯跟我们正好相反,他们更习惯从右向左的视觉形式。
最近公司开发的产品正好需要做RTL适配,本文总结分享在适配RTL过程中的技术要点。
1. 首先在AndroidManifest文件中添加支持
...
"true"
...
2. 替换资源文件中的xxxLeft/xxxRight为xxxStart/xxxEnd
在AS开发环境下,可以通过Refactor---->Add RTL support where possible
快速替换。需要注意的是替换完成后,最好在用grep命令搜索下xxxLeft/xxxRight,看是否有漏网之鱼。比如一些定义在style文件中的属性就有可能替换失败。
3. 反转某些图标
某些图标在RTL布局中,需要做反转,比如类似<--
的图标在RTL布局中应该显示成-->
, 首先可以让美工切一套专门针对RTL布局的图标,将其放在drawable-ldrtl目录下。或者通过设置android:autoMirrored="true"
,可惜前者会造成图片资源冗余,增大apk体积,而后者需要API等级在19以后才可以。
这里介绍一个比较通用的方案。通过xml去配置,可以在图标的属性中添加
android:rotationY="@integer/rotation"
然后在value/integer.xml声明如下:
<resources>
<integer name="rotation">0integer>
resources>
最后在value-ldrtl/integer.xml声明如下:
<resources>
<integer name="rotation">180integer>
resources>
4. 检查代码中动态设置的Margin/Padding
类似rightMargin
这种的需要替换成setMarginEnd(end)
Gravity.LEFT/RIGHT
替换成Gravity.START/END
setPadding(left, top, right, bottom)
替换成setPaddingRelative(start, top, end, bottom)
可以采用命令
git grep -E "\.rightMargin|\.leftMargin|Gravity\.LEFT|Gravity\.RIGHT|setMargin\(|setPadding\("
快速过滤出代码中可能需要修正的地方,然后在针对具体逻辑看是否需要修改。
5. 特殊控件适配
public class RtlViewPager extends ViewPager {
//这里初始化赋值,TabLayout初始化时使用了该值。
private int mLayoutDirection = ViewCompat.LAYOUT_DIRECTION_LTR;
解决办法是:当判断是RTL视图模式,手动对ViewPager设置布局方式加以修正。
rtlViewPager.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
android:textAlignment="viewStart"
中东语言对大多数开发者来说都是天书般的文字,因此在查看适配后的效果时,可能不太方便。在Android系统的开发者选项里有一个强制采用RTL布局的选项,即使没有切换中东语言,也可以非常方便的观察效果。