src/tz/signaturecapture/CaptureSignature.java
changeset 5 19822c932652
parent 3 a41c0d4e533c
child 7 0454873af836
equal deleted inserted replaced
4:a36906c99a2c 5:19822c932652
     1 package tz.signaturecapture;
     1 package tz.signaturecapture;
     2 
     2 
     3 import java.io.File;
     3 import java.io.File;
     4 import java.io.FileOutputStream;
     4 import java.io.FileOutputStream;
     5 import java.io.IOException;
     5 import java.io.IOException;
     6 import java.io.OutputStream;
       
     7 import java.util.Calendar;
     6 import java.util.Calendar;
     8 
     7 
     9 import android.app.Activity;
     8 import android.app.Activity;
    10 import android.content.Context;
     9 import android.content.Context;
    11 import android.content.ContextWrapper;
    10 import android.content.ContextWrapper;
    12 import android.content.Intent;
    11 import android.content.Intent;
    13 import android.graphics.Bitmap;
       
    14 import android.graphics.Canvas;
       
    15 import android.graphics.Color;
    12 import android.graphics.Color;
    16 import android.graphics.Paint;
       
    17 import android.graphics.Path;
       
    18 import android.graphics.RectF;
       
    19 import android.os.Bundle;
    13 import android.os.Bundle;
    20 import android.os.Environment;
    14 import android.os.Environment;
    21 import android.util.AttributeSet;
       
    22 import android.util.Log;
    15 import android.util.Log;
    23 import android.view.Gravity;
    16 import android.view.Gravity;
    24 import android.view.MotionEvent;
    17 import android.view.MotionEvent;
    25 import android.view.View;
    18 import android.view.View;
    26 import android.view.View.OnClickListener;
    19 import android.view.View.OnClickListener;
   218                 }
   211                 }
   219             }
   212             }
   220         }
   213         }
   221         return (tempdir.isDirectory());
   214         return (tempdir.isDirectory());
   222     }
   215     }
   223  
       
   224     public static class SignatureWidget extends View
       
   225     {
       
   226         private static final float STROKE_WIDTH = 5f;
       
   227         private static final float HALF_STROKE_WIDTH = STROKE_WIDTH / 2;
       
   228         private Paint paint = new Paint();
       
   229         private Path path = new Path();
       
   230  
       
   231         private float lastTouchX;
       
   232         private float lastTouchY;
       
   233         private final RectF dirtyRect = new RectF();
       
   234  
       
   235         public SignatureWidget(Context context, AttributeSet attrs)
       
   236         {
       
   237             super(context, attrs);
       
   238             paint.setAntiAlias(true);
       
   239             paint.setColor(Color.BLACK);
       
   240             paint.setStyle(Paint.Style.STROKE);
       
   241             paint.setStrokeJoin(Paint.Join.ROUND);
       
   242             paint.setStrokeWidth(STROKE_WIDTH);
       
   243         }
       
   244  
       
   245         public void save(View parent, OutputStream os)
       
   246         {
       
   247             Log.v("log_tag", "Width: " + parent.getWidth());
       
   248             Log.v("log_tag", "Height: " + parent.getHeight());
       
   249             Bitmap bm =  Bitmap.createBitmap(parent.getWidth(), parent.getHeight(), Bitmap.Config.RGB_565);;
       
   250             Canvas canvas = new Canvas(bm);
       
   251             parent.draw(canvas);
       
   252             bm.compress(Bitmap.CompressFormat.PNG, 90, os);
       
   253         }
       
   254  
       
   255         public void clear()
       
   256         {
       
   257             path.reset();
       
   258             invalidate();
       
   259         }
       
   260  
       
   261         @Override
       
   262         protected void onDraw(Canvas canvas)
       
   263         {
       
   264             canvas.drawPath(path, paint);
       
   265         }
       
   266  
       
   267         @Override
       
   268         public boolean onTouchEvent(MotionEvent event)
       
   269         {
       
   270             float eventX = event.getX();
       
   271             float eventY = event.getY();
       
   272  
       
   273             switch (event.getAction())
       
   274             {
       
   275             case MotionEvent.ACTION_DOWN:
       
   276                 path.moveTo(eventX, eventY);
       
   277                 lastTouchX = eventX;
       
   278                 lastTouchY = eventY;
       
   279                 return true;
       
   280  
       
   281             case MotionEvent.ACTION_MOVE:
       
   282  
       
   283             case MotionEvent.ACTION_UP:
       
   284  
       
   285                 resetDirtyRect(eventX, eventY);
       
   286                 int historySize = event.getHistorySize();
       
   287                 for (int i = 0; i < historySize; i++)
       
   288                 {
       
   289                     float historicalX = event.getHistoricalX(i);
       
   290                     float historicalY = event.getHistoricalY(i);
       
   291                     expandDirtyRect(historicalX, historicalY);
       
   292                     path.lineTo(historicalX, historicalY);
       
   293                 }
       
   294                 path.lineTo(eventX, eventY);
       
   295                 break;
       
   296  
       
   297             default:
       
   298                 debug("Ignored touch event: " + event.toString());
       
   299                 return false;
       
   300             }
       
   301  
       
   302             invalidate((int) (dirtyRect.left - HALF_STROKE_WIDTH),
       
   303                     (int) (dirtyRect.top - HALF_STROKE_WIDTH),
       
   304                     (int) (dirtyRect.right + HALF_STROKE_WIDTH),
       
   305                     (int) (dirtyRect.bottom + HALF_STROKE_WIDTH));
       
   306  
       
   307             lastTouchX = eventX;
       
   308             lastTouchY = eventY;
       
   309  
       
   310             return true;
       
   311         }
       
   312  
       
   313         private void debug(String string){
       
   314         }
       
   315  
       
   316         private void expandDirtyRect(float historicalX, float historicalY)
       
   317         {
       
   318             if (historicalX < dirtyRect.left)
       
   319             {
       
   320                 dirtyRect.left = historicalX;
       
   321             }
       
   322             else if (historicalX > dirtyRect.right)
       
   323             {
       
   324                 dirtyRect.right = historicalX;
       
   325             }
       
   326  
       
   327             if (historicalY < dirtyRect.top)
       
   328             {
       
   329                 dirtyRect.top = historicalY;
       
   330             }
       
   331             else if (historicalY > dirtyRect.bottom)
       
   332             {
       
   333                 dirtyRect.bottom = historicalY;
       
   334             }
       
   335         }
       
   336  
       
   337         private void resetDirtyRect(float eventX, float eventY)
       
   338         {
       
   339             dirtyRect.left = Math.min(lastTouchX, eventX);
       
   340             dirtyRect.right = Math.max(lastTouchX, eventX);
       
   341             dirtyRect.top = Math.min(lastTouchY, eventY);
       
   342             dirtyRect.bottom = Math.max(lastTouchY, eventY);
       
   343         }
       
   344     }
       
   345 }
   216 }