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
Trả lời
Đối với bất cứ ai tìm kiếm một giải pháp bạn sẽ tìm thấy một tại http://www.mysamplecode.com/2011/11/android-capture-signature-using-canvas.html
Nó thực sự viết chữ ký để nộp nhưng nó đủ dễ dàng để thay đổi và ghi vào một thay vào đó.
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
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)
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 ... –
, 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
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.
"Bài đăng trên blog của bạn tại đây" không tồn tại. – Pierre
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
+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
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();
Có thể kiểm tra xem người dùng đã đăng nhập hay chưa? –
@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
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. –
- 1. chụp chữ ký cho android bằng phonegap
- 2. Cách chụp chữ ký của con người
- 3. iphone SDK: Cách triển khai chụp ảnh chữ ký?
- 4. Gửi mẫu chữ ký chụp sử dụng SVG
- 5. Android - Chụp ảnh
- 6. Có thể chụp chữ ký trong các trình duyệt web di động khác nhau?
- 7. Xác minh Chữ ký LVL Android Không thành công
- 8. Lấy chữ ký apk khi chạy cho Android
- 9. Xóa chữ ký dưới dạng chữ ký neo
- 10. Android: Chụp lại hoạt động
- 11. Chụp màn hình trong android
- 12. Hướng chụp ảnh được chụp đang thay đổi trong android
- 13. Chữ ký Loại
- 14. LinkedHashMap chữ ký
- 15. Android: màu chữ holo nhạt
- 16. Lưu ảnh của chữ ký vào một tệp ở Rhodes trên Android
- 17. Chữ ký printf là gì?
- 18. C#: Chữ ký phương thức?
- 19. Chụp ảnh màn hình của Android OpenGL
- 20. Android chụp màn hình theo chương trình
- 21. Phát hành nút chụp trong Android
- 22. Ảnh chụp màn hình OpenGL Android
- 23. Kiểu chữ Android createFromAsset
- 24. tạo chữ ký với SHA256withRSA thay vì SHA1withRSA
- 25. Chữ "() V" có nghĩa gì trong chữ ký của lớp?
- 26. hết hạn của một PDF chữ ký số với nhiều chữ ký
- 27. Chữ ký phương thức Generics và chữ ký chuẩn giống hệt nhau
- 28. WCF Client - Chỉ định thuật toán chữ ký cho chữ ký WS-Security Dấu thời gian
- 29. Khoảng cách chữ trong EditText cho Android
- 30. Thêm chữ ký GPG vào tài liệu đã ký?
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
có thể trùng lặp: [Cần thực hiện chụp chữ ký] (http: // stackoverflow .com/q/3752003/145173) –