http://blog.csdn.net/ekeuy/article/details/37961199
在使用android类的手写应用时,整体上都有这样一个印象:android的手写不流畅、不自然,和苹果应用比起来相差太远。本文结合作者亲身经历,介绍一下有效提高手写流畅度的几种方法:
1、未做任何处理的手写效果: 这是一个自定义的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的介绍如下:
|