src/tz/signaturecapture/SignatureWidget.java
author Tomas Zeman <tzeman@volny.cz>
Fri, 10 Jan 2014 12:56:01 +0100
changeset 5 19822c932652
child 6 1d7f1ea4f2a8
permissions -rw-r--r--
SignatureWidget: extracted into outer class
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());
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    42
        Bitmap bm =  Bitmap.createBitmap(parent.getWidth(), parent.getHeight(), Bitmap.Config.RGB_565);;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    43
        Canvas canvas = new Canvas(bm);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    44
        parent.draw(canvas);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    45
        bm.compress(Bitmap.CompressFormat.PNG, 90, os);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    46
    }
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
    public void clear()
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    49
    {
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    50
        path.reset();
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    51
        invalidate();
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
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    54
    @Override
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    55
    protected void onDraw(Canvas canvas)
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    56
    {
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    57
        canvas.drawPath(path, paint);
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
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    60
    @Override
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    61
    public boolean onTouchEvent(MotionEvent event)
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    62
    {
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    63
        float eventX = event.getX();
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    64
        float eventY = event.getY();
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    65
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    66
        switch (event.getAction())
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
        case MotionEvent.ACTION_DOWN:
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    69
            path.moveTo(eventX, eventY);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    70
            lastTouchX = eventX;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    71
            lastTouchY = eventY;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    72
            return true;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    73
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    74
        case MotionEvent.ACTION_MOVE:
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    75
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    76
        case MotionEvent.ACTION_UP:
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    77
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    78
            resetDirtyRect(eventX, eventY);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    79
            int historySize = event.getHistorySize();
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    80
            for (int i = 0; i < historySize; i++)
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    81
            {
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    82
                float historicalX = event.getHistoricalX(i);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    83
                float historicalY = event.getHistoricalY(i);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    84
                expandDirtyRect(historicalX, historicalY);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    85
                path.lineTo(historicalX, historicalY);
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
            path.lineTo(eventX, eventY);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    88
            break;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    89
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    90
        default:
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    91
            debug("Ignored touch event: " + event.toString());
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    92
            return false;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    93
        }
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
        invalidate((int) (dirtyRect.left - HALF_STROKE_WIDTH),
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    96
                (int) (dirtyRect.top - HALF_STROKE_WIDTH),
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    97
                (int) (dirtyRect.right + HALF_STROKE_WIDTH),
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    98
                (int) (dirtyRect.bottom + HALF_STROKE_WIDTH));
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
        lastTouchX = eventX;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   101
        lastTouchY = eventY;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   102
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   103
        return true;
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
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   106
    private void debug(String string){
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
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   109
    private void expandDirtyRect(float historicalX, float historicalY)
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
        if (historicalX < dirtyRect.left)
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
            dirtyRect.left = historicalX;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   114
        }
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   115
        else if (historicalX > dirtyRect.right)
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   116
        {
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   117
            dirtyRect.right = historicalX;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   118
        }
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
        if (historicalY < dirtyRect.top)
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.top = historicalY;
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
        else if (historicalY > dirtyRect.bottom)
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   125
        {
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   126
            dirtyRect.bottom = historicalY;
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   127
        }
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
    private void resetDirtyRect(float eventX, float eventY)
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   131
    {
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   132
        dirtyRect.left = Math.min(lastTouchX, eventX);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   133
        dirtyRect.right = Math.max(lastTouchX, eventX);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   134
        dirtyRect.top = Math.min(lastTouchY, eventY);
19822c932652 SignatureWidget: extracted into outer class
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   135
        dirtyRect.bottom = Math.max(lastTouchY, 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
}