# HG changeset patch # User Tomas Zeman # Date 1389354961 -3600 # Node ID 19822c93265216f12bcbfc78bbbdc6eb56f28966 # Parent a36906c99a2c8914292f5ccd90a7866295d58611 SignatureWidget: extracted into outer class diff -r a36906c99a2c -r 19822c932652 src/tz/signaturecapture/CaptureSignature.java --- a/src/tz/signaturecapture/CaptureSignature.java Fri Jan 10 12:52:59 2014 +0100 +++ b/src/tz/signaturecapture/CaptureSignature.java Fri Jan 10 12:56:01 2014 +0100 @@ -3,22 +3,15 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.io.OutputStream; import java.util.Calendar; import android.app.Activity; import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; -import android.graphics.Bitmap; -import android.graphics.Canvas; import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.Path; -import android.graphics.RectF; import android.os.Bundle; import android.os.Environment; -import android.util.AttributeSet; import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; @@ -220,126 +213,4 @@ } return (tempdir.isDirectory()); } - - public static class SignatureWidget extends View - { - private static final float STROKE_WIDTH = 5f; - private static final float HALF_STROKE_WIDTH = STROKE_WIDTH / 2; - private Paint paint = new Paint(); - private Path path = new Path(); - - private float lastTouchX; - private float lastTouchY; - private final RectF dirtyRect = new RectF(); - - public SignatureWidget(Context context, AttributeSet attrs) - { - super(context, attrs); - paint.setAntiAlias(true); - paint.setColor(Color.BLACK); - paint.setStyle(Paint.Style.STROKE); - paint.setStrokeJoin(Paint.Join.ROUND); - paint.setStrokeWidth(STROKE_WIDTH); - } - - public void save(View parent, OutputStream os) - { - Log.v("log_tag", "Width: " + parent.getWidth()); - Log.v("log_tag", "Height: " + parent.getHeight()); - Bitmap bm = Bitmap.createBitmap(parent.getWidth(), parent.getHeight(), Bitmap.Config.RGB_565);; - Canvas canvas = new Canvas(bm); - parent.draw(canvas); - bm.compress(Bitmap.CompressFormat.PNG, 90, os); - } - - public void clear() - { - path.reset(); - invalidate(); - } - - @Override - protected void onDraw(Canvas canvas) - { - canvas.drawPath(path, paint); - } - - @Override - public boolean onTouchEvent(MotionEvent event) - { - float eventX = event.getX(); - float eventY = event.getY(); - - switch (event.getAction()) - { - case MotionEvent.ACTION_DOWN: - path.moveTo(eventX, eventY); - lastTouchX = eventX; - lastTouchY = eventY; - return true; - - case MotionEvent.ACTION_MOVE: - - case MotionEvent.ACTION_UP: - - resetDirtyRect(eventX, eventY); - int historySize = event.getHistorySize(); - for (int i = 0; i < historySize; i++) - { - float historicalX = event.getHistoricalX(i); - float historicalY = event.getHistoricalY(i); - expandDirtyRect(historicalX, historicalY); - path.lineTo(historicalX, historicalY); - } - path.lineTo(eventX, eventY); - break; - - default: - debug("Ignored touch event: " + event.toString()); - return false; - } - - invalidate((int) (dirtyRect.left - HALF_STROKE_WIDTH), - (int) (dirtyRect.top - HALF_STROKE_WIDTH), - (int) (dirtyRect.right + HALF_STROKE_WIDTH), - (int) (dirtyRect.bottom + HALF_STROKE_WIDTH)); - - lastTouchX = eventX; - lastTouchY = eventY; - - return true; - } - - private void debug(String string){ - } - - private void expandDirtyRect(float historicalX, float historicalY) - { - if (historicalX < dirtyRect.left) - { - dirtyRect.left = historicalX; - } - else if (historicalX > dirtyRect.right) - { - dirtyRect.right = historicalX; - } - - if (historicalY < dirtyRect.top) - { - dirtyRect.top = historicalY; - } - else if (historicalY > dirtyRect.bottom) - { - dirtyRect.bottom = historicalY; - } - } - - private void resetDirtyRect(float eventX, float eventY) - { - dirtyRect.left = Math.min(lastTouchX, eventX); - dirtyRect.right = Math.max(lastTouchX, eventX); - dirtyRect.top = Math.min(lastTouchY, eventY); - dirtyRect.bottom = Math.max(lastTouchY, eventY); - } - } } \ No newline at end of file diff -r a36906c99a2c -r 19822c932652 src/tz/signaturecapture/SignatureWidget.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/tz/signaturecapture/SignatureWidget.java Fri Jan 10 12:56:01 2014 +0100 @@ -0,0 +1,137 @@ +package tz.signaturecapture; + +import java.io.OutputStream; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.RectF; +import android.util.AttributeSet; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; + +public class SignatureWidget extends View +{ + private static final float STROKE_WIDTH = 5f; + private static final float HALF_STROKE_WIDTH = STROKE_WIDTH / 2; + private Paint paint = new Paint(); + private Path path = new Path(); + + private float lastTouchX; + private float lastTouchY; + private final RectF dirtyRect = new RectF(); + + public SignatureWidget(Context context, AttributeSet attrs) + { + super(context, attrs); + paint.setAntiAlias(true); + paint.setColor(Color.BLACK); + paint.setStyle(Paint.Style.STROKE); + paint.setStrokeJoin(Paint.Join.ROUND); + paint.setStrokeWidth(STROKE_WIDTH); + } + + public void save(View parent, OutputStream os) + { + Log.v("log_tag", "Width: " + parent.getWidth()); + Log.v("log_tag", "Height: " + parent.getHeight()); + Bitmap bm = Bitmap.createBitmap(parent.getWidth(), parent.getHeight(), Bitmap.Config.RGB_565);; + Canvas canvas = new Canvas(bm); + parent.draw(canvas); + bm.compress(Bitmap.CompressFormat.PNG, 90, os); + } + + public void clear() + { + path.reset(); + invalidate(); + } + + @Override + protected void onDraw(Canvas canvas) + { + canvas.drawPath(path, paint); + } + + @Override + public boolean onTouchEvent(MotionEvent event) + { + float eventX = event.getX(); + float eventY = event.getY(); + + switch (event.getAction()) + { + case MotionEvent.ACTION_DOWN: + path.moveTo(eventX, eventY); + lastTouchX = eventX; + lastTouchY = eventY; + return true; + + case MotionEvent.ACTION_MOVE: + + case MotionEvent.ACTION_UP: + + resetDirtyRect(eventX, eventY); + int historySize = event.getHistorySize(); + for (int i = 0; i < historySize; i++) + { + float historicalX = event.getHistoricalX(i); + float historicalY = event.getHistoricalY(i); + expandDirtyRect(historicalX, historicalY); + path.lineTo(historicalX, historicalY); + } + path.lineTo(eventX, eventY); + break; + + default: + debug("Ignored touch event: " + event.toString()); + return false; + } + + invalidate((int) (dirtyRect.left - HALF_STROKE_WIDTH), + (int) (dirtyRect.top - HALF_STROKE_WIDTH), + (int) (dirtyRect.right + HALF_STROKE_WIDTH), + (int) (dirtyRect.bottom + HALF_STROKE_WIDTH)); + + lastTouchX = eventX; + lastTouchY = eventY; + + return true; + } + + private void debug(String string){ + } + + private void expandDirtyRect(float historicalX, float historicalY) + { + if (historicalX < dirtyRect.left) + { + dirtyRect.left = historicalX; + } + else if (historicalX > dirtyRect.right) + { + dirtyRect.right = historicalX; + } + + if (historicalY < dirtyRect.top) + { + dirtyRect.top = historicalY; + } + else if (historicalY > dirtyRect.bottom) + { + dirtyRect.bottom = historicalY; + } + } + + private void resetDirtyRect(float eventX, float eventY) + { + dirtyRect.left = Math.min(lastTouchX, eventX); + dirtyRect.right = Math.max(lastTouchX, eventX); + dirtyRect.top = Math.min(lastTouchY, eventY); + dirtyRect.bottom = Math.max(lastTouchY, eventY); + } +}