2012-10-10 37 views
0

在我的android應用程序用戶在我的應用程序的窗體中籤名。簽名必須進行編輯,更新,保存。我確實保存並清除。但編輯不工作我使用下面的代碼在android中籤名?

mContent = (LinearLayout) findViewById(R.id.linearLayout); 
mSignature = new signature(this, null); 
mSignature.setBackgroundColor(Color.WHITE); 
mContent.addView(mSignature, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 
mClear = (Button)findViewById(R.id.clear); 
mGetSign = (Button)findViewById(R.id.getsign); 
mGetSign.setEnabled(false); 
mCancel = (Button)findViewById(R.id.cancel); 
mView = mContent; 

mClear.setOnClickListener(new OnClickListener() 
    {   
     public void onClick(View v) 
     { 
      Log.v("log_tag", "Panel Cleared"); 

      mSignature.clear(); 
      mGetSign.setEnabled(false); 
     } 
    }); 

    mGetSign.setOnClickListener(new OnClickListener() 
    {   
     public void onClick(View v) 
     { 
      Log.v("log_tag", "Panel Saved"); 

       mView.setDrawingCacheEnabled(true); 
       mSignature.save(mView); 
       Bundle b = new Bundle(); 
       b.putString("status", "done"); 
       b.putParcelable("data", mBitmap); 
       Intent intent = new Intent(); 
       intent.putExtras(b); 
       setResult(RESULT_OK,intent); 
       finish(); 
      } 

    }); 

    mCancel.setOnClickListener(new OnClickListener() 
    {   
     public void onClick(View v) 
     { 
      Log.v("log_tag", "Panel Canceled"); 
      Bundle b = new Bundle(); 
      b.putString("status", "cancel"); 
      Intent intent = new Intent(); 
      intent.putExtras(b); 
      setResult(RESULT_OK,intent); 
      finish(); 
     } 
    }); 

} 

@Override 
protected void onDestroy() { 
    Log.w("GetSignature", "onDestory"); 
    super.onDestroy(); 
} 


public class signature extends View 
    { 
     private static final float STROKE_WIDTH = 5f; 
     private static final float HALF_STROKE_WIDTH = STROKE_WIDTH/2; 
     private Paint paint = new Paint(); 
     private Path path = new Path(); 

     private float lastTouchX; 
     private float lastTouchY; 
     private final RectF dirtyRect = new RectF(); 

     public signature(Context context, AttributeSet attrs) 
     { 
      super(context, attrs); 
      paint.setAntiAlias(true); 
      paint.setColor(Color.BLACK); 
      paint.setStyle(Paint.Style.STROKE); 
      paint.setStrokeJoin(Paint.Join.ROUND); 
      paint.setStrokeWidth(STROKE_WIDTH); 
     } 

     public void save(View v) 
     { 
      Log.v("log_tag", "Width: " + v.getWidth()); 
      Log.v("log_tag", "Height: " + v.getHeight()); 


      if(mBitmap == null) 
      { 
       mBitmap = Bitmap.createBitmap (mContent.getWidth(), mContent.getHeight(), Bitmap.Config.RGB_565);; 

      } 


      Canvas canvas = new Canvas(mBitmap); 

      try 
      { 
       FileOutputStream mFileOutStream = new FileOutputStream(mypath); 

       v.draw(canvas); 
       mBitmap.compress(Bitmap.CompressFormat.PNG, 90, mFileOutStream); 

       mFileOutStream.flush(); 
       mFileOutStream.close(); 

       // String url = Images.Media.insertImage(getContentResolver(), mBitmap, "title", null); 
       // Log.v("log_tag","url: " + url); 
       //In case you want to delete the file 
       //boolean deleted = mypath.delete(); 
       //Log.v("log_tag","deleted: " + mypath.toString() + deleted); 
       //If you want to convert the image to string use base64 converter 

      } 
      catch(Exception e) 
      { 
       Log.v("log_tag", e.toString()); 
      } 
     } 

     public void clear() 
     { 
      path.reset(); 
      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(); 
      mGetSign.setEnabled(true); 

      switch (event.getAction()) 
      { 
      case MotionEvent.ACTION_DOWN: 
       path.moveTo(eventX, eventY); 
       lastTouchX = eventX; 
       lastTouchY = eventY; 
       return true; 

      case MotionEvent.ACTION_MOVE: 

      case MotionEvent.ACTION_UP: 

       resetDirtyRect(eventX, eventY); 
       int historySize = event.getHistorySize(); 
       for (int i = 0; i < historySize; i++) 
       { 
        float historicalX = event.getHistoricalX(i); 
        float historicalY = event.getHistoricalY(i); 
        expandDirtyRect(historicalX, historicalY); 
        path.lineTo(historicalX, historicalY); 
       } 
       path.lineTo(eventX, eventY); 
       break; 

      default: 
       debug("Ignored touch event: " + event.toString()); 
       return false; 
      } 

      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; 
     } 

     private void debug(String string){ 
     } 

     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; 
      } 
     } 

     private void resetDirtyRect(float eventX, float eventY) 
     { 
      dirtyRect.left = Math.min(lastTouchX, eventX); 
      dirtyRect.right = Math.max(lastTouchX, eventX); 
      dirtyRect.top = Math.min(lastTouchY, eventY); 
      dirtyRect.bottom = Math.max(lastTouchY, eventY); 
     } 
    } 
+0

總是指定「不工作」。 – keyser

+0

始終不工作...總是指定「不工作」 – Palaniraja

+0

可能重複:需要實現簽名捕獲(http://stackoverflow.com/q/3752003/145173) –

回答

4

大概這個自定義視圖將有所幫助。在你的XML,只需使用me.other.SignatureView

package me.other; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.os.SystemClock; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.view.View; 

/** 
* A simple view to capture a path traced onto the screen. Initially intended to be used to captures signatures. 
* 
* @author Andrew Crichton 
* @version 0.1 
*/ 
public class SignatureView extends View { 
    @SuppressWarnings("unused") 
    private Path mPath; 
    private Paint mPaint; 
    private Paint bgPaint = new Paint(Color.TRANSPARENT); 

    private Bitmap mBitmap; 
    private Canvas mCanvas; 

    private float curX, curY; 

    private static final int TOUCH_TOLERANCE = 4; 
    private static final int STROKE_WIDTH = 4; 

    public SignatureView(Context context) { 
     super(context); 
     init(); 
    } 
    public SignatureView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 
    public SignatureView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(); 
    } 
    private void init() { 
     setFocusable(true); 
     mPath = new Path(); 
     mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     mPaint.setColor(Color.WHITE); 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setStrokeWidth(STROKE_WIDTH); 
    } 
    public void setSigColor(int color) { 
     mPaint.setColor(color); 
    } 
    public void setSigColor(int a, int red, int green, int blue) { 
     mPaint.setARGB(a, red, green, blue); 
    } 
    public boolean clearSignature() { 
     if (mBitmap != null) 
      createFakeMotionEvents(); 
     if (mCanvas != null) { 
      mCanvas.drawColor(Color.BLACK); 
      mCanvas.drawPaint(bgPaint); 
      mPath.reset(); 
      invalidate(); 
     } 
     else { 
      return false; 
     } 
     return true; 
    } 
    public Bitmap getImage() { 
     return this.mBitmap; 
    } 
    public void setImage(Bitmap bitmap) { 
     this.mBitmap = bitmap; 
     this.invalidate(); 
    } 
    @Override 
    protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) { 
     int bitmapWidth = mBitmap != null ? mBitmap.getWidth() : 0; 
     int bitmapHeight = mBitmap != null ? mBitmap.getWidth() : 0; 
     if (bitmapWidth >= width && bitmapHeight >= height) 
      return; 
     if (bitmapWidth < width) 
      bitmapWidth = width; 
     if (bitmapHeight < height) 
      bitmapHeight = height; 
     Bitmap newBitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888); 
     Canvas newCanvas = new Canvas(); 
     newCanvas.setBitmap(newBitmap); 
     if (mBitmap != null) 
      newCanvas.drawBitmap(mBitmap, 0, 0, null); 
     mBitmap = newBitmap; 
     mCanvas = newCanvas; 
    } 
    private void createFakeMotionEvents() { 
     MotionEvent downEvent = MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis()+100, MotionEvent.ACTION_DOWN, 1f, 1f ,0); 
     MotionEvent upEvent = MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis()+100, MotionEvent.ACTION_UP, 1f, 1f ,0); 
     onTouchEvent(downEvent); 
     onTouchEvent(upEvent); 
    } 
    @Override 
    protected void onDraw(Canvas canvas) { 
     canvas.drawColor(Color.BLACK); 
     canvas.drawBitmap(mBitmap, 0, 0, mPaint); 
     canvas.drawPath(mPath, mPaint); 
    } 
    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     float x = event.getX(); 
     float y = event.getY(); 

     switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      touchDown(x, y); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      touchMove(x, y); 
      break; 
     case MotionEvent.ACTION_UP: 
      touchUp(); 
      break; 
     } 
     invalidate(); 
     return true; 
    } 
    /**---------------------------------------------------------- 
    * Private methods 
    **---------------------------------------------------------*/ 

    private void touchDown(float x, float y) { 
     mPath.reset(); 
     mPath.moveTo(x, y); 
     curX = x; 
     curY = y; 
    } 

    private void touchMove(float x, float y) { 
     float dx = Math.abs(x - curX); 
     float dy = Math.abs(y - curY); 
     if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { 
      mPath.quadTo(curX, curY, (x + curX)/2, (y + curY)/2); 
      curX = x; 
      curY = y; 
     } 
    } 

    private void touchUp() { 
     mPath.lineTo(curX, curY); 
     if (mCanvas == null) { 
      mCanvas = new Canvas(); 
      mCanvas.setBitmap(mBitmap); 
     } 
     mCanvas.drawPath(mPath, mPaint); 
     mPath.reset(); 
    } 
} 
+0

原來這個源可以在這裏找到HTTPS ://github.com/CoatedMoose/CustomViews。 – CoatedMoose

0

我已經使用這個庫:com.github.gcacace:簽名墊:1.2.1 有了這個,我才得以清除,並保存簽名。如果它支持編輯,也不會嘗試。