src/tz/signaturecapture/SignatureWidget.java
author Tomas Zeman <tzeman@volny.cz>
Fri, 10 Jan 2014 12:58:51 +0100
changeset 6 1d7f1ea4f2a8
parent 5 19822c932652
child 8 16d857ba45c8
permissions -rw-r--r--
SignatureWidget: formatting
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
    }
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    37
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    38
    public void save(View parent, OutputStream os)
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    39
    {
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    40
        Log.v("log_tag", "Width: " + parent.getWidth());
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    41
        Log.v("log_tag", "Height: " + parent.getHeight());
6
1d7f1ea4f2a8 SignatureWidget: formatting
Tomas Zeman <tzeman@volny.cz>
parents: 5
diff changeset
    42
        Bitmap bm =  Bitmap.createBitmap(parent.getWidth(), parent.getHeight(),
1d7f1ea4f2a8 SignatureWidget: formatting
Tomas Zeman <tzeman@volny.cz>
parents: 5
diff changeset
    43
            Bitmap.Config.RGB_565);;
5
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    44
        Canvas canvas = new Canvas(bm);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    45
        parent.draw(canvas);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    46
        bm.compress(Bitmap.CompressFormat.PNG, 90, os);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    47
    }
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    48
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    49
    public void clear()
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    50
    {
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    51
        path.reset();
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    52
        invalidate();
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    53
    }
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
    @Override
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    56
    protected void onDraw(Canvas canvas)
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
        canvas.drawPath(path, paint);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    59
    }
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    60
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    61
    @Override
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    62
    public boolean onTouchEvent(MotionEvent event)
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
        float eventX = event.getX();
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    65
        float eventY = event.getY();
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    66
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    67
        switch (event.getAction())
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    68
        {
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    69
        case MotionEvent.ACTION_DOWN:
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    70
            path.moveTo(eventX, eventY);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    71
            lastTouchX = eventX;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    72
            lastTouchY = eventY;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    73
            return true;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    74
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    75
        case MotionEvent.ACTION_MOVE:
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    76
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    77
        case MotionEvent.ACTION_UP:
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
            resetDirtyRect(eventX, eventY);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    80
            int historySize = event.getHistorySize();
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    81
            for (int i = 0; i < historySize; i++)
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
                float historicalX = event.getHistoricalX(i);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    84
                float historicalY = event.getHistoricalY(i);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    85
                expandDirtyRect(historicalX, historicalY);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    86
                path.lineTo(historicalX, historicalY);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    87
            }
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    88
            path.lineTo(eventX, eventY);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    89
            break;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    90
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    91
        default:
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    92
            debug("Ignored touch event: " + event.toString());
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    93
            return false;
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
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    96
        invalidate((int) (dirtyRect.left - HALF_STROKE_WIDTH),
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    97
                (int) (dirtyRect.top - HALF_STROKE_WIDTH),
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    98
                (int) (dirtyRect.right + HALF_STROKE_WIDTH),
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    99
                (int) (dirtyRect.bottom + HALF_STROKE_WIDTH));
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   100
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   101
        lastTouchX = eventX;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   102
        lastTouchY = eventY;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   103
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   104
        return true;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   105
    }
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   106
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   107
    private void debug(String string){
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   108
    }
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
    private void expandDirtyRect(float historicalX, float historicalY)
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   111
    {
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   112
        if (historicalX < dirtyRect.left)
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
            dirtyRect.left = historicalX;
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
        else if (historicalX > dirtyRect.right)
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.right = 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
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   121
        if (historicalY < dirtyRect.top)
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   122
        {
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   123
            dirtyRect.top = historicalY;
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
        else if (historicalY > dirtyRect.bottom)
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.bottom = 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
    }
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
    private void resetDirtyRect(float eventX, float eventY)
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
        dirtyRect.left = Math.min(lastTouchX, eventX);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   134
        dirtyRect.right = Math.max(lastTouchX, eventX);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   135
        dirtyRect.top = Math.min(lastTouchY, eventY);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   136
        dirtyRect.bottom = Math.max(lastTouchY, eventY);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   137
    }
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   138
}