Android阿拉伯适配rtl
概述
阿拉伯作为一个土豪帝国,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相关推荐
- Android 系统(226)---Android 阿拉伯语适配
Android 阿拉伯语适配 RTL 语言由来 RTL 是 Right-to-left(从右向左) 的缩写.其意为人们书写阅读习惯是从右向左,朝左继续的,常见的 RTL 语言有阿拉伯语,希伯来语等. ...
- Android阿拉伯语UI适配问题汇总
Android阿拉伯语UI适配问题汇总 Sensi Sun RTL和LTR LTR 是 Left-to-right(从左向右) 的缩写.(常用) RTL 是 Right-to-left(从右向左) 的 ...
- Android 阿拉伯语适配
首先推荐一个链接:https://www.jianshu.com/p/d8cd294a5c31 开始进入正题 1.sdk要求: Android 4.2 即 SDK 17 2.四个重要属性: andro ...
- iOS 阿拉伯语 RTL适配
阿拉伯语: 背景:阿拉伯语使用者占世界人口的6%,使用阿拉伯字母,为从右至左书写的文字,主要通行于18个阿拉伯国家及4个国际组织的官方语言.以阿拉伯语作为母语的人数超过2.6亿人.阿拉伯语在全球范围使 ...
- Android 应用支持RTL 阿语反转的UI适配处理看这一篇就够了
注意:应用程序支持RTL的布局需要在AndroidManifest.xml的<application>中,添加android:supportsRtl=true.该声明代表您的应用程序是否支 ...
- Android屏幕适配方案
一. 手机适配的应用和使用场景 使android应用程序适用于不同的国家语言.型号.尺寸和SDK版本等手机环境中,其主要功能和界面风格保持不变. 手机适配主要包括三个方面:语言适配.屏幕适配.SDK平 ...
- Android 屏幕适配方案(七)
原文地址为: Android 屏幕适配方案(七) 一. 手机适配的应用和使用场景 使android应用程序适用于不同的国家语言.型号.尺寸和SDK版本等手机环境中,其主要功能和界面风格保持不变. 手机 ...
- android rtl布局支持,Android 布局之 RTL
Android 布局之 RTL 中东国家地区须要适配 RTL的布局,顾名思义支持从右至左布局android 前提:在AndroidManifest.xml文件中 android:supportsRtl ...
- Android 布局之 RTL
Android 布局之 RTL 中东国家地区需要适配 RTL的布局,顾名思义支持从右至左布局 前提:在AndroidManifest.xml文件中 <application 设置属性 andro ...
最新文章
- 【算法拾遗(java描写叙述)】--- 选择排序(直接选择排序、堆排序)
- ArrayList和HashSet
- 选择与循环:剪刀石头布_Python之石头剪刀布小游戏(史上最详细步骤)
- 学习vue.js的自我梳理笔记
- Do not use built-in or reserved HTML elements as component id等等vue warn问题
- Silverlight读取Zip文件中的图片与视频
- 网络安全从业者“行话”
- 求职软件测试工程师英文简历,软件测试员英文简历模板.doc
- 使用外网访问Flask项目
- 超算入门笔记:大型机上如何运行WRF模式?一文总结(并行运算、Linux基础、作业调度、WRF运行)
- mybatis+mysql查询类别下的所有子类别(递归)
- 每秒订单数25倍提升,蘑菇街怎样跨过海量服务架构的技术藩篱?
- 夹治具设计需要遵循的一些设计准则:
- Gradient Descent and NSCA
- Amazon亚马逊 Vendor Central EDI对接流程是什么?
- python array太慢_python - gdal ReadAsarray对于vrt非常慢 - 堆栈内存溢出
- 文旅夜游互动体验如何吸引游客
- java使用selenium-chrome-driver实现简单的本地爬虫
- 视频教程-项目2——在线无忧库存预警系统-Java
- 在计算机内部 g的asc,在计算机内部,大写字母“G”的ASCⅡ码为“1000111”,大写字母“K”的ASCⅡ码为()。...
热门文章
- python有趣小程序-搞几款由quot;Python”语言编写的quot;有趣、恶搞、好玩”的程序代码!...
- 项目成功关键要素和项目成功关键要素
- MySQL-5.5.32 配置文件优化详解
- Markdown插入网易云音乐播放模块
- 五一劳动节致全体技术同胞书
- Canvas 实用API详解
- 计算机专业 大一课程,计算机专业大一课程
- 同时买票是怎么实现的_候补购票和抢票有什么不同 候补购票和抢票能同时进行吗...
- 2380318-57-8,Thalidomide-O-PEG4-Azide通过点击化学与炔烃或DBCO、BCN连接的分子反应的PROTAC连接物
- python程序设计搜题软件_智慧职教云课堂APPPython程序设计(常州工业职业技术学院)期末考试搜题公众号答案...