2011-04-06 2 views
2

내 Java 코드는 다음과 같습니다. 비트 맵에 그려진 서명을 캡처하여 문자열 배열 (서명의 X 및 Y 좌표)에 저장하려고합니다.비트 맵 캔버스에 그려진 서명의 X 및 Y 좌표를 얻는 방법

package com.ust.mobile.android.jnj; 

import java.util.ArrayList; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.view.MotionEvent; 
import android.view.View; 

public class SignatureFieldClass extends View{ 


    private int nBitmapWidth = 700; 
    private int nBitmapHeight = 220; 

    private Bitmap mBitmap; 
    private Canvas mCanvas; 
    private Path mPath; 
    private Paint mBitmapPaint; 
    private Paint mPaint = new Paint(); 
    private ArrayList<String> signature=new ArrayList<String>(); 
    public SignatureFieldClass(Context c) { 
     super(c); 

     mPaint.setAntiAlias(true); 
     mPaint.setDither(true); 
     mPaint.setColor(0xFFFF0000); 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setStrokeJoin(Paint.Join.ROUND); 
     mPaint.setStrokeCap(Paint.Cap.ROUND); 
     mPaint.setStrokeWidth(4); 

     mBitmap = Bitmap.createBitmap(nBitmapWidth, nBitmapHeight, Bitmap.Config.ARGB_8888); 
     mCanvas = new Canvas(mBitmap); 
     mPath = new Path(); 
     mBitmapPaint = new Paint(Paint.DITHER_FLAG); 
    } 

    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     super.onSizeChanged(w, h, oldw, oldh); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     canvas.drawColor(0xFF6386AD); 
     canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 
     canvas.drawPath(mPath, mPaint); 
    } 

    private float mX, mY; 
    private static final float TOUCH_TOLERANCE = 4; 

    private void touch_start(float x, float y) { 
     mPath.reset(); 
     mPath.moveTo(x, y); 
     mX = x; 
     mY = y; 
    } 
    private void touch_move(float x, float y) { 
     float dx = Math.abs(x - mX); 
     float dy = Math.abs(y - mY); 
     if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { 
      mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
      mX = x; 
      mY = y; 
     } 
    } 
    private void touch_up() { 
     mPath.lineTo(mX, mY); 
     // commit the path to our offscreen 
     mCanvas.drawPath(mPath, mPaint); 
     // kill this so we don't double draw 
     mPath.reset(); 
    } 

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

     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       touch_start(x, y); 
       invalidate(); 
       break; 
      case MotionEvent.ACTION_MOVE: 
       touch_move(x, y); 
       invalidate(); 
       break; 
      case MotionEvent.ACTION_UP: 
       touch_up(); 
       invalidate(); 
       break; 
     } 
     return true; 
    } 



    public void ClearPath(){ 
     mPath.reset(); 
     invalidate(); 
    } 
} 
+0

당신이 묻는 것이 명확하지 않습니다. 서명의 (x, y) 좌표를 가져와야하나요, 아니면 그 사람의 이름을 읽으려고하십니까? 코드가 어떻게 작동하며 어떤 부분에 문제가 있습니까? –

+0

헤이 서명 (x, y) 좌표를 가져와야합니다 ... 도와주세요 –

답변

1

비트 맵의 ​​X 및 Y 좌표를 문자열 배열에 저장할 수 있으므로 아래 코드를 사용할 수 있습니다. private int mX, mY; 전용 정적 final float TOUCH_TOLERANCE = 4;

private void touch_start(int x, int y) { 
    mPath.reset(); 
    mPath.moveTo(x, y); 
    mX = x; 
    s=Integer.toString(mX); 
    //signatures=s; 
    sb.append(s); 
    sb.append(","); 
    //signature[0]=s; 
    mY = y; 
    s=Integer.toString(mY); 
    sb.append(s); 

    //signature[1]=s; 
} 
private void touch_move(int x, int y) { 
    float dx = Math.abs(x - mX); 
    float dy = Math.abs(y - mY); 
    if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { 
     mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
     mX = x; 
     s=Integer.toString(mX); 
     sb.append(","); 
     sb.append(s); 
     sb.append(","); 
     /* int l=signature.length; 
     signature[l]=s;*/ 
     mY = y; 
     s=Integer.toString(mY); 
     sb.append(s); 

     /*l=signature.length; 
     signature[l]=s;*/ 
    } 
} 
private void touch_up() { 
    mPath.lineTo(mX, mY); 
    s=Integer.toString(mX); 
    sb.append(","); 
    sb.append(s); 
    s=Integer.toString(mY); 
    sb.append(","); 
    sb.append(s); 
    sb.append(","); 
    // commit the path to our offscreen 
    mCanvas.drawPath(mPath, mPaint); 
    // kill this so we don't double draw 
    mPath.reset(); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    int x = (int)event.getX(); 
    int y = (int)event.getY(); 

    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      touch_start(x, y); 
      invalidate(); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      touch_move(x, y); 
      invalidate(); 
      break; 
     case MotionEvent.ACTION_UP: 
      touch_up(); 
      invalidate(); 
      break; 
    } 
    return true; 
} 

이것은 전체 code.it의 D 부분 F 코드 DAT 캡처의 X 및 Y coordinates.sb 문자열로 D 문자열 버퍼에서 D 값을 복사 할 수있는 문자열 buffer.we가된다 아니다.

+0

안녕하세요 Seethalakshmi ..이 코드는 모든 장치에서 작동합니다 .. 탭, 모바일, x, y 좌표는 동일합니다. 탭과 모바일 장치 둘 다. 친절하게 나에게 이것을 알려주십시오. http://stackoverflow.com/questions/32758064/how-to-get-the-co-ordinates-of-the-imageview-irrespective-of-the-device – Janmejoy

관련 문제