一个android手写板的例子

https://github.com/yb1026/CodeLibrary

代码太多,要用可以git上查看。这里稍微解释一下几个地方。

首先初始化
SignatureView extends View是引用到布局文件的,这里是activity调用到的初始化方法。

public void ensureSignatureBitmap() {
        if (mSignatureBitmap == null) {
            mSignatureBitmap = Bitmap.createBitmap(getWidth(), getHeight(),
                    Bitmap.Config.RGB_565);
        }
        if (mSignatureBitmapCanvas == null) {
            mSignatureBitmapCanvas = new Canvas(mSignatureBitmap);
            mSignatureBitmapCanvas.drawColor(Color.WHITE);
        }

    }

从代码可以看出,初始化的时候拿到了view宽高的bitmap,并且拿到了bitmap的画板。
然后touch事件的操作目标就是mSignatureBitmapCanvas这个画板了。onDraw将bitmap绘制到view

@Override
    protected void onDraw(Canvas canvas) {
        if (mSignatureBitmap != null) {
            canvas.drawBitmap(mSignatureBitmap, 0, 0, mPaint);
        }
    }

然后onTouchEvent会addPoint

public void addPoint(TimedPoint newPoint) {
        mPoints.add(newPoint);
        if (mPoints.size() > 2) {
            // To reduce the initial lag make it work with 3 mPoints
            // by copying the first point to the beginning.
            if (mPoints.size() == 3)
                mPoints.add(0, mPoints.get(0));
...

addBezier(curve, mLastWidth, newWidth);

... 

mPoints.remove(0);

每相邻的四个点都会变成一个Bezier,贝塞尔曲线。
意思是,会通过这四个点会描出一个圆润的曲线。

addBezier里面

每次会调整点的半径

// Set the incremental stroke width and draw.
            mPaint.setStrokeWidth(startWidth + ttt * widthDelta);

然后把这个轨迹画到bitmap上,然后invalidate,重绘(onDraw)。

for(...){
    mSignatureBitmapCanvas.drawPoint(x, y, mPaint);
}

而我们要得到手写结果,则取之前创建出来的bitmap

public Bitmap getTransparentSignatureBitmap() {
        ensureSignatureBitmap();
        return mSignatureBitmap;
    }

附:这个view有好几M的内存开销,使用要肾重。

你可能感兴趣的:(工具)