用于动态layout的一个工具类

最近需要实现一个类似Google浏览器和Google搜索在Android系统上面的动态ActionBar效果,即随着拖动内容部分的动作,ActionBar部分的位置和显隐也要变化。

开始直接在一个View上实现了,结果发现又一个View要用。代码洁癖犯了,干脆直接提出来做个通用的。

支持上下左右四个方向的显隐,不过一个控件要对应一个DynamicLayouter。代码扔到gist了,懒得专门建一个repository。

用法类似于:

// 初始化,toolBar就是需要动态显隐的控件
mDynamicLayouter = new DynamicLayouter(toolBar, Orientation.BOTTOM);

// 在带有scrollbar的控件上设置一个touch listener用于获取拖动事件
        lstContent.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                mDynamicLayouter.feedMotionEvent(event);
                return false;
            }
        });

密码保护:嗯

此内容受密码保护。如需查阅,请在下列字段中输入您的密码。

それでも町は廻っている(女仆咖啡厅)绝赞

之前因为看过《外天楼》和《机器人的礼物》成了石黑粉,但长篇的《それでも町は廻っている》一直没能看下去,无论漫画还是TV版,90%的负面影响来自《女仆咖啡厅》这个该死的译名。除了主角打工所在的“女仆咖啡厅”外,整部作品更多是围绕着“小镇”和镇上的任务展开的各种感情戏(?)、喜剧、奇想剧等等。

这个奇葩程度直逼“神通小侦探”的译名不知道让多少人错过了这部牛逼作品,不管有什么和本地化相关的理由,都无法接受。

石黑擅长直接通过作品中的人物吐槽,甚至多部作品直接吐槽自己的吐槽役角色。剧情上则擅长用平常的笔法描写怪异得不得了的事件——却从不让剧中人物察觉到所谓“真相”,以及让极其诡异、罕见的设定变得似乎是日常生活一般。从《外天楼》就能看出来,石黑是个重度推理作品爱好者。《それ町》的主角则直接设定成了超-重度推理爱好者,从第三卷开始我甚至觉得推理因素存在的话数占了多数,很多时候直接用了推理相关的neta。当然,《それ町》是日常系作品,推理也多以日常推理展开,“小题大做”自然也有不少,但有趣程度让人觉得有些桥段不改变小说实在浪费。

有些地方则讨论了各种奇怪的话题,比如绀出场的场面中提到了Cymric无尾猫,传说这种猫是因为上诺亚方舟时候尾巴被夹断了。女主提出了如下问题:

soremachi_cymric

相信很多人都会想过类似这种如果每一代鸡都砍掉两只脚若干代小鸡会不会没脚?问题吧,石黑让读者就会从头到尾感受到既视感、似曾相识、“啊啊我也这么想过”这样的感觉。

动画版也是特色突出的作品,如果不说是新房监督,恐怕这部没有什么新房突出风格的TV番组不会被多少人认为是他的作品吧。值得一提的是还原度实在太高了,现在觉得动画漫画只要看过一版就足够了。

反射和泛型delegate引起的Windows Phone App奇怪异常

昨天因为一个bug拖到晚上1点才睡——还没解决。今天又逐行debug才发现问题所在,这个因为反射的引起的crash实在是太熬人了,记录一下或许能帮到其他人。

先说一下场景和上下文。之前Windows 8项目中需要用到一个解析数据到同一个基类派生出来类型的聚合类,其中有大量的解析函数,根据期望类型调用不同的parser。如果用if else写会很挫,于是我用了dictionary将type和function对应起来:

private Dictionary> _parseFunctions;

增加方法时候,由于懒得一个个typeof硬编码类型,于是用反射这样映射进去:

        protected void AddParseFunction(Func func) where T : BaseResult {
            _parseFunctions.Add(func.GetType().GetMethod("Invoke").ReturnType, func);
        }

除了GetMethod硬编码之外,用的时候十分轻松愉快。现在想在Windows Phone平台上实现相同的效果,结果上来就发现Func不好用:.net 4.5版本支持参数协变和返回值反变:

public delegate TResult Func(
	T arg
)

但3.5版本不支持。所以需要改写成delegate:

public delegate T ParserFunctionDelegate( string inputString ) where T : BaseResult;

代码虽然是WP7.1的,但在WP8上跑得顺畅——注意问题来了,这段代码可以在WP7.1上编译通过——之前因为想到反正要做两个平台兼容的App,所以一直用WP8模拟器/设备测试。昨晚在WP7平台上调试发现坏菜,启动后就各种异常出现,而且直接跑到UnhandledException,却没有任何详细异常信息和调用栈,最后出错地点只能看到是调用封装类的xaml.cs或者.cs里面。碰到的错误都是“Cannot load type xxx from assembly yyy”,具体异常出现过:

  • InvalidOperationException
  • MethodNotFoundException
  • TargetInvocationException
  • ……

根据具体调用地点出现了乱七八糟各种平时没用过的异常。但基本上一眼看去就可以确定是反射相关问题,可惜我没顺着相关调用代码一点点debug,而是傻逼呵呵地继续怀疑是UI层或者工程重组时候GAC缓存出错,这个上面浪费了大量时间,也是为什么到半夜才睡的原因。

那么问题在哪呢?首先不是泛型delegate本身的错,因为我直接用上面GetMethod代码去拿ReturnType没有引发异常。那么肯定是协变的问题,去掉了delegate的out关键字后……先是提示类型错误,因为dictionary里面存储的是基类类型delegate,但我们传进去的是where限定的子类类型delegate,去掉了协变支持后,返回值便没法存入dictionary中。由此导致AddParseFunction不能接受泛型delegate,添加进去的parser functions也必须返回BaseResult类型而非子类型了,由此函数只有增加一个type参数(这也是最开始要避免的)手动传进来,没法再用反射拿到类型。

这样修改完成后终于搞定了棘手的crash,但代码变得异常寒碜。要说代码必须写得烂一些还能忍,那么这个完全无法从crash调用栈上获取任何信息的问题就不能忍了。如果是因为协变参数出问题,你好歹定位到相应错误行上呢,要么干脆就编译不过,省得个大圈子修改错误。

一些有关跑步的书

过去在blog上也推荐过不少书,但基本都是科幻小说、推理小说或者专业书。随着最近越来越着了跑步的魔,也看了几本相关的书籍,用这篇blog一并介绍。

The Complete Book of Running / 《跑步圣经》

各种有关跑步的入门和提高知识都是结合实例介绍的,实用且详细。前两部份分别从心理和生理方面对于跑步带来的影响和变化进行分析,最后一部分则是有些掉书袋感觉的科学分析。可以说关于跑步的方方面面都能从这本里面找到相关的分析方法(不一定有答案),作者一再强调要根据自己的情况选择跑步方式、装备、路线以及地形等等。

总体来说偏向于刚刚开始跑步并且想提高的跑者。至于能否说服不跑步的人开始跑步,这本书恐怕不合适——实际上也没有什么方法可以逼着人去体会跑步的乐趣,除非跑者自己选择这种运动方式。

走ることについて語るときに僕の語ること / 《当我谈跑步时,我谈些什么》

首先仰望一下33岁才开始跑步、坚持每年一次全马、每月至少300KM跑量的村上老师,希望我也能坚持跑下去。这本很好地体现了村上老师絮叨的一面,如果不是对跑步或者作者本身特别感兴趣,恐怕读不完。卖点为“村上第一本写自己的书”,那么自然也都是村上结合自己跑步历程相关的一些事情所记述的感想。此书可以很好地让入门跑者走出一些误区,例如前面提到的想说服别人一起跑、无法应付突然找不到跑步的动力的情况、是否要参加马拉松等等。总体来说,非常值得一读。

跑步: 多活50年系列图书

也是一本百科全书似的跑步知识介绍书籍,语言比《跑步圣经》要生动,几乎是一口气读完的,这本里面作者自己和其他著名跑者的体会也介绍得更多。想知道哪方面的知识,直接把章节标题按照关键字方式去找就行了,也算是一本必读书。

马拉松跑

最接近专业水平的一本跑步知识介绍,而且目标读者是希望跑马跑进3小时内、月跑量200+的业余顶尖好手。作为还一次正式全马/半马没参加过的菜鸟读这本书,就是想看看高手们是如何在饮食、体能、力量和训练模式方面准备马拉松的。要说能有多少经验借鉴到,个人体会是少得可怜。任何运动如果到了追求成绩的境界,那么对于初学者来说就没有多少实际参考价值。可以说如果没有合适的身体状态以及良好的训练条件,跑全马追求速度就算了,能不痛苦地跑下来作为目标,对于一般跑者来说更合适。

Born to Run / 天生就会跑

原书内容很有趣,装帧、用纸、翻译质量都对得起价格——当然要是能缩到正常32开变成平装然后再便宜点自然更好。中心思想就是人类其实是最天生适合长跑的动物。里面附了个vibram五趾鞋的小册子,推广赤足跑。可惜我的脚有些问题,恐怕这辈子都没法体验赤足跑了。

另外收集了一些马拉松准备相关的文章,做成了6寸kindle适用的pdf,有兴趣的可以下载马拉松准备.pdf

doubanclaime311565d5a7876a9