2011-08-29 45 views
26

Tôi đang làm việc trên ứng dụng Android. Trong dự án của tôi, tôi có một công việc liên quan đến chụp chữ ký tức là người dùng nên giữ/chữ ký của mình của mình trên màn hình của điện thoại di động và một lầntiết kiệm button được click chữ ký phải được lưu trữ trong cơ sở dữ liệu . Tôi đã tìm kiếm và tìm thấy một số liên kết nhưng tôi vẫn không tìm thấy giải pháp chính xác. Tôi cũng đã thử TouchPaint.java nhưng ở đó tôi không tìm thấy tệp xml để bố cục. Bạn có thể gợi ý cho chúng tôi một số mã mẫu không? Tôi sẽ cảm ơn bạn ....Chụp chữ ký Android

+1

lẽ [câu hỏi liên quan] [1] này cung cấp cho bạn một số gợi ý. [1]: http://stackoverflow.com/questions/4658703/signature-capture-in-phonegap-android-application – Ber

+0

có thể trùng lặp: [Cần thực hiện chụp chữ ký] (http: // stackoverflow .com/q/3752003/145173) –

Trả lời

4

bạn có thể cần trình tạo cử chỉ.

tôi nghĩ liên kết này.

http://android-developers.blogspot.com/2009/10/gestures-on-android-16.html

sẽ hữu ích cho bạn. nếu bạn cần kiểm tra lại chữ ký.

CẬP NHẬT

Bạn đang nói về vấn đề này

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/TouchPaint.html

sau đó ví dụ này không sử dụng xml. nó có quan điểm như một lớp bên trong (MyView)

+0

Xin cảm ơn vì đã trả lời. Tôi chỉ cần ứng dụng TouchPaint. Nhưng tôi không thể xem đầu ra khi tôi thực thi ứng dụng. Tôi có cần bất kỳ tệp mới nào khác để thêm vào để thực thi ứng dụng không? Tôi đã thêm hai lớp khác GraphicsActivity và PictureLayout ... –

+2

, bạn có thể tìm thấy ví dụ làm việc đầy đủ của TouchPaing/FingerPaint trong ** com.example.android.apis.graphics ** trong android SDK của ** sdk ** – Samuel

4

Tôi biết đây là câu hỏi cũ nhưng tôi cần triển khai chế độ xem của riêng mình để chụp chữ ký vì tôi đang sử dụng MonoForAndroid (C# không phải Java). Vì vậy, tôi đang thêm mã View của mình ở đây trong trường hợp ai đó cần nó.

using System; 
using Android.Content; 
using Android.Graphics; 
using Android.Views; 

namespace MyApp.Views 
{ 
    public class CaptureSignatureView : View 
    { 
     public CaptureSignatureView(Context c, SignatureData signatureData) : base(c) 
     { 
      SignatureData = signatureData; 
      _Path = new Path(); 
      _BitmapPaint = new Paint(PaintFlags.Dither); 
      _paint = new Paint 
      { 
       AntiAlias = true, 
       Dither = true, 
       Color = Color.Argb(255, 0, 0, 0) 
      }; 
      _paint.SetStyle(Paint.Style.Stroke); 
      _paint.StrokeJoin = Paint.Join.Round; 
      _paint.StrokeCap = Paint.Cap.Round; 
      _paint.StrokeWidth = 8; 
     } 

     protected override void OnSizeChanged(int w, int h, int oldw, int oldh) 
     { 
      base.OnSizeChanged(w, h, oldw, oldh); 
      _Bitmap = Bitmap.CreateBitmap(w, (h > 0 ? h : ((View)this.Parent).Height), Bitmap.Config.Argb8888); 
      _Canvas = new Canvas(_Bitmap); 
     } 

     protected override void OnDraw(Canvas canvas) 
     { 
      canvas.DrawColor(Color.White); 
      canvas.DrawBitmap(_Bitmap, 0, 0, _BitmapPaint); 
      canvas.DrawPath(_Path, _paint); 
     } 

     private float _mX, _mY; 
     private const float TouchTolerance = 4; 

     private void TouchStart(float x, float y) 
     { 
      _Path.Reset(); 
      _Path.MoveTo(x, y); 
      _mX = x; 
      _mY = y; 
      SignatureData.AddPoint(SignatureState.Start, (int)x, (int)y); 
     } 

     private void TouchMove(float x, float y) 
     { 
      float dx = Math.Abs(x - _mX); 
      float dy = Math.Abs(y - _mY); 

      if (dx >= TouchTolerance || dy >= TouchTolerance) 
      { 
       _Path.QuadTo(_mX, _mY, (x + _mX)/2, (y + _mY)/2); 
       SignatureData.AddPoint(SignatureState.Move, (int)x, (int)y); 
       _mX = x; 
       _mY = y; 
      } 
     } 

     private void TouchUp() 
     { 
      if (!_Path.IsEmpty) 
      { 
       _Path.LineTo(_mX, _mY); 
       _Canvas.DrawPath(_Path, _paint); 
      } 
      else 
      { 
       _Canvas.DrawPoint(_mX, _mY, _paint); 
      } 
      SignatureData.AddPoint(SignatureState.End, (int)_mX, (int)_mY); 

      _Path.Reset(); 
     } 

     public override bool OnTouchEvent(MotionEvent e) 
     { 
      var x = e.GetX(); 
      var y = e.GetY(); 

      switch (e.Action) 
      { 
       case MotionEventActions.Down: 
        TouchStart(x, y); 
        Invalidate(); 
        break; 
       case MotionEventActions.Move: 
        TouchMove(x, y); 
        Invalidate(); 
        break; 
       case MotionEventActions.Up: 
        TouchUp(); 
        Invalidate(); 
        break; 
      } 
      return true; 
     } 

     public void ClearCanvas() 
     { 
      _Canvas.DrawColor(Color.White); 
      Invalidate(); 
     } 

     public Bitmap CanvasBitmap() 
     { 
      return _Bitmap; 
     } 

     public void Clear() 
     { 
      ClearCanvas(); 
      SignatureData = new SignatureData(); 
     } 

     #region Implementation 

     private Bitmap _Bitmap; 
     private Canvas _Canvas; 
     private readonly Path _Path; 
     private readonly Paint _BitmapPaint; 
     private readonly Paint _paint; 
     public SignatureData SignatureData; 

     #endregion 
    } 

} 

Ngoài ra, tôi có blog post here để xem chi tiết cách chụp chữ ký. Về cơ bản bạn có thể làm điều đó theo hai cách khác nhau. Bạn có thể chụp được khung nhìn với chữ ký dưới dạng hình ảnh và bạn lưu bitmap đó (và gửi nó đến máy chủ). Hoặc bạn chỉ có thể chụp một mảng hai chiều và tái tạo chữ ký theo bất kỳ cách nào bạn muốn.

+1

"Bài đăng trên blog của bạn tại đây" không tồn tại. – Pierre

+0

Làm thế nào để bạn truy xuất Bitmap sau khi vẽ? Im nhận được một tờ giấy trắng mỗi lần, khi vẽ, nó dính. Nhưng về tiết kiệm, không thể có được bitmap với các bản vẽ trên? – Pierre

+0

+1 Cảm ơn mã của bạn, Xem bài đăng của tôi là phiên bản java của mã C# – Pierre

29

Dưới đây là phiên bản Java làm việc của Has AlTaiar của C# Chữ ký View, Đã cho tôi một thời gian để có được nó để làm việc 100% chính xác

public class CaptureSignatureView extends View { 

    private Bitmap _Bitmap; 
    private Canvas _Canvas; 
    private Path _Path; 
    private Paint _BitmapPaint; 
    private Paint _paint; 
    private float _mX; 
    private float _mY; 
    private float TouchTolerance = 4; 
    private float LineThickness = 4; 

    public CaptureSignatureView(Context context, AttributeSet attr) { 
     super(context, attr); 
     _Path = new Path(); 
     _BitmapPaint = new Paint(Paint.DITHER_FLAG); 
     _paint = new Paint(); 
     _paint.setAntiAlias(true); 
     _paint.setDither(true); 
     _paint.setColor(Color.argb(255, 0, 0, 0)); 
     _paint.setStyle(Paint.Style.STROKE); 
     _paint.setStrokeJoin(Paint.Join.ROUND); 
     _paint.setStrokeCap(Paint.Cap.ROUND); 
     _paint.setStrokeWidth(LineThickness); 
    } 

    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     super.onSizeChanged(w, h, oldw, oldh); 
     _Bitmap = Bitmap.createBitmap(w, (h > 0 ? h : ((View) this.getParent()).getHeight()), Bitmap.Config.ARGB_8888); 
     _Canvas = new Canvas(_Bitmap); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     canvas.drawColor(Color.WHITE); 
     canvas.drawBitmap(_Bitmap, 0, 0, _BitmapPaint); 
     canvas.drawPath(_Path, _paint); 
    } 

    private void TouchStart(float x, float y) { 
     _Path.reset(); 
     _Path.moveTo(x, y); 
     _mX = x; 
     _mY = y; 
    } 

    private void TouchMove(float x, float y) { 
     float dx = Math.abs(x - _mX); 
     float dy = Math.abs(y - _mY); 

     if (dx >= TouchTolerance || dy >= TouchTolerance) { 
      _Path.quadTo(_mX, _mY, (x + _mX)/2, (y + _mY)/2); 
      _mX = x; 
      _mY = y; 
     } 
    } 

    private void TouchUp() { 
     if (!_Path.isEmpty()) { 
      _Path.lineTo(_mX, _mY); 
      _Canvas.drawPath(_Path, _paint); 
     } else { 
      _Canvas.drawPoint(_mX, _mY, _paint); 
     } 

     _Path.reset(); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent e) { 
     super.onTouchEvent(e); 
     float x = e.getX(); 
     float y = e.getY(); 

     switch (e.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       TouchStart(x, y); 
       invalidate(); 
       break; 
      case MotionEvent.ACTION_MOVE: 
       TouchMove(x, y); 
       invalidate(); 
       break; 
      case MotionEvent.ACTION_UP: 
       TouchUp(); 
       invalidate(); 
       break; 
     } 

     return true; 
    } 

    public void ClearCanvas() { 
     _Canvas.drawColor(Color.WHITE); 
     invalidate(); 
    } 

    public byte[] getBytes() { 
     Bitmap b = getBitmap(); 

     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     b.compress(Bitmap.CompressFormat.PNG, 100, baos); 
     return baos.toByteArray(); 
    } 

    public Bitmap getBitmap() { 
     View v = (View) this.getParent(); 
     Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888); 
     Canvas c = new Canvas(b); 
     v.layout(v.getLeft(), v.getTop(), v.getRight(), v.getBottom()); 
     v.draw(c); 

     return b; 
    } 
} 

Tôi cố gắng gợi ý Rob Croll, mà làm việc tốt, nhưng nó là thẳng, dựng hình chữ ký không phải con người.Nếu bạn biết những gì tôi có nghĩa là: P

Đây là cách bạn thêm quan điểm trên một bố trí tuyến tính trống

LinearLayout mContent = (LinearLayout) findViewById(R.id.linearLayout); 
CaptureSignatureView mSig = new CaptureSignatureView(this, null); 
mContent.addView(mSig, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 

Dưới đây là làm thế nào để có được các byte hoặc Bitmap thức xác nhận

byte[] signature = mSig.getBytes(); 
Bitmap signature = mSig.getBitmap(); 
+0

Có thể kiểm tra xem người dùng đã đăng nhập hay chưa? –

+0

@ItuokeAjanlekoko Bạn có thể thêm một sự kiện kiểm tra độ dài của dòng, nếu nó lớn hơn một dấu chấm, hãy đặt cờ bool thành true – Pierre

+1

Vâng. Đã làm một cái gì đó như thế, nhưng tôi đã không kiểm tra chiều dài dòng. Tôi đã thêm nó vào sự kiện chuyển động và sự kiện chuyển động xuống. Và nếu người dùng xóa, nó sẽ trở thành sai. Cảm ơn. –

Các vấn đề liên quan