Android阿拉伯语混排
文章目录
- 1.Android阿拉伯语混排显示关键类 BidiFormatter
- 1.示例一
- 测试一
- 测试二
- 测试三
- 测试三
- 测试四
- 测试五
- 2. 示例二
- 3. 示例三
- 4. 示例四
- 2.关于实现上面功能中途碰到另外两个小问题
- 好了,全文结束,如有问题,欢迎大家指正交流~
1.Android阿拉伯语混排显示关键类 BidiFormatter
关于这个类的具体使用大家可以阅读一下官方文档
BidiFormatter
阿拉伯语的显示阅读方式都是自右向左
的,与我们熟悉的自左向右
刚好相反。
为了便于讲解,我这里把代码和显示效果一起结合说明。
下面要用到的方法
import androidx.core.text.BidiFormatter
fun String.biDiFormat(): String {return BidiFormatter.getInstance(Locale.getDefault()).unicodeWrap(this, TextDirectionHeuristicsCompat.LOCALE)}
这里注意用到androidx.core.text
还有一个相同类是在android.text包下的,但是它的unicodeWrap方法只能在android8.0以上才可以使用。
1.示例一
测试一
val content = "我是中国人"binding.tv.text = content
在系统语言是自左向右
环境下显示如下
在系统语言是自右向左
下显示如下
第一张图是自左向右
环境下显示是没有问题的
第二张图你是不是觉得也没什么问题呢?
光从文字上看确实是没什么问题,但是我们在系统语言是自右向左
的阅读方式下显示时,
那这就是问题了,正常显示的话文本应该是位于屏幕右侧,那怎么实现这个效果呢。如下:
val content = "我是中国人"binding.tv.text = content.biDiFormat()
在系统语言是自右向左
下显示如下
此时的显示才是正确的效果。
测试二
val stringBuffer = StringBuffer()
stringBuffer.append("يبيب")
stringBuffer.append("中国人")
binding.tv.text = stringBuffer.toString()
在系统语言是自右向左
下显示如下
在系统语言是自左向右
环境下显示如下
此时的第二张图显示效果是没有问题的,因为系统语言是自右向左
下,文本显示也是位于屏幕右侧
,阅读方式也是从右往左
。我们在看第一张图,文本在系统语言是自左向右
环境下位于屏幕右侧,读取方式也是从右往左,正常情况下文本显示是在屏幕左侧
,阅读方式也是从左往右
。为了修改这个问题使用修改方法同上:
val stringBuffer = StringBuffer()
stringBuffer.append("يبيب")
stringBuffer.append("中国人")
binding.tv.text = stringBuffer.toString().biDiFormat()
在系统语言是自左向右
环境下显示如下
此时的显示才是正确的效果。
测试三
val stringBuffer = StringBuffer()
stringBuffer.append("中国人")
stringBuffer.append("يبيب")
binding.tv.text = stringBuffer.toString()
在系统语言是自左向右
环境下显示如下
在系统语言是自右向左
下显示如下
分析同测试一和测试二,图一显示没有问题,
图二显示文本应该是靠右边,而且两个文本的位置也是相反了。
那么要修改这个问题方式同上
测试三
val stringBuffer = StringBuffer()
stringBuffer.append("中国人")
stringBuffer.append("يبيب")
binding.tv.text = stringBuffer.toString().biDiFormat()
在系统语言是自右向左
下显示如下
此时的显示才是正确的效果。
测试四
val stringBuffer = StringBuffer()
stringBuffer.append("我是")
stringBuffer.append("يبيب")
stringBuffer.append("中国人")
binding.tv.text = stringBuffer.toString()
在系统语言是自左向右
环境下显示如下
在系统语言是自右向左
下显示如下
分析同上,图一显示没有问题;
图二显示文本应该是靠右边,而且两个文本的位置也是相反了。
那么要修改这个问题方式同上:
val stringBuffer = StringBuffer()
stringBuffer.append("我是")
stringBuffer.append("يبيب")
stringBuffer.append("中国人")
binding.tv.text = stringBuffer.toString().biDiFormat()
在系统语言是自右向左
下显示如下
此时的显示才是正确的效果。
测试五
val stringBuffer = StringBuffer()
stringBuffer.append("يسيي")
stringBuffer.append("中国人")
stringBuffer.append("يبيب")
binding.tv.text = stringBuffer.toString()
在系统语言是自左向右
环境下显示如下
在系统语言是自右向左
下显示如下
分析同上,图二显示没有问题;
图一显示文本应该是靠左边,而且两个文本的位置也是相反了。
那么要修改这个问题方式同上:
val stringBuffer = StringBuffer()
stringBuffer.append("يسيي")
stringBuffer.append("中国人")
stringBuffer.append("يبيب")
binding.tv.text = stringBuffer.toString().biDiFormat()
在系统语言是自左向右
环境下显示如下
2. 示例二
var msg = "<nickName> أرسل إلى <receiverNames> <giftIcon> <count>"
假设上述文本要在系统语言是自右向左
下正确显示,那么它显示的结果应该是下面这样
var msg = "<count> <giftIcon> <receiverNames> أرسل إلى <nickName>"
那要怎么样才能达到这个效果呢
首先我将msg整体进行一次bidiFormat
var msg = "<nickName> أرسل إلى <receiverNames> <giftIcon> <count>"binding.tv.text = msg.biDiFormat()
此时在自右向左
下显示的结果如下:
通过上图发现,上述文本拆分成
<nickName>、<receiverNames> <giftIcon> <count>、أرسل إلى
三个部分,然后<nickName>和<receiverNames> <giftIcon> <count>做了一个整体的镜像,但是这并没有达到我们的效果。
下面我们把 <giftIcon> 这个做了一个biDiFormat
var msg = "<nickName> أرسل إلى <receiverNames> <giftIcon> <count>"msg = msg.replace("<giftIcon>","<giftIcon>".biDiFormat())binding.tv.text = msg.biDiFormat()
此时显示的结果就符合我们的预期了。
给<giftIcon>加上biDiFormat之后,
相当于给<giftIcon>整体包裹起来,然后它的顺序就变成是自右向左
的模式,
所以它会把两端的文本格式是自左向右
的进行互换位置。
3. 示例三
var msg = "<nickName> أرسل إلى <receiverNames> <giftName> <giftIcon> <count>"
假设上述文本要在系统语言是自右向左
下正确显示,那么它显示的结果应该是下面这样
var msg = "<count> <giftIcon> <giftName> <receiverNames> أرسل إلى <nickName>"
那要怎么样才能达到这个效果呢
首先我将msg整体进行一次bidiFormat
var msg = "<nickName> أرسل إلى <receiverNames> <giftName> <giftIcon> <count>"binding.tv.text = msg.biDiFormat()
此时在自右向左
下显示的结果如下:
通过上图发现,上述文本拆分成
<nickName>、<receiverNames> <giftName> <giftIcon> <count>、أرسل إلى
三个部分,然后<nickName>和<receiverNames> <giftName> <giftIcon> <count>做了一个整体的镜像,但是这并没有达到我们的效果。
下面我们把 <giftName> 这个做了一个biDiFormat
var msg = "<nickName> أرسل إلى <receiverNames> <giftName> <giftIcon> <count>"msg = msg.replace("<giftName>","<giftName>".biDiFormat())binding.tv.text = msg.biDiFormat()
位置互换的逻辑跟示例二一致,以<giftName>为中心,<receiverNames>、<giftIcon> <count> 进行位置互换。
此时还未符合我们的预期,<giftIcon> <count> 位置还需要进行调换,
下面我们把 <count> 这个做了一个biDiFormat
var msg = "<nickName> أرسل إلى <receiverNames> <giftName> <giftIcon> <count>"msg = msg.replace("<giftName>","<giftName>".biDiFormat())msg = msg.replace("<count>","<count>".biDiFormat())binding.tv.text = msg.biDiFormat()
因为<giftName>已经做过一次biDiFormat(),它就是自右向左
所以它的位置不会变更。
那么最后<giftIcon>和<count>进行位置互换,此时显示的结果就符合我们的预期了。
4. 示例四
var msg = "<nickName> <address> أرسل إلى <receiverNames> <giftName> <giftIcon> <count>"
假设上述文本要在系统语言是自右向左
下正确显示,那么它显示的结果应该是下面这样
var msg = "<count> <giftIcon> <giftName> <receiverNames> أرسل إلى <address> <nickName>"
那要怎么样才能达到这个效果呢
首先我将msg整体进行一次bidiFormat
var msg = "<nickName> <address> أرسل إلى <receiverNames> <giftName> <giftIcon> <count>"binding.tv.text = msg.biDiFormat()
此时在自右向左
下显示的结果如下:
通过上图发现,上述文本拆分成
<nickName> <address>、<receiverNames> <giftName> <giftIcon> <count>、أرسل إلى
三个部分,然后<nickName> <address>和<receiverNames> <giftName> <giftIcon> <count>做了一个整体的镜像,但是这并没有达到我们的效果。
下面我们把 <giftIcon> 这个做了一个biDiFormat
var msg = "<nickName> <address> أرسل إلى <receiverNames> <giftName> <giftIcon> <count>"msg = msg.replace("<giftName>","<giftName>".biDiFormat())msg = msg.replace("<count>","<count>".biDiFormat())msg = msg.replace("<address>","<address>".biDiFormat())binding.tv.text = msg.biDiFormat()
此时显示的结果就符合我们的预期了。
上述如有理解不对的地方,欢迎大家一起探讨。
2.关于实现上面功能中途碰到另外两个小问题
1.当文本中存在两个连续空格的情况下,经过Html.fromHtml后空格只显示一个,
所以我们需要通过replace(" ", "\u00A0")
进行替换。2.关于Spanned当中几个标志位
SPAN_EXCLUSIVE_EXCLUSIVE 不包含两端
SPAN_INCLUSIVE_INCLUSIVE 包含两端
SPAN_EXCLUSIVE_INCLUSIVE 不包含开始 包含结尾
SPAN_INCLUSIVE_EXCLUSIVE 包含开始 不包含结尾
具体的理解以及示例大家可以去这里看
好了,全文结束,如有问题,欢迎大家指正交流~
Android阿拉伯语混排相关推荐
- 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多媒体图文混排,干货!!!Android富文本实现图文混排
效果图 rich.jpg 像图中的效果,大家在开发并不少见,大家可能不知道android提供了实现图文混排的类.大家或许会写一个布局或者使用drawableLeft这个属性实现文本的左侧图标. and ...
- Android中文图混排时文图的居中对齐 FontMetrics以及自定义ImageSpan实现
文章转自:http://www.sohu.com/a/150059234_611601 本文作者CnPeng的博客地址: http://www.jianshu.com/p/2650357f7547 这 ...
- android多媒体图文混排,android图文混排
背景 最近我们的产品来了个新的模块,给学生做题提高成绩的.需求如下: 支持单选.多选.填空题 支持图片文字混排 输入框有交互,排版精致美观 为了体验优化,不能使用网页实现效果 思路分析 我们的图文混排 ...
- Android 动态图文混排的常用方法
2019独角兽企业重金招聘Python工程师标准>>> DrawableIcon的设置 对于TextView或者EditText动态设置drawableLeft,drawableRi ...
- Android动态图文混排,Android控件TextView实现静态图与动态GIF图文混排
最近做项目功能时,需要在TextView中展示图文,刚开始做的时候以为很简单,只需要用个ImageView跟TextView来展示就行了,可是发现这样做,不能实现我们需要的效果,这就需要涉及到富文本T ...
- android 阿拉伯语下的光标,android – 在EditText中的游标提示不是从右边开始的阿拉伯语...
我正在尝试使用提示文本制作EditText: 用英文"password"..光标正确设置在左侧. 但对于提示为"كلمهالمرور"的阿拉伯语,光标始终设置为 ...
- android 阿拉伯语下的光标,android – EditText中的双光标,用于输入类型编号/电话(RTL阿拉伯语)...
我有一个EditText设置为重力右,所以如果语言是阿拉伯语,文本从右边开始. 注意:我的应用程序支持RTL,我没有为EditText设置TextDirection,因为它会遇到同样的问题.设置为Ri ...
最新文章
- php计算有多少页,PHP 计算页面执行时间
- 为什么“不懂数据结构与算法”的程序员一定走不远?
- 《STL源码剖析》学习--6章--_rotate算法分析
- 1.编写程序,打印基本ASCII码表(可印刷32到126)。
- SQL2005实现全文检索的步骤 停止数据库的用户连接
- Xcode 静态库调试策略
- Java判断字符串是否是数值
- mysql统计信息表行数不准确_mysql SQL调优-统计信息不准的原因
- 2013.8.4thinkPHp学习
- IT公司组织机构和职位、职位职责
- Oracle 逗号分割的字符串转换为可放入in的语句
- 树莓派串口通信编码_树莓派和STM32通过USB和串口通信记录
- 2018年计算机网络考研真题
- matlab继续截止频率,关于-3db截止频率
- 字谜游戏(b)C语言
- 试验设计方法与Design-Expert软件应用目录
- 穿山甲android对接错误码40029,空Android项目集成Cocos、穿山甲。Lua调用网络接口。...
- RPG Maker MV 打包安卓和修改分辨率的方法
- 测试3d游戏pfs的软件,Beepa Fraps(3D游戏测帧录制软件)
- 基于ssm框架的同城物流配送网站系统
热门文章
- vue购物车案例(源码)
- 跨域 -- cors
- mysql blob图片类型存储bug解决:索引超出了数组界限错误,MySqlBlob图片类型存储Bug解决:索引超出了数组界限错误_MySQL...
- ArcGIS不同图层的线要素合并
- VC界面编程skill tips-CListCtrl
- 《合约星期五》OKEx季度0906期合约周报:多军空军大单换手吸筹三日迅速拉升突破10000美金大关
- wordpress 如何安装流体播放器插件(fluid player)
- 【C++笔试强训】第三十二天
- ElasticJob分布式定时任务调度框架以及生产遇到的问题
- vue 使用 iconfont-阿里巴巴矢量图标库