src/tz/signaturecapture/SignatureWidget.java
author Tomas Zeman <tzeman@volny.cz>
Fri, 10 Jan 2014 13:18:36 +0100
changeset 8 16d857ba45c8
parent 6 1d7f1ea4f2a8
permissions -rw-r--r--
SignatureWidget: no need to supply parent view; added getSignature(): Bitmap
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     1
package tz.signaturecapture;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     2
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     3
import java.io.OutputStream;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     4
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     5
import android.content.Context;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     6
import android.graphics.Bitmap;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     7
import android.graphics.Canvas;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     8
import android.graphics.Color;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     9
import android.graphics.Paint;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    10
import android.graphics.Path;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    11
import android.graphics.RectF;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    12
import android.util.AttributeSet;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    13
import android.util.Log;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    14
import android.view.MotionEvent;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    15
import android.view.View;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    16
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    17
public class SignatureWidget extends View
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    18
{
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    19
    private static final float STROKE_WIDTH = 5f;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    20
    private static final float HALF_STROKE_WIDTH = STROKE_WIDTH / 2;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    21
    private Paint paint = new Paint();
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    22
    private Path path = new Path();
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    23
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    24
    private float lastTouchX;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    25
    private float lastTouchY;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    26
    private final RectF dirtyRect = new RectF();
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    27
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    28
    public SignatureWidget(Context context, AttributeSet attrs)
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    29
    {
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    30
        super(context, attrs);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    31
        paint.setAntiAlias(true);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    32
        paint.setColor(Color.BLACK);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    33
        paint.setStyle(Paint.Style.STROKE);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    34
        paint.setStrokeJoin(Paint.Join.ROUND);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    35
        paint.setStrokeWidth(STROKE_WIDTH);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    36
    }
8
16d857ba45c8 SignatureWidget: no need to supply parent view; added getSignature(): Bitmap
Tomas Zeman <tzeman@volny.cz>
parents: 6
diff changeset
    37
    
16d857ba45c8 SignatureWidget: no need to supply parent view; added getSignature(): Bitmap
Tomas Zeman <tzeman@volny.cz>
parents: 6
diff changeset
    38
    public Bitmap getSignature() {
16d857ba45c8 SignatureWidget: no need to supply parent view; added getSignature(): Bitmap
Tomas Zeman <tzeman@volny.cz>
parents: 6
diff changeset
    39
        Log.v("log_tag", "Width: " + getWidth());
16d857ba45c8 SignatureWidget: no need to supply parent view; added getSignature(): Bitmap
Tomas Zeman <tzeman@volny.cz>
parents: 6
diff changeset
    40
        Log.v("log_tag", "Height: " + getHeight());
16d857ba45c8 SignatureWidget: no need to supply parent view; added getSignature(): Bitmap
Tomas Zeman <tzeman@volny.cz>
parents: 6
diff changeset
    41
        Bitmap bm =  Bitmap.createBitmap(getWidth(), getHeight(),
6
1d7f1ea4f2a8 SignatureWidget: formatting
Tomas Zeman <tzeman@volny.cz>
parents: 5
diff changeset
    42
            Bitmap.Config.RGB_565);;
5
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    43
        Canvas canvas = new Canvas(bm);
8
16d857ba45c8 SignatureWidget: no need to supply parent view; added getSignature(): Bitmap
Tomas Zeman <tzeman@volny.cz>
parents: 6
diff changeset
    44
        draw(canvas);    
16d857ba45c8 SignatureWidget: no need to supply parent view; added getSignature(): Bitmap
Tomas Zeman <tzeman@volny.cz>
parents: 6
diff changeset
    45
        return bm;
16d857ba45c8 SignatureWidget: no need to supply parent view; added getSignature(): Bitmap
Tomas Zeman <tzeman@volny.cz>
parents: 6
diff changeset
    46
    }
16d857ba45c8 SignatureWidget: no need to supply parent view; added getSignature(): Bitmap
Tomas Zeman <tzeman@volny.cz>
parents: 6
diff changeset
    47
16d857ba45c8 SignatureWidget: no need to supply parent view; added getSignature(): Bitmap
Tomas Zeman <tzeman@volny.cz>
parents: 6
diff changeset
    48
    public boolean save(OutputStream os)
16d857ba45c8 SignatureWidget: no need to supply parent view; added getSignature(): Bitmap
Tomas Zeman <tzeman@volny.cz>
parents: 6
diff changeset
    49
    {
16d857ba45c8 SignatureWidget: no need to supply parent view; added getSignature(): Bitmap
Tomas Zeman <tzeman@volny.cz>
parents: 6
diff changeset
    50
        return getSignature().compress(Bitmap.CompressFormat.PNG, 90, os);
5
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    51
    }
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    52
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    53
    public void clear()
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    54
    {
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    55
        path.reset();
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    56
        invalidate();
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    57
    }
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    58
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    59
    @Override
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    60
    protected void onDraw(Canvas canvas)
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    61
    {
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    62
        canvas.drawPath(path, paint);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    63
    }
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    64
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    65
    @Override
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    66
    public boolean onTouchEvent(MotionEvent event)
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    67
    {
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    68
        float eventX = event.getX();
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    69
        float eventY = event.getY();
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    70
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    71
        switch (event.getAction())
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    72
        {
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    73
        case MotionEvent.ACTION_DOWN:
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    74
            path.moveTo(eventX, eventY);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    75
            lastTouchX = eventX;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    76
            lastTouchY = eventY;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    77
            return true;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    78
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    79
        case MotionEvent.ACTION_MOVE:
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    80
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    81
        case MotionEvent.ACTION_UP:
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    82
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    83
            resetDirtyRect(eventX, eventY);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    84
            int historySize = event.getHistorySize();
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    85
            for (int i = 0; i < historySize; i++)
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    86
            {
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    87
                float historicalX = event.getHistoricalX(i);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    88
                float historicalY = event.getHistoricalY(i);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    89
                expandDirtyRect(historicalX, historicalY);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    90
                path.lineTo(historicalX, historicalY);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    91
            }
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    92
            path.lineTo(eventX, eventY);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    93
            break;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    94
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    95
        default:
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    96
            debug("Ignored touch event: " + event.toString());
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    97
            return false;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    98
        }
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    99
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   100
        invalidate((int) (dirtyRect.left - HALF_STROKE_WIDTH),
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   101
                (int) (dirtyRect.top - HALF_STROKE_WIDTH),
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   102
                (int) (dirtyRect.right + HALF_STROKE_WIDTH),
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   103
                (int) (dirtyRect.bottom + HALF_STROKE_WIDTH));
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   104
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   105
        lastTouchX = eventX;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   106
        lastTouchY = eventY;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   107
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   108
        return true;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   109
    }
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   110
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   111
    private void debug(String string){
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   112
    }
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   113
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   114
    private void expandDirtyRect(float historicalX, float historicalY)
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   115
    {
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   116
        if (historicalX < dirtyRect.left)
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   117
        {
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   118
            dirtyRect.left = historicalX;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   119
        }
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   120
        else if (historicalX > dirtyRect.right)
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   121
        {
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   122
            dirtyRect.right = historicalX;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   123
        }
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   124
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   125
        if (historicalY < dirtyRect.top)
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   126
        {
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   127
            dirtyRect.top = historicalY;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   128
        }
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   129
        else if (historicalY > dirtyRect.bottom)
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   130
        {
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   131
            dirtyRect.bottom = historicalY;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   132
        }
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   133
    }
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   134
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   135
    private void resetDirtyRect(float eventX, float eventY)
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   136
    {
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   137
        dirtyRect.left = Math.min(lastTouchX, eventX);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   138
        dirtyRect.right = Math.max(lastTouchX, eventX);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   139
        dirtyRect.top = Math.min(lastTouchY, eventY);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   140
        dirtyRect.bottom = Math.max(lastTouchY, eventY);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   141
    }
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   142
}