概述

阿拉伯作为一个土豪帝国,android在sdk17(Android4.2)也开始支持RTL(right to left)布局了。镜像view等一些设计原则,都可以从官网找到。给出链接传送门
https://material.io/guidelines/usability/bidirectionality.html#bidirectionality-rtl-mirroring-guidelines

RTL布局

rtl布局的判断来自两个部分,一个是系统语言,还有一个就是AndroidManifest.xml中application结点中的supportRtl属性,只有当为true的时候,app才会支持镜像适配。

<application...android:supportsRtl="true"/>
</application>

布局的判断可以使用LayoutDirection.

总结一个函数就是这样的:

/**
* 判断是否进行阿拉伯镜像,判断取决于两个条件:<br />
* 一丶Androidmanifest.xml中的supportsRtl<br />
* 二、当前系统为阿拉伯语
*
* @return 是否为rtl
*/
public static boolean isRTL() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {return false;
}ApplicationInfo applicationInfo = BaseApplication.getInstance().getApplicationInfo();
boolean hasRtlSupport = (applicationInfo.flags & FLAG_SUPPORTS_RTL) == FLAG_SUPPORTS_RTL;
boolean isRtl = TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) == View.LAYOUT_DIRECTION_RTL;
return hasRtlSupport && isRtl;
}

如何适配

在如何适配上,可以分几个方面:图标、xml属性、代码set方法、部分控件、自定义控件。

图标

图标大概是最直白的一个。back按钮,喇叭、进度条等等,都得反一下。新建一个drawable-ldrtl-xxhdpi目录统统扔进去。


ps:具体的可以参考之前的官网链接,里面讲的很清楚,只提一个重点,那么就是进度条,并不是所有的进度条都需要镜像,如果是多媒体播放的进度条,那么还是遵循从左往右的,例如视频等等,也可以参考youtube、facebook这样的app来看看。

xml属性

对于UI上的适配,大部分处理都是由布局xml来决定的,这里推荐使用Android Studio自带的“RTL Support”来优化。
鼠标右键编辑区域,Refactor->Add RTL Support Where Possible…

点击run后,会适配所有left和right相关的属性,一律换成start和end,值得注意一点的是,如果你的app要支持到17以下,那么写属性的时候,需要把两个方法都写上,这样才不会报错。

这里涉及到的相关属性包括:

LTR RTL
layout_marginLeft /layout_marginRight layout_marginStart/layout_marginEnd
paddingLeft/paddingRight paddingStart/paddingEnd
layout_alignLeft/layout_alignRight layout_alignStart/layout_alignEnd
layout_alignParentLeft/layout_alignParentRight layout_alignParentStart/layout_alignParentEnd
layout_toLeftOf/layout_toRightOf layout_toStartOf/layout_toEndOf
drawableLeft/drawableRight drawableStart/drawableEnd

ps:可能还有某些比较偏的属性,就不列出来了。这里还有一个比较特殊的gravity和layout_gravity,当app支持17以下的时候,可以直接使用start/end代替left/right,官方解释是start/end的字节码要大于left/right,所以你可以直接写成

android:gravity="start"

而不用写成

android:gravity="left|start"

还有一个就是textview,阿拉伯文字都是从右往左的,所以在阿拉伯语言下,如果出现英文中文或者数字,有时候还是会显示在左边。这里介绍一个属性“textDirection”。可以自由定义文字从哪一边开始显示。一般可以设置android:textDirection=”locale”让它跟着系统语言走。控制view也有相同属性,叫作“layoutDirection”,可以控制view是否镜像(比如不想某些view发生镜像,可以通过设置这个属性来控制)。

======2018.01.17补充======

今天发现,

代码set方法

这个就很好理解了,xml属性里用到的,代码设置里也需要适配一下。同样,支持17以下的话,需要适配版本,话不多说,直接上代码

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view.getLayoutParams();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {params.setMarginEnd(0);
} else {params.rightMargin = 0;
}

这里涉及到的相关方法包括:

LTR RTL
.leftMargin /.rightMargin setMarginStart/setMarginEnd
setPadding setPaddingRelative
setCompoundDrawablesWithIntrinsicBounds setCompoundDrawablesRelativeWithIntrinsicBounds
setCompoundDrawables setCompoundDrawablesRelative

ps:可能有些比较偏的函数,这里也不列出来了。还有就是给recyclerview设置ItemDecoration的时候,left/right要区分RTL。

部分控件

虽然Android说是支持了RTL,但是还是有一些常用的控件,没能做到适配,这里列举我遇到的两个。viewpager和tablayout(tablayout继承HorizontalScrollView)。

viewpager主要就是手势和view child的交互问题,很简单,网上已经有大神给出了解决方案,大致就是对数据源进行反转,上github链接
RtlViewPager。

HorizontalScrollView的问题主要就是,有时候会发生初始状态不在0位置。这里的解决方案是,计算所有child的宽度总和,然后scroll一下就行了。当然,没那么笨,因为HorizontalScrollView里面只能放一个layout,只要计算这个一个layout的宽度就行了。这个问题的原因暂时还没看源码,但是估计是因为,当HorizontalScrollView add完所有的child的时候,会停留在最后,然后执行一波scrollTo(0),让队列回到最前面,但是对于RTL的布局来讲,0位置恰恰就是最后,因此就会出现初始状态不在0位置的问题。

/**
* @author tong.xu
* fix rtl下,tablayout初始化后,不是停留在初始位置的bug
*/
final int scrollX = mTabLayout.getChildAt(0).getMeasuredWidth();
if (CommonUtil.isRTL() && scrollX != 0) {mTabLayout.post(new Runnable() {@Override public void run() {mTabLayout.scrollTo(scrollX, 0);}});
}

自定义控件

大概这一部分是最难改的了,为什么这么说呢,因为它大概集成了上述所有的问题,并且还要结合自定义控件的逻辑去修改。如果是当初自己写的还稍微好点儿,要是别人写的,还要去读懂实现的逻辑,那是非常耗时费劲的,还容易出bug,所以建议还是谁挖的坑,谁来补(哈哈^_^,不厚道地笑了)。

简单说说怎么改的入手点吧。首先弄明白rtl和正常的布局有什么不同,比如getLeft(),getX(),X坐标上的变动基本都是要反的,就像之前的HorizontalScrollView,什么滚动啊之类的,都要注意。我来举个最简单的例子,画一个刻度尺。

一格的刻度大小为

int cell = (Screen.width - 2*x) / 2;

ltr:1的x坐标是x,2是x + cell,3是x + 2 * cell
rtl:(这个时候就要从最右算过来)1的x坐标是Screen.width - x,2是Screen.width - x - cell,3是Screen.width - x - 2 * cell

各个值 LTR下的x坐标 RTL的x坐标
1 x Screen.width - x
2 x + cell Screen.width - x - cell
3 x + 2 * cell Screen.width - x - 2 * cell

看起来是不是一点儿也不麻烦,当然我这个只是一个最简单的例子,当各种逻辑混起来的时候,肯定还会复杂,我这里只给一个思路,具体的还是要靠自己去适配了。

总结

总结一下吧,阿拉伯适配对于一个国际化的公司其实还是很重要的,尤其是阿拉伯石油大亨,用户价值还是很高的。适配的操作步骤,按照上述方法一步步下来,先适配简单的,再适配困难的,个别问题再个别处理,一套下来适配个90%基本都是没有问题的。好了,就讲到这里吧!

Android阿拉伯适配rtl相关推荐

  1. Android 系统(226)---Android 阿拉伯语适配

    Android 阿拉伯语适配 RTL 语言由来 RTL 是 Right-to-left(从右向左) 的缩写.其意为人们书写阅读习惯是从右向左,朝左继续的,常见的 RTL 语言有阿拉伯语,希伯来语等. ...

  2. Android阿拉伯语UI适配问题汇总

    Android阿拉伯语UI适配问题汇总 Sensi Sun RTL和LTR LTR 是 Left-to-right(从左向右) 的缩写.(常用) RTL 是 Right-to-left(从右向左) 的 ...

  3. Android 阿拉伯语适配

    首先推荐一个链接:https://www.jianshu.com/p/d8cd294a5c31 开始进入正题 1.sdk要求: Android 4.2 即 SDK 17 2.四个重要属性: andro ...

  4. iOS 阿拉伯语 RTL适配

    阿拉伯语: 背景:阿拉伯语使用者占世界人口的6%,使用阿拉伯字母,为从右至左书写的文字,主要通行于18个阿拉伯国家及4个国际组织的官方语言.以阿拉伯语作为母语的人数超过2.6亿人.阿拉伯语在全球范围使 ...

  5. Android 应用支持RTL 阿语反转的UI适配处理看这一篇就够了

    注意:应用程序支持RTL的布局需要在AndroidManifest.xml的<application>中,添加android:supportsRtl=true.该声明代表您的应用程序是否支 ...

  6. Android屏幕适配方案

    一. 手机适配的应用和使用场景 使android应用程序适用于不同的国家语言.型号.尺寸和SDK版本等手机环境中,其主要功能和界面风格保持不变. 手机适配主要包括三个方面:语言适配.屏幕适配.SDK平 ...

  7. Android 屏幕适配方案(七)

    原文地址为: Android 屏幕适配方案(七) 一. 手机适配的应用和使用场景 使android应用程序适用于不同的国家语言.型号.尺寸和SDK版本等手机环境中,其主要功能和界面风格保持不变. 手机 ...

  8. android rtl布局支持,Android 布局之 RTL

    Android 布局之 RTL 中东国家地区须要适配 RTL的布局,顾名思义支持从右至左布局android 前提:在AndroidManifest.xml文件中 android:supportsRtl ...

  9. Android 布局之 RTL

    Android 布局之 RTL 中东国家地区需要适配 RTL的布局,顾名思义支持从右至左布局 前提:在AndroidManifest.xml文件中 <application 设置属性 andro ...

最新文章

  1. 【算法拾遗(java描写叙述)】--- 选择排序(直接选择排序、堆排序)
  2. ArrayList和HashSet
  3. 选择与循环:剪刀石头布_Python之石头剪刀布小游戏(史上最详细步骤)
  4. 学习vue.js的自我梳理笔记
  5. Do not use built-in or reserved HTML elements as component id等等vue warn问题
  6. Silverlight读取Zip文件中的图片与视频
  7. 网络安全从业者“行话”
  8. 求职软件测试工程师英文简历,软件测试员英文简历模板.doc
  9. 使用外网访问Flask项目
  10. 超算入门笔记:大型机上如何运行WRF模式?一文总结(并行运算、Linux基础、作业调度、WRF运行)
  11. mybatis+mysql查询类别下的所有子类别(递归)
  12. 每秒订单数25倍提升,蘑菇街怎样跨过海量服务架构的技术藩篱?
  13. 夹治具设计需要遵循的一些设计准则:
  14. Gradient Descent and NSCA
  15. Amazon亚马逊 Vendor Central EDI对接流程是什么?
  16. python array太慢_python - gdal ReadAsarray对于vrt非常慢 - 堆栈内存溢出
  17. 文旅夜游互动体验如何吸引游客
  18. java使用selenium-chrome-driver实现简单的本地爬虫
  19. 视频教程-项目2——在线无忧库存预警系统-Java
  20. 在计算机内部 g的asc,在计算机内部,大写字母“G”的ASCⅡ码为“1000111”,大写字母“K”的ASCⅡ码为()。...

热门文章

  1. python有趣小程序-搞几款由quot;Python”语言编写的quot;有趣、恶搞、好玩”的程序代码!...
  2. 项目成功关键要素和项目成功关键要素
  3. MySQL-5.5.32 配置文件优化详解
  4. Markdown插入网易云音乐播放模块
  5. 五一劳动节致全体技术同胞书
  6. Canvas 实用API详解
  7. 计算机专业 大一课程,计算机专业大一课程
  8. 同时买票是怎么实现的_候补购票和抢票有什么不同 候补购票和抢票能同时进行吗...
  9. 2380318-57-8,Thalidomide-O-PEG4-Azide通过点击化学与炔烃或DBCO、BCN连接的分子反应的PROTAC连接物
  10. python程序设计搜题软件_智慧职教云课堂APPPython程序设计(常州工业职业技术学院)期末考试搜题公众号答案...