20171124

昨天睡得还挺香的。早上起来吃前几天买的红糖锅盔,虽然长得完全不像锅盔但吃起来还可以。跑路去公司继续干活。上午写了个啥来着?大概是简单把代码又重构了下(目测我周末还要继续重构)。下午果断把缩放和拖动都写好了。就是没现成的平板,不然我就写成手势缩放了。ui组件关系稍微有点复杂了,我感觉有点晕(本来这周就有点睡眠不足,脑袋里像塞了块大石头,又沉又胀)。比如缩放大小这个,因为不能用手势所以先用个进度条来代替,进度条拖动之后会改图像的缩放因子,然后文本显示的百分比也会变,最后双击会重置所有操作恢复原样,文本和进度条也要做相应的改变。虽然说起来很简单,但是要写在代码里那就是一坨,将这些逻辑分开写不挤在一起的话就会有各种listener,组件一多那个结构乱的啊。所以现在流行单向数据流么。如react一样,页面展示只是后面一个记录了不变数据和可变状态的数据store的呈现。所有操作都只改数据store里的东西,然后react会主动根据数据store的变化刷新前台页面。对应到这个缩放的处理,store里有一个变量表示当时的缩放因子,进度条,文本和图像的ui组件都根据这一个变量来进行ui的绘制,然后更新会主动传过去。虽然在js里有一个框架来做这件事情,在kotlin里实现还是很简单的。关键在于它的delegate property特性,写法是var a by Delegate()。这样对a的存取都会经过Delegate类。kotlin甚至还提供了原生的Observable代理,可以监听字段值的变化。在这个基础上稍加改造,用一个工具类来生成需要的代理,该工具类内部有一个注册表,保存着每个字段注册了哪些监听器,所创建的代理就是在这个注册表里寻找对应的字段,然后将新值发给注册了的监听器就可以了。按照这种思路,后台写一个data class,必要的字段用这种方式进行代理。ui组件的各种可变项都要从后台store获取,并生成时通过注册表关注相应的字段,并实现字段更新时ui刷新的逻辑,这样不管什么事件,最终都转成对store相应字段的修改就完了。不过还是有两个问题。一是我直接用原生的Kproperty作为注册表的key,结果注册进去了取不出来,不知道是啥问题。这个倒好解决。,大不了创建的时候多传几个参数进去算了。另一个是复杂对象,比如图像拖放的时候所需要更改的是一个Matrix对象,调它的postTranslate方法,这样的话该对象本身不会变,不会触发observable的监听,这个感觉只能给个接口手动调了。感觉用工具类和注册表创建也不是很优雅,比较合适的方式是直接在代理里注册监听器,然而似乎并不能很方便地拿到字段的代理,stackoverflow上有这样的问题。周末继续重构,这次完全写成单向数据流,不然代码一坨一坨的太恶心了。

评论

热门博文