Android 原笔迹手写控件,压感,笔锋不可少!

手写控件相关文章:http://kevinems.com/tag/%E6%89%8B%E5%86%99

本人在好记星平板电脑 N818S 上开发的原笔迹手写控件,压感,笔锋都实现了,笔迹保存,还原,删除,放大,缩小,旋转,移动功能也实现了,控件的API简单易用,可以说是一个比较完善的控件了,并集成到 Framework,小有成就感啊。

当初需求统计,分析是就认定是一个相对复杂的控件,所以前期做了不少工作,后期编码实现的时候相对还算比较顺利。

这是第一次真正意义上遵循了标准的软件开发流程,开发效率果然提高不少。科学的开发方法,事半功倍。

流程大概:

  1. 需求统计
  2. 需求分析
  3. 概要设计
  4. 详细设计
  5. 编码
  6. 测试
  7. 软件交付
  8. 软件维护

平台:好记星 N818S,Android 4.2,汉王电磁屏,电磁笔

笔触效果:钢笔,铅笔,马克笔,毛笔

效果图:

一个终端培训师的作品~~~

PaintView

welcome

本人涂鸦作品:

钢笔效果视频演示:

铅笔效果视频演示:

android

在纸质笔记本上书写的时候,会随着书写速度的快慢,钢笔笔迹会相应变细或者变粗,这样的笔迹更加动感,优美。

通过算法实现普通电容屏上的压感笔锋效果:

《Android 原笔迹手写控件,压感,笔锋不可少!》上有39条评论

  1. 我想请教一个问题,我现在在做一个app,里面有手写功能的那种,问题是这个适配如何做?意思就是如果区分哪个厂商的平板用哪个这种原笔迹的控件?

    1. 一般只要区别你接收到的点是否有压力值。如果你设置笔触大小为10,没有压力值的话,那笔触大小就是10*1。
      而有压力值的话,笔触大小就是 10*压力值。
      压力值的大小是0~1的浮点数。

      所以不用适配,直接在程序里面用压力值*笔触大小。

          1. 我尽量说明白。
            1.一条曲线,实际上是通过多条直线连成的。
            2.笔触粗细平滑,取决于这些直线有多少条。而这些直线的粗线反映你的笔触的压力的大小。
            3.想象一下,当直线近似为“点”的时候,笔触自然就会更平滑了。

      1. “2.笔触粗细平滑,取决于这些直线有多少条。” ->您这边采用多次重绘么?
        “3.想象一下,当直线近似为“点”的时候,笔触自然就会更平滑了”->直线近似为点的时候那岂不是驱动层面反馈回来的点需要很多?您那边每秒多少个点?我这边驱动层每秒差不多130左右个点。

        1. 2.我的方法是画出“透明的贝赛尔曲线”,然后沿着这个贝赛尔曲线,切分为多个区域,每个区域画一个实心圆。实心圆的直径与预先记录好的笔触的压力成正比。

          3.如果你能理解第2点,第3这个就不是问题了。了解一下贝赛尔曲线,组成这个曲线只需要几个关键点。

          可以参考这篇文章:Android Path 类运用实践

          实例2

  2. 你好,能不能加下你qq呢,学习一下压感绘图,有几个问题想问问,怎么设置底下的四线方格呢,如果画图的时候手屏幕是怎么处理的呢??如何把手的触摸屏蔽掉呢??能不能发表一篇如何做压感绘图的一些技术点吧

    1. Hello。关于你的问题:
      1. “四线方格”是指汉字草稿格子吧?那是是一张图片,作为背景图而已。
      2. 手写时,手的屏蔽。可以在系统层直接屏蔽,即有笔的事件时,直接屏蔽手的事件的上报;也可以在 View 控件屏蔽。Android 的 MotionEvent 可以判断触摸事件的类型,直接屏蔽手的操作即可。

      1. 你好,希望你出一个api 或者简单的写一个demo ,那个手和比同时放到屏幕上时,如果笔和手都动,我想只监听比的滑动,view 层可以判断吗??

        1. 抱歉,最近比较忙。
          View 控件区分笔和手判断,可以参考
          android.view.MotionEvent public final int getToolType(int pointerIndex)
          在 onTouchEvent(MotionEvent event) 方法中调用这个 api ,返回值可以判断出触摸事件类型,例如 TOOL_TYPE_STYLUS, TOOL_TYPE_FINGER。
          当为 TOOL_TYPE_STYLUS 时,你处理画图即可。

        1. 很少用QQ,微博。你可以发邮件给我。
          多利用搜索引擎,能解答你很多问题。
          kevinems
          (at)
          gmail.com

  3. 本公司有个项目正好要用到这个功能,我们项目也是用你们集团的E人E本,他们提供了这个功能的SDK,但我们还需要其它功能和这个原笔迹保存的文件需要能在windows里也能显示,因此我们必须要有这个控件的源代码来修改,你看能否合作.

  4. 你好 如何做到 “从左上往右下画的方向”↘(取paint的最小宽度) 和 “从右上往左下画的方向”↙(取paint的最大宽度) 方向 的 path 宽度分别是 min 和 max 值,这样写的好处就是写字非常好看,请问有思路吗

    1. 你好,你说的效果,理想的情况下的确是比较好的,我以前也考虑过。但是平板上我目前还做不到这种效果。

  5. 你好,电磁笔的压感值是2048.android端的压感值都是0~1的浮点值吗?
    0~2048(电磁笔) 对应 0~1(android)

      1. android 中
        frameworks\base\data\keyboards\.idc 文件中
        touch.pressure.scale = 0.005 会改变压力值。不是0~1,而是1~10.25.这个楼主有了解吗?

    1. 不好意思. 需要商业合作的话, 可以进一步交流.
      如果是个人兴趣开发, 目前遇到什么问题, 看我能否解答.

  6. 您好,目测应该是用二阶贝塞尔曲线实现的,想问下二阶贝塞尔曲线的三个点应该怎样取?我自己的思路是记录滑动位置的所有坐标,然后隔三个点就用贝塞尔曲线去描绘一遍,但是效果很不理想

发表评论

电子邮件地址不会被公开。 必填项已用*标注