2012-05-23 6 views
0

Я работаю над приложениями для подписи к изображениям на основе android, где у него есть возможность очистить краску и сохранить холст в виде растрового изображения. Я сталкиваюсь с проблемой в этом приложении, всякий раз, когда я хочу сохранить холст в качестве растрового изображения, мне нужно проверить, достаточно ли достаточно подписи или нет. Если подпись слишком короткая, я должен попросить пользователя снова поставить подпись. Ниже приведен мой код: В этом есть два класса.Приложение для подписи на холсте для Android Android

FingerPaintActivity

public class FingerPaintActivity extends Activity implements OnClickListener{ 

private Button clearBtn, saveBtn; 

private View myView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.main); 

    myView = findViewById(R.id.myView); 

    clearBtn = (Button) findViewById(R.id.clearBtn); 
    clearBtn.setOnClickListener(this); 

    saveBtn = (Button) findViewById(R.id.submitBtn); 
    saveBtn.setOnClickListener(this); 

} 

@Override 
public void onClick(View v) { 

    if (v == clearBtn) { 

     MyView.clearCanvas(); 
     myView.invalidate(); 
     myView.refreshDrawableState(); 

    } else { 

     myView.setDrawingCacheEnabled(true); 

     myView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 
     myView.layout(0, 0, myView.getWidth(), myView.getHeight()); 
     myView.buildDrawingCache(true); 
     Bitmap bm = Bitmap.createBitmap(myView.getDrawingCache()); 
     myView.setDrawingCacheEnabled(false); 
     if (bm != null) { 
      try { 
       String path = Environment.getExternalStorageDirectory().toString(); 
       OutputStream fOut = null; 
       File file = new File(path, "screentest.jpg"); 
       fOut = new FileOutputStream(file); 
       bm.compress(Bitmap.CompressFormat.JPEG, 85, fOut); 
       fOut.flush(); 
       fOut.close(); 
       Log.e("ImagePath", "Image Path : " + MediaStore.Images.Media.insertImage(getContentResolver(), file.getAbsolutePath(), file.getName(), file.getName())); 

       sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory()))); 
      } 
      catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
} 

Это второй класс: MyView

public class MyView extends View { 

// private static final float MINP = 0.25f; 
// private static final float MAXP = 0.75f; 

private Bitmap mBitmap; 
private static Canvas mCanvas; 
private Path mPath; 
private Paint mBitmapPaint; 
private Paint mPaint; 

public MyView(Context c) { 
    super(c); 

} 

public MyView(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    mPaint = new Paint(); 
    mPaint.setAntiAlias(true); 
    mPaint.setDither(true); 
    mPaint.setColor(Color.BLACK); 
    mPaint.setStyle(Paint.Style.STROKE); 
    mPaint.setStrokeJoin(Paint.Join.ROUND); 
    mPaint.setStrokeCap(Paint.Cap.ROUND); 
    mPaint.setStrokeWidth(6); 
    mBitmap = Bitmap.createBitmap(320, 480, Bitmap.Config.ARGB_8888); 
    mCanvas = new Canvas(mBitmap); 
    mPath = new Path(); 
    mBitmapPaint = new Paint(Paint.DITHER_FLAG); 
} 

public MyView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

@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(0xFFAAAAAA); 

    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 static void clearCanvas() { 
    Paint paint = new Paint(); 
    paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR)); 
    mCanvas.drawPaint(paint); 
    paint.setXfermode(new PorterDuffXfermode(Mode.SRC)); 

} 

}

Единственная проблема, я столкнулся это при сохранении подписи я должен проверить размер растровое изображение или холст или краску перед сохранением. Я не знаю, какой из них нужно проверить для Если у кого-то есть идея, пожалуйста, помогите мне.

ответ

1

Простым подходом было бы суммировать расстояния между касательными координатами и принимать только подпись, если сумма больше определенного порогового значения.

Итак, пополняемый сумму общего расстояния нарисованный TOUCH_MOVE()

mTotal += Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2)); 

потом на

if(mTotal >= MINIMUM_SIGNATURE_LENGTH) 
{ 
    acceptSignature(); 
} 
+0

Благодаря Бадди !!!! Это мне очень помогло. Я могу выполнить проверку подписи сейчас! – krisDrOid

+0

Нет проблем, удачи! – Josh

Смежные вопросы