Discuz! Board

标题: 下面需要研究笔迹相关部分了 [打印本页]

作者: zangcf    时间: 2016-8-15 18:33
标题: 下面需要研究笔迹相关部分了
1,首先顺着那几个开源程序,然后找到CSDN上面的一个博客内容
http://blog.csdn.net/ekeuy/artic ... rce=www.race604.com
这篇博客讲述了几个开源项目和相关的博客

引言

        Android的手写效率一直是件头疼的事情,比如手写效率、笔锋效果、手掌抑制等等,本文搜集了关于手写的开源项目和一些相关的文章资料。

开源项目

1 android-signaturepad

项目地址:android-signaturepad

项目介绍:这是一款银行手写签名的应用,通过event的getHistory方法获取存储在MotionEvent中的历史点,大大提高了手写的流畅度,通过算法实现了笔锋效果。

[attach]269[/attach]

2  Markers

项目地址:Markers

项目介绍:这是一款带有笔锋效果的android手写应用,具体实现可以查看SlateView,也是通过算法实现的笔锋效果,另使用电磁笔手写时,笔锋效果更好,因为电磁笔带压感,android底层会传回真实的压力值。

[attach]270[/attach]

3 MultiTouchLocalResponseView

项目地址:MultiTouchLocalResponseView

项目介绍:实现了当整个手掌放在屏幕上时,只响应需要响应的区域,对其它区域完全无视。


文献资料

1 smooth signatures 1

2 smoother signatures 2

3 提高Android应用手写流畅度

4 Android手掌抑制功能的实现

5 Mastering the Android Touch System




作者: zangcf    时间: 2016-8-15 18:45
标题: 这个系列博客讲述了笔迹如何处理的
http://blog.csdn.net/ekeuy/article/details/37961199

在使用android类的手写应用时,整体上都有这样一个印象:android的手写不流畅、不自然,和苹果应用比起来相差太远。本文结合作者亲身经历,介绍一下有效提高手写流畅度的几种方法:


1、未做任何处理的手写效果:

[attach]271[/attach]

这是一个自定义的view,通过在onTouchEvent时间中捕获系统回调的触摸点信息,然后再onDraw方法里面刷新,可以明显地感觉到线条很生硬,并且在手写的过程中跟随感很差,反应迟钝,具体代码如下:

  1. package com.mingy.paint.view;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Color;  
  6. import android.graphics.Paint;  
  7. import android.graphics.Path;  
  8. import android.util.AttributeSet;  
  9. import android.view.MotionEvent;  
  10. import android.view.View;  
  11.   
  12. public class PaintOrignalView extends View {  
  13.     public PaintOrignalView(Context context, AttributeSet attrs, int defStyle) {  
  14.         super(context, attrs, defStyle);  
  15.         initPaintView();  
  16.     }  
  17.   
  18.     public PaintOrignalView(Context context, AttributeSet attrs) {  
  19.         super(context, attrs);  
  20.         initPaintView();  
  21.     }  
  22.   
  23.     public PaintOrignalView(Context context) {  
  24.         super(context);  
  25.         initPaintView();  
  26.     }  
  27.       
  28.     public void clear( ){  
  29.         if( null != mPath ){  
  30.             mPath.reset( );  
  31.             invalidate( );  
  32.         }  
  33.     }  
  34.   
  35.     private void initPaintView() {  
  36.         mPaint.setAntiAlias(true);  
  37.         mPaint.setColor(Color.BLACK);  
  38.         mPaint.setStyle(Paint.Style.STROKE);  
  39.         mPaint.setStrokeJoin(Paint.Join.ROUND);  
  40.         mPaint.setStrokeWidth(5f);  
  41.     }  
  42.   
  43.     @Override  
  44.     protected void onDraw(Canvas canvas) {  
  45.         canvas.drawPath(mPath, mPaint);  
  46.     }  
  47.   
  48.     @Override  
  49.     public boolean onTouchEvent(MotionEvent event) {  
  50.         float eventX = event.getX();  
  51.         float eventY = event.getY();  
  52.   
  53.         switch (event.getAction()) {  
  54.         case MotionEvent.ACTION_DOWN: {  
  55.             mPath.moveTo(eventX, eventY);  
  56.             invalidate();  
  57.         }  
  58.             return true;  
  59.         case MotionEvent.ACTION_MOVE: {  
  60.             mPath.lineTo(eventX, eventY);  
  61.             invalidate();  
  62.         }  
  63.             break;  
  64.         case MotionEvent.ACTION_UP: {  
  65.             mPath.lineTo(eventX, eventY);  
  66.             invalidate();  
  67.         }  
  68.             break;  
  69.         default: {  
  70.   
  71.         }  
  72.             return false;  
  73.         }  
  74.   
  75.         return true;  
  76.     }  
  77.   
  78.     private Paint mPaint = new Paint();  
  79.     private Path mPath = new Path();  
  80. }  
复制代码

通过分析,发现效率低下的原因是:


      (1)底层回调给onTouchEvent方法中的点太少(单位时间内点信息少导致跟随感差,快速手写时点之间距离过长);

      (2)捕获点信息后通知View刷新时,刷新不及时(刷新区域太大);

结合查阅的MotionEvent和View的api文档,发现可以从如下两个方向着手来提高手写体验:

2、增加触摸点个数:

       显然我们无法改善系统回调onTouchEvent的次数,所以只能通过插值的方式来增加触摸点个数,但遗憾的时通过插值计算出来的点是没有压力值的,不方便做笔锋效果,通过查阅MotionEvent的api文档发现,Android对触屏事件进行批量处理。传递给onTouchEvent()的每一个MotionEvent都包含上至前一个onTouchEvent()调用之间捕获的若干个坐标点。如果将这些点都加入到绘制中,可使手写效果更加平滑。Android Developers对MotionEvent的介绍如下:











欢迎光临 Discuz! Board (http://47.89.242.157:9000/bbs/discuz/) Powered by Discuz! X3.2