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方法里面刷新,可以明显地感觉到线条很生硬,并且在手写的过程中跟随感很差,反应迟钝,具体代码如下:
- package com.mingy.paint.view;
-
- import android.content.Context;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.Paint;
- import android.graphics.Path;
- import android.util.AttributeSet;
- import android.view.MotionEvent;
- import android.view.View;
-
- public class PaintOrignalView extends View {
- public PaintOrignalView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- initPaintView();
- }
-
- public PaintOrignalView(Context context, AttributeSet attrs) {
- super(context, attrs);
- initPaintView();
- }
-
- public PaintOrignalView(Context context) {
- super(context);
- initPaintView();
- }
-
- public void clear( ){
- if( null != mPath ){
- mPath.reset( );
- invalidate( );
- }
- }
-
- private void initPaintView() {
- mPaint.setAntiAlias(true);
- mPaint.setColor(Color.BLACK);
- mPaint.setStyle(Paint.Style.STROKE);
- mPaint.setStrokeJoin(Paint.Join.ROUND);
- mPaint.setStrokeWidth(5f);
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- canvas.drawPath(mPath, mPaint);
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- float eventX = event.getX();
- float eventY = event.getY();
-
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN: {
- mPath.moveTo(eventX, eventY);
- invalidate();
- }
- return true;
- case MotionEvent.ACTION_MOVE: {
- mPath.lineTo(eventX, eventY);
- invalidate();
- }
- break;
- case MotionEvent.ACTION_UP: {
- mPath.lineTo(eventX, eventY);
- invalidate();
- }
- break;
- default: {
-
- }
- return false;
- }
-
- return true;
- }
-
- private Paint mPaint = new Paint();
- private Path mPath = new Path();
- }
复制代码通过分析,发现效率低下的原因是:
(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 |