告别 dota

和魔兽争霸结缘有10多年了,大学毕业后又喜欢上了 dota,甚至有点沉迷。dota 曾经是多么的火热,比当前的 lol 更甚。但是。随着时间的推移,缺少商业盈利模式的 dota 终归是沦为粉丝无聊时间的休闲游戏。

而对于 dota 的着迷,我投入了太多的闲余时间。岁月是杀猪刀啊,我也由当年的追风少年,变成了中年大叔了,是时候放下了。好好利用闲余时间,做一些更有意义的事情。

例如:
1. 多点陪陪家人,老婆,儿子。
2. 多看些书。
3. 学好英语,走遍天下也不怕。
4. 通过驾照科目3的考试。

当然,就我目前的自制力,可能有点难。第一步,就是先断绝能轻易玩游戏的途径,例如把游戏卸载了,希望自己不会哪天无聊又重新装上吧。

总之,先在此立文为证。让我们拭目以待。

Android 原笔迹手写实现普通触摸屏的压感笔锋效果

Android 要实现原笔迹手写的压感,笔锋,必须要配合更好的压感触摸屏,例如电磁屏。三星的 note 系统,微软的 surface 系列,都是需要加装电磁屏的。E人E本,好记星的平板,有电磁屏的加成,也能很好的实现压感笔锋的效果,而且效果并不比三星微软的差。

如果没有电磁屏,也可以依靠最近兴起的主动电容屏来实现压感笔锋的效果,但是效果略差。

如果连主动电容屏也没有,那就是普通的电容屏,这样一般只能实现没有压感笔锋的效果,只能勉强用用,无法体会平板手写的优雅~~~

之前,手写控件也受限于此,无法实现普通电容屏的压感笔锋效果,效果如下:
android-paintview-finger-pressure-not-ok

幸好,现在我的手写控件已经克服这个问题,通过算法实现了普通电容屏的压感笔锋效果,而且整体效果也很好。
看图:

android-paintview-finger-pressure

解决 Android 5.1 触摸屏上的多任务按键没有震动反馈的 bug

之前在没有遇到过这样的问题,网络上搜索也没有相关的解决方法。偶然的机会发现 framework 中的 PhoneWindowManager.java 会拦截相关的按键事件,研究之后,发现就是在这个文件中做按键的压感反馈。

解决方案如下:

  1. 平台 rk3368, Android5.1
  2. 解决方案:
    diff --git a/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
    index d25051e..295ad5c 100755 (executable)
    --- a/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
    +++ b/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
    @@ -5160,7 +5160,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
     mKeyguardDelegate.isShowing()));
     
     //ADD BY LJH START
    - if (down && ((keyCode == KeyEvent.KEYCODE_HOME)||(keyCode == KeyEvent.KEYCODE_MENU)||(keyCode == KeyEvent.KEYCODE_BACK)))
    + if (down && ((keyCode == KeyEvent.KEYCODE_HOME)||(keyCode == KeyEvent.KEYCODE_MENU)||(keyCode == KeyEvent.KEYCODE_BACK) || (keyCode == KeyEvent.KEYCODE_APP_SWITCH)))
     {
     performHapticFeedbackLw(null, HapticFeedbackConstants.VIRTUAL_KEY, false);
     }
    

手写控件支持同步显示功能

手写控件支持同步显示功能,简单来说,就是 View1书写,然后另外一个 View2 用来同步显示。这个是继支持导入 SVG 数据后的又一个改进。

技术上都是没有什么难点,毕竟数据格式都是我自己定义的。同步数据支持同步整个 View 的笔迹,也支持增量添加笔迹。增量添加这个在实际应用场景应该会很受用,例如同步网络端传输过来的笔迹数据。

看效果图:
paint_sync

下一个目标应该是支持手写动作的回放了,加油。还有一个目标,就是笔迹粗细根据书写速度进行调整,估计这样的手写效果会更加漂亮。

手写控件:加权滑动平均值法滤波算法解决压力变化过大的问题

在手写控件适配到其他平板的时候,会发现每个平板的压力反馈值有不小的差异,这样会存在一种情况,在某些平板上,就是在收笔的时候压力突然变小后,就成前面一段粗,后面一段细,就像下图:
unnamed
这个时候,使用简单的滤波算法能简单的解决问题。

滑动平均值法:

滑动平均值法当前采样1次压力值,将本次采样值和以前的N-1次采样值一起求平均,得到当前的有效采样值。滑动平均值法把N个采样数据看成一个队列,对列的长度固定为N,每进行一次新的采样,把采样结果放入队尾,而扔掉原来队首的一个数据,这样在队列中始终有N个“最新”的数据。计算滤波值时,只要把队列中的N个数据进行平均,就可得到新的滤波值。

加权滑动平均值法:
上面提到的求平均值的算法,其实并不是很适合我们手写的场景,它更适合采样比较恒定的数据。所以我们需要对这个平均值算法做一些改善,不是求平均值,而是每个队列中的数值,分配一个权重,数值乘以权重,相加,得到最后的结果。

下面是一个最简单的例子,例子里面的队列只有两个数值,第一个数值的权重是 0.4,第二个数值的权重是 0.6,最后 pressure 就是平滑后的压力值。


float lastPressure = 0.0f;
float PRESSURE_FILTER_WEIGHT = 0.6f;
pressure = PRESSURE_FILTER_WEIGHT * realPressure
+ (1 - PRESSURE_FILTER_WEIGHT) * lastPressure;

lastPressure = pressure;

最后,通过调整权重,还可以动态调整最后的效果,以适应不同的平板硬件。

原笔迹手写控件支持保存为 svg 图片

最近研究了一下 svg 图片,可缩放矢量图片这个特性,也要在手写控件上支持。花费了不少精力,最终实现了这个功能。支持原笔迹,压感,笔锋,无失真缩放,这个特性,算是比较先进的了。后期对网络的支持更进一步。

看效果图(博客不支持显示 SVG,看一下谷歌浏览器的效果吧。):
paintview_svg

 

网站迁移到阿里云

website_index_page

之前博客放到亚马逊 aws,免费,稳定,而且不用备案,但是速度比较慢,登陆后台更不能忍。ssh 也经常连接不了。想想长期稳定的需要,还是需要把网站迁移回来。

之所以选择阿里云的 ecs,一是自己的知识积累,搭建自己的 vps 不再是难题,而且也可以顺便搭建私人的 git 代码管理平台,对以后的职业生涯发展还是挺有帮助的。

最令我意外的是,阿里云的备案系统做的很好,估计公关方面也下了不少功夫。我整个备案周期只花了5天。老实说,备案是我最不乐意去做的事情,但是在国内的空间就必须经历这个,幸好的是,对于个人网站,只要内容不违规,通过备案都是没有多大问题的。

然后就是博客数据的迁移,用 WordPress 自带的导入导出功能,很容易就实现了博客的数据迁移。然后再修改 apache 的配置,以支持 htaccess,这样就可以支持 wp super cache 插件了。wp super cache 在 aws 一直没有设置成功,原来是因为 htaccess 支持的问题,而且 aws ssh 实在龟速,所以当初也懒得折腾了。

接下来的还有一些 WordPress 的本地化的处理需求,例如禁止 Google font, avatar 头像本地化,你懂的。