0x1、引言


2333,看这标题就知道不是什么正经技术文章,花了点时间,写了个「无用良品」,以后请叫我「Android界爱迪生——樊少皇」,蟹蟹~

最近公司APP版本迭代,一个人写界面,写到我真的想吐:

有些路人可能会说:不喜欢写,你不会拖拉控件吗,憨憨。

可能各位都是:i9 9900K,850 PRO,64G DDR4,拖拽控件丝滑流畅,不知人间疾苦…
如果您像小弟一样用着公司配的:i3家用台式机,你也会秒变「祖安人

拖拽卡顿不灵活不说,拖拽完还得进代码调来调去,有时效率还不如手敲。
Google很久以前出的ConstraintLayout约束布局是挺好用的,就是要写多一堆属性,比如每个控件必不可少的:

虽说AS自动补全,但是写起来,效率并不是很高。作为一个「具有4点多堆砌布局经验的Android开发仔」一个重要的标准就是:看到一个设计图,立马在心中解析出「页面布局的层次结构」比如这样的个人中心的页面:

直接解析:

约束布局相对布局回退- Button标题-TextView卡片视图约束布局头像-ImageView登陆提示-TextView更多箭头-ImageView卡片视图约束布局订单图标-ImageView订单文本-TextView订单更多-ImageView兑换图标-ImageView兑换文本-TextView兑换更多-ImageView
...略

解析倒是挺简单,不顾敲起来,大部分是机器式重复,。前不久在逼乎上看到这段话:

觉得还挺有道理,着实需要一种智识和能力去改进,从这样的「时间泥潭」中跳出。

脑海中萌生了「模板代码」思路:

和AS自带新建布局模板的方式有点不一样,精确到控件级别,用 关键字匹配 控件对应的模板代码。

当我输入tv的时候,导入对应的一大串代码,输入tvc的时候导入另一串代码。
不过这个思路在我写完一个TextView后就放弃了,TM的那么多控件,要写多少套,而且很多属性是多余的…

这种思路妥妥滴不行,于是又萌生了另一种思路:

定义一套自己的语法规则,写少量,用脚本翻译成AS里的XML文件

啧啧啧,这样也意味着可以

可以脱离Android Studio写布局文件,而且比一个个字母手敲xml高效!

想想,你可以「在地铁上用便签写布局,然后到公司用脚本直接翻译成XML布局」太酷了吧!


0x2、规律 => 规则


定义这套语法规则之前,我们先要了解一下xml布局的规律:

# XML由一个个标签(结点)构成,分为:单标签 和 双标签(可嵌套),如:
<TextView .../> 和 <LinearLayout ..></LinearLayout> # 然后标签的组成
<控件名 属性:值属性:值 .../>

综上,不难得出两个规律:

① 标签其实有三种:开标签关标签闭合标签,要进行区分
② 标签 = <控件名 若干属性:值>

另外,Android是建议,每个控件都设置一个id属性的,不难定义一个类来代表一个标签:

class Node:def __init__(self, widget=None, id=None, kv=None):self.widget = widgetself.id = idself.kv = kv

1、标签的区分


上面也说了,标签由三种,这里引入三个符号来进行标记(±*),比如:

+ 线性布局* 文本视图
- 线性布局

新建配置文件config.ini用于保存「自定义简称控件的映射关系

注意这里的简称可以定义成你自己喜欢的,中文也行
接着写个读取配置文件的脚本config_getter.py,读取下:

再接着新建一个输入源test.txt文件,内容如下:

最后写脚本读取txt文件,按行读取,过滤空格和换行根据字符串第一个字符进行过滤

运行后可以看到输出的xml文件:

堆一起,看不出什么,格式化看看效果:

啧啧啧,有内味了。


2、属性


一个控件可以有多个属性,多个属性怎么进行分割呢?笔者用的是「>
然后属性和值又怎么分割呢?本来是想用 :或| 的,后面发现都用到了,最后决定用「-」来分割。
一个简单的示例如下:

* bt > bt_back > w-56 > h-56 > t-返回

上述的代码代表:

定义一个按钮,id为bt_back,宽56dp,高56dp,文本为返回

另外,有些常用的属性-值,可以简化下,比如:

android:layout_width="wrap_content"# 可以写成
w-wrap_content# 简化
w-w# 再简化
ww

ww 就可以代替:android:layout_width="wrap_content"

程序处理的时候需要对:w-w 和 ww进行区分,区分方法也很简单:

len(split("-")) == 1,说明是后者,否则是前者

啧啧啧,可以,继续~


3、值


值的情形稍微复杂一点,常见的有下面这些:

android:gravity="center|start"
android:layout_width="match_parent"
android:background="@drawable/ic_back_white"
android:layout_marginStart="60dp"
app:layout_constraintDimensionRatio="16:9"

其实划分下,笔者需要只需区分三种类型

  • ① 直接填充 -> 属性=“xxx”
  • ② 数字dp -> 属性=“xdp”
  • ③ @资源引用 -> 属性="@x/y"

所以处理的流程:

Step 1:判断是否为数字,是的话加上dp,否则跳Step 2
Step 2:利用正则判断是否为@类型,是的话提取下类型与值,否则跳Step3
Step 3: 判断是否包含此属性,是填充模板,否则直接填充

也很简单,接下来就是写代码来组装我们的「老八秘制小汉堡」了!!!


0x3、组装老八秘制小汉堡


先是完善配置文件:config.ini

这里可以根据自己的习惯自定义在对应的区域,增加或者减少,动态配置~
在翻译脚本 AutoTranslate.py 的开头读取一波配置信息:

接着定义一个读取节点列表的方法:

再接着定义一个解析翻译结点内容的方法:


最后定义一个写入文件的方法:

接着花几分钟写个布局txt文件:

转换脚本调用下相关方法:

运行一波,可以看到生成了一个test.xml的布局文件,打开瞅瞅:

啧啧,格式化?

把xml复制到项目中,看看效果?

此处应该有掌声!啪啪啪!


0x4、奥利给,吃粑粑


脚本的大概雏形完成了,后面可以优化下交互和小细节,不过感觉没技术含量?巧了,最近在 刷题,加个算法耍耍?来个LeetCode原题「有效的括号」,题目描述如下:

就是 匹配符号开闭,跟我们这个场景非常相似哇,匹配开闭节点

# 开闭节点需要一一对应,比如:
+ cly
- cly# 多了少了,都不行(如下两种都是错误的)
+ cly
+ cly
- cly+ cly
+ ly
- cly
- ly

怎么解决?最标准解法就是用 了,比较简单,直接撸代码:

接着调用下:

故意写错结点,运行看看:

可以,大功告成~


0x5、小结


久违的摸鱼闲暇时光,给大家做了一个老八秘制作小

Android 布 局 翻 译 器相关推荐

  1. android 阅读器自动滚动,在Android手机上实现阅读器翻页效果.doc

    在Android手机上实现阅读器翻页效果 先了解各个字母表示的含义:A-把书页翻起来后看到的背面区域B-把书页翻起来后看到的下一页的一角C-当前页的可见部分.a-手指滑动页角到达的位置b-当前页翻起来 ...

  2. OPPO 40万年薪招应届生,狂揽芯片人才;恶意差评小米新手机,一用户被判赔3万元;谷歌开源全同态加密通用转译器|极客头条...

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

  3. android 上下滚动文字_计算机毕设项目004之Android系统在线小说阅读器

    计算机毕设项目004之Android系统在线小说阅读器 一. 项目名称 基于Android系统的在线小说阅读器 二. 项目简介 项目中的角色功能: 支持翻页动画:仿真翻页.覆盖翻页.上下滚动翻页等翻页 ...

  4. android 阅读器自动滚动,Android编程实现小说阅读器滑动效果的方法

    本文实例讲述了Android编程实现小说阅读器滑动效果的方法.分享给大家供大家参考,具体如下: 看过小说都知道小说阅读器翻页有好多种效果,比如仿真翻页,滑动翻页,等等.由于某种原因,突然想写一个简单点 ...

  5. OPPO 40万年薪招应届生,狂揽芯片人才;恶意差评小米新手机,一用户被判赔3万元;谷歌开源全同态加密通用转译器|极客头条

    一分钟速览新闻点! 小米造车"急"了,发布大量自动驾驶相关岗位招聘 阿里平头哥:国产嵌入式 CPU 实现关键技术突破 BOSS 直聘:2021 年应届生岗位平均薪资为 6112 元 ...

  6. Android 实现视屏播放器、边播边缓存功能、外加铲屎(IJKPlayer)(转载)

    转载自:<Android 实现视屏播放器.边播边缓存功能.外加铲屎(IJKPlayer)> hello,大家好,我就是那个会掀桌子的话唠,刚刚结束两篇关于音频播放与录制的文章,旧坑未埋就挖 ...

  7. Android 实现书籍翻页效果----升级篇

    自从之前发布了<Android 实现书籍翻页效果----完结篇 >之后,收到了很多朋友给我留言,前段时间由于事情较多,博客写得太匆忙很多细节地方没有描述清楚.所以不少人对其中的地方有不少不 ...

  8. 【Android 逆向】代码调试器开发 ( 使用 NDK 中的 ndk-build + Android.mk 编译 Android 平台的代码调试器可执行应用 )

    文章目录 一.Android 平台代码调试器代码 二.Android.mk 构建脚本内容 三.Application.mk 构建脚本内容 四.正式编译 五.博客资源 一.Android 平台代码调试器 ...

  9. 【Android 逆向】代码调试器开发 ( 等待进程状态改变 | detach 脱离进程调试 PTRACE_DETACH | 调试中继续运行程序 PTRACE_CONT )

    文章目录 一.等待进程状态改变 二.detach 脱离进程调试 PTRACE_DETACH 三.调试中继续运行程序 PTRACE_CONT 一.等待进程状态改变 上一篇博客 [Android 逆向]代 ...

最新文章

  1. 马斯克刚刚宣布辞去特斯拉董事会职务,仍然担任CEO
  2. [转]在.NET环境中实现每日构建(Daily Build)--NAnt篇
  3. nyoj 998(欧拉定理的运用)
  4. jquery2.0.3 全部源码
  5. LeetCode Hot100 ---- 排序专题
  6. Python之IO编程——文件读写、StringIO/BytesIO、操作文件和目录、序列化
  7. 常用JavaScript函数 47 - 58(自我总结)
  8. 使用octave符号运算求解不定积分、微分方程等(兼容matlab)
  9. 在知行EDI系统中实施SNIP验证
  10. 未来教育二级MS Office无纸化考试模拟软件
  11. 1100个商务企业宣传通用PPT模板免费下载网址
  12. 期刊投稿参考文献格式注意要点
  13. 关于异常结存的问题,库存结存为什么会产生数量为0,成本不为0的异常情况
  14. Font shape `TU/ptm/m/n' undefined(Font) using `TU/lmr/m/n' instead
  15. 英特尔vPro博锐技术激活
  16. 计算一个数二进制中1的个数超全解法(C语言)
  17. 分享一个神器,我们前端再也不怕UI设计图不标注了
  18. 达人评测 华为matebook16对比联想小新pro16锐龙版 2021哪个好
  19. 解决安卓手机(小米手机实测有效)移动网络无信号以及快速恢复的方法
  20. firedaemon.exe

热门文章

  1. Xcode菜单及常用快捷键大全
  2. UR5机械臂仿真环境搭建
  3. 宽带不能上传发文件_光纤宽带和普通宽带的区别
  4. http状态码大全,从100-505状态码详情
  5. 【从零开始学c++】4.char数组和string的千丝万缕
  6. 计算机证据和网络证据的关系,计算机犯罪证据有哪些特点
  7. (zt)魔方玩法(图解)
  8. Origin更改图的尺寸大小
  9. Mysql常用类型和字段属性
  10. 快来看看C语言必须学的最简单最基础的语句