首先是要对Moira 源代码的各个代码文件的作用以及项目结构要有整体的认识,简单来说, Moira的代码体系可分为三层:交互层、 绘制层、 计算层
1.交互层, 就是控件部分, 如鼠标点击、 键盘输入、 列表选项、设置星盘参数对话框、日期输入、地点选择、批注输入、 星盘数据管理等
2.计算层, 通过交互层拿到时间、地点以及要计算的星盘的参数后, 数据传递到计算层, 计算得到星盘信息, 是整个Moira的核心所在, 计算层又可以分为两层:1.中式信息计算层,2.天文信息计算层.
中式信息计算层包括命度、身度、十二宫、二十八星宿、干支计算和神煞计算等, 我一般称为计算应用层
天文信息计算层, 包括日月五星三王四余和关键恒星的黄经计算、 岁差计算、 日出日落、日月食计算等,我一般称为计算内核层,
这两层的一些分析, 我已经在前面的文章分析过一点, 几千字的分析, 文字虽多但还是计算层代码中的冰山一角, 可见计算层复杂度之高, 不是一般人能在短期内理解并进行二次开发的, 因此能进行Moira二次开发的人是比较少的
3.绘制层, 在经过计算层算出信息后, 使用系统的画笔接口, 在程序界面进行绘制, 将圆形星盘和星曜信息‘画’程序界面上
了解完Moira的代码结构后, 便可以围绕这三层进行Moira手机版的研发.
首先是Moira 安卓版(Moira Android),
一.交互层别无他法, 从零开始, 因为Window的控件和Android的控件是不互通的, 设计理念也不一样, Window屏幕大, Android屏幕小, 除了需要开发者进行控件重新开发上, 还需要进行UI交互设计上的考量:
1.笔者这里结合了笔者这边常用的场景(经常需要讨论预测到月份、甚至到具体某一天的吉凶, 以及生时校正等), 程序主界面增加了‘ 加减月日时 ’这快捷设置时间的六个按钮,
2.同时择日场景和星盘星制设置、 立命设置是相互独立的, 因此增加了三个按钮‘择日’、 ‘立命’、 ‘星盘’分别设置
3.城市数量多, 因此在城市选择界面增加 搜索机制快速选择城市, 和精确的地点设置, 以满足天星择日的需求(因为择日用事场景一般在远离城市的山地,)
4. 还有对星盘的辅助操作, 数据导出操作, 如何在没有鼠标键盘下且在屏幕比电脑小得多的屏幕上进行交互的设计, 这些都需要进行考量
5.还有星盘数据导出与导入, 这些涉及到移动操作系统的沙盒机制, 与Window版无限制的磁盘访问完全不同.
二. 计算层, 计算层则相对友好, Moira采用Java开发, Java也可以用来开发Android, 计算层与系统交互控件弱相关, 直接把Moira计算层的代码搬到Android上就能直接算出中式星盘信息、 天文信息
三、绘制层, 绘制层也是和系统强关联, Moira所采用的是awt下的包, Android虽然也支持用Java, 但是Android的系统没有提供awt包的依赖, 因为Android有自己的一套图形绘制系统, 不能直接套用Java的awt包, 好在github上有人分享能解决Android依赖awt的jar, 得以在Android上快捷的适配Moira的绘制层.
但是网上的包awt依赖包也不能直接拿来用, 笔者对安卓awt包的代码分析后, 修改了awt依赖包的部分源码, 同时还在Moira绘制层补充了代码, 以适配Android的图形绘制接口
笔者回顾对Moira 安卓版的适配,从零到第一版只花9天, 得益于Moira使用Java编写, Moira在Android上的计算层和绘制层适配只要三天就能完成, 剩下6天主要是开发交互设计的时间, 因为笔者当时已经长达五年没有进行过Android系统的开发, 对于Android的一些控件的使用已经遗忘, 这七天稍微花得有点长了.
然后是在Moira 苹果版(Moira iOS)
一、 交互层和Android一样, 重新设计, 针对不同苹果手机的不同屏幕尺寸适配, 自己写交互界面, 可以说Moira在iOS交互层的代码与window版的Moira层交互的代码完全不一样, 对于iOS交互层的编写, 涉及到数十个界面的编写, Moira iOS交互层的代码完全是由笔者本人自己编写的, 具有版权, 应受到保护.
二、计算层, iOS采用objective-c或者swift编写, 考虑到java和swift的编程理念、语法比较相像, 因此笔者用swift将Moira 中式星盘计算层(计算应用层)进行重写, 在天文信息层,Moira采用的天文计算模块 原本是由C语言编写的, 网上有源代码, 这部分替我省下了不少时间
天文计算模块为C语言编写, 计算应用层计算采用swift语言编写, 两者在互相调用存在一些难点, 因此将Moira 适配iOS并不是简单的事情
三、绘制层, iOS的绘制层, 和Android的绘制层理念达到了90%的相似度, 或许这是移动操作系统在图像绘制上共有的想法吧, 安卓那套适配过Moira的代码可以直接拿来用, 难点就是Java到Swift语法上的转换
Moira 苹果版的适配,从零到第一版大概花了三周的时间, 相当于用Swift语言重写了由Java编写的Moira, 比Android的适配多花了一倍的时间, 我认为这不仅仅是简单的二次开发
补充: 对于市面上移动端的政余软件, 经技术分析考察发现, 有一部分是用js语言进行编写
这样做,有优点也有缺点
优点是, 星盘的交互计算绘制本质都是在网页上进行, 因为window、linux、macos、ios、android都能查看网页,可以忽略掉对操作系统的适配
缺点也有:
要部署服务器进行才能访问到网页, 意味着要支付一部分费用,存在着运营成本,而笔者的Moira手机版, 开发完成后不存在运营费用, 如果说有也就是在iOS上分发需要支付给苹果的开发者年费688, 但我认为这不能算作运营成本.这意味着App可以以一个弱商业化的方式运营, 给予更好的排盘体验
同时使用js意味不能复用已有的代码, 得推倒重来, 意味着更长的开发周期
以此对比, 笔者从零到第一版Moira 安卓版只用了9天
同时Android使用Java开发, 计算层和绘制层大同小异, 在Android上的开发成果也可以增加到Moira上, 便捷地对windows版Moira进行二次开发. 笔者认为, 电脑的大屏幕、鼠标、键盘能够提升排盘的体验, Moira手机版是对身旁没有电脑,或者户外情况下的进行使用, 要想高效进行星学研究, 还是离不开电脑, 因此使用原生开发, 随着Moira手机版功能增强, 也可以让Moira本身更强大, 这是采用js开发方案所不能具备的优点