Search code examples
javaandroiddigital-signaturestylus-pen

Add signature column in the application


I'm doing a simple courier system using android. How do I do if at the end of the delivery process client have to sign on the phone as the acknowledgement that they received the courier. How do i can do this using android. Any advice, suggestion is highly appreciated.


Solution

  • Performing a signature consume lots of space and a in phone device small area is not sufficient to take a signature from client at end of delivery process this is my idea.

    Generate a list having delivery details.

    --> at delivery time on click of delivered item a view opened.

    --> in that view client can perform signature.

    --> you can save that signature along with delivery details in DB

    --> Delete or transfer items from to Deliver list to Delivered items(Which should be your another view approach)

    This is my idea to perfor

    m that task. For taking signature you can apply paint method and signature methods ask me if you want help on that too. thanks

    package com.paintexample;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Path;
    import android.graphics.RectF;
    import android.view.MotionEvent;
    import android.view.View;
    
    public class DrawView extends View {
    
        private static final float STROKE_WIDTH = 5f;
    
        /** Need to track this so the dirty region can accommodate the stroke. **/
        private static final float HALF_STROKE_WIDTH = STROKE_WIDTH / 2;
    
        private Paint paint = new Paint();
        private Path path = new Path();
    
        /** Optimizes painting by invalidating the smallest possible area. */
        private float lastTouchX;
        private float lastTouchY;
        private final RectF dirtyRect = new RectF();
    
        public DrawView(Context context) {
            super(context);
    
            paint.setAntiAlias(true);
            paint.setColor(Color.BLACK);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeJoin(Paint.Join.ROUND);
            paint.setStrokeWidth(STROKE_WIDTH);
        }
    
        /** Erases the signature. */
        public void clear() {
            path.reset();
    
            // Repaints the entire view.
            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;
                // There is no end point yet, so don't waste cycles invalidating.
                return true;
    
            case MotionEvent.ACTION_MOVE:
            case MotionEvent.ACTION_UP:
                // Start tracking the dirty region.
                resetDirtyRect(eventX, eventY);
    
                // When the hardware tracks events faster than they are delivered,
                // the
                // event will contain a history of those skipped points.
                int historySize = event.getHistorySize();
                Logger.debug("historySize : " + historySize);
                for (int i = 0; i < historySize; i++) {
                    float historicalX = event.getHistoricalX(i);
                    float historicalY = event.getHistoricalY(i);
                    expandDirtyRect(historicalX, historicalY);
                    path.lineTo(historicalX, historicalY);
                }
    
                // After replaying history, connect the line to the touch point.
                // Logger.debug("eventX " + eventX);
                // Logger.debug("eventY " + eventX);
                //
                // Logger.debug("lastTouchX " + lastTouchX);
                // Logger.debug("lastTouchY " + lastTouchY);
                //
                // if (eventX == lastTouchX && eventY == lastTouchY) {
                //
                // path.addCircle(eventX, eventY, 20, Path.Direction.CW);
                //
                // }
    
                path.lineTo(eventX, eventY);
    
                break;
    
            default:
                Logger.debug("Ignored touch event: " + event.toString());
                return false;
            }
    
            // Include half the stroke width to avoid clipping.
            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;
        }
    
        /** Called when replaying history to ensure the dirty region includes all
         * points. */
        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;
            }
        }
    
        /** Resets the dirty region when the motion event occurs. */
        private void resetDirtyRect(float eventX, float eventY) {
    
            // The lastTouchX and lastTouchY were set when the ACTION_DOWN
            // motion event occurred.
            dirtyRect.left = Math.min(lastTouchX, eventX);
            dirtyRect.right = Math.max(lastTouchX, eventX);
            dirtyRect.top = Math.min(lastTouchY, eventY);
            dirtyRect.bottom = Math.max(lastTouchY, eventY);
        }
    }
    

    above is draw class

    now add draw view in your activity like this.

    //Assigning Drawing Board
            drawView = new DrawView(this);
            setContentView(view);
            drawView.requestFocus();
            linearLayout.addView(drawView);
    

    you can your different methods of DrawView class for clear/paint and more enjoy