解决 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

 

Android开发必备站点:androiddevtools.cn

因为众所周知的技术原因,Android 相关的官方网站无法访问,造成 Android 开发相关的工具,官方文档都无法访问,特别是SDK,ADT无法更新。这里推荐一个新手老鸟都必备的网站: androiddevtools.cn

收集整理Android开发所需的Android SDK、开发中用到的工具、Android开发教程、Android设计规范,免费的设计素材等。

欢迎大家推荐自己在Android开发过程中用的好用的工具、学习开发教程、用到设计素材,欢迎Star、Fork 。

试用团队协同工具 worktile

最近一直苦于没有一个很好的项目管理工具,上网搜索,推荐不少。例如 worktile, teamition, basecamp, redmine 等等。综合考虑到功能,语言,费用以及团体推广难度,最终选用了 worktile. 一款免费、好用的团队协同工具,让你的团队随时随地一起工作。

优点:
简单,好用。降低团体的学习成本。
免费。免费的简报功能很重要。免费也是团体内推广的重要因素。

缺点:
希望有番茄工作法类似的计时功能。主要是提醒自己半个小时就休息一下。其实这也不算是缺点,只是自己希望增加的功能。

总结:
团体协同工具,提说目前在国外很火,国内处于起步阶段,个人觉得如果推广和执行得当,的确能很好的改善团体协作的工作效率,对于项目经理来说,更是提高效率的很好的工具。当然,作为个人的项目管理工具,也是一个很好的选择。

Openfire 3.10.2 文档概要

此文为翻译习作,英文原文请参看:
http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/index.html 

Openfire provides comprehensive group chat and instant messaging (IM) services using the XMPP protocol.

Openfire 基于 XMPP 协议,提供了成熟的群组聊天以及即时通信(IM)服务。

Documentation: 文档:

  • Installation Guide – How to install Openfire. 安装指导–如何安装
  • Upgrade Guide – Instructions for upgrading an existing Wildfire installation into an Openfire installation. 升级指导–如何将当前的 Wildfire(Openfire 前身) 升级为 Openfire
  • Database Installation Guide – How to setup your database for use with Openfire. 数据库安装指导–如何安装 Openfire 数据库
  • SSL Guide – A guide to setting up Openfire’s SSL secure socket support. SSL 指导–如何设置 Openfire SSL 安全 Socket 支持
  • LDAP Guide – A guide to setting up Openfire to work with LDAP user stores. LDAP 支持–如何设置 Openfire 使其可以使用 LDAP 用户存储。关于 LDAP
  • Custom Database Integration Guide – A guide to integrating Openfire authentication, user, and group data with a custom database. 定制数据库集成指导–如何在定制的数据库上集成 Openfire 认证,用户以及群组数据。
  • Pluggable Roster Support Guide – A guide to integrating Openfire rosters with an alternate store. 可插入的花名册支持指引–如何集成 Openfire 花名册备用存储(有点拗口)

继续阅读Openfire 3.10.2 文档概要

Android Framework 代码的混淆

因项目需要把 Android Framework 自主开发部分的代码进行代码混淆,首先的工具是 PROGUARD。但是 PROGUARD 更多是用于 APK 的代码混淆。网络上还没有看到对 Framework 代码混淆的案列。

网上找不到方法,只好自己动手了。研究了两天,终于实现了 Framework 层的代码混淆。

1.修改 Android.mk

代码放在 framework/base 目录下,编译生成 framework.jar,其实这不是一个很好的做法,因为与 Android 源生的代码混合在一起,造成低耦合。前期考虑不当了,后期维护就相对麻烦。

最关键的一点,修改 Android.mk, 使需要混淆部分的包和类单独编译。因为 framework 其他代码最好不要混淆,以免引起找不到类的出错提示。

然后设置 LOCAL_PROGUARD_ENABLED := nosystem,很重要,不然类的方法不会混淆成abcd类似的名称。

然后指定 proguard.flag,设定不混淆(保留)对外公开接口的类,重新编译。可以用模块编译 mmm 命令提高编译效率。

继续阅读Android Framework 代码的混淆