2016-02-26 97 views
1
public class MainActivity extends Activity { 

    LinearLayout mContent; 
    signature mSignature; 
    Button mClear, mGetSign, mCancel; 
    public static String tempDir; 
    public int count = 1; 
    public String current = null; 
    private Bitmap mBitmap; 
    View mView; 
    File mypath; 

    private String uniqueId; 
    private EditText yourName; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.signature); 
     uniqueId = "Sign" + Math.random(); 
     current = uniqueId + ".png"; 
     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; 

     mGetSign.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       Log.v("log_tag", "Panel Saved"); 
       boolean error = captureSignature(); 
       if (!error) { 
        mView.setDrawingCacheEnabled(true); 
        mSignature.save(mView); 
        Bundle b = new Bundle(); 
        b.putString("status", "done"); 
        Intent intent = new Intent(); 
        intent.putExtras(b); 
        setResult(RESULT_OK, intent); 
        finish(); 
       } 
      } 
     }); 

    } 

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

    private boolean captureSignature() { 

     boolean error = false; 
     String errorMessage = ""; 

     if (error) { 
      Toast toast = Toast 
        .makeText(this, errorMessage, Toast.LENGTH_SHORT); 
      toast.setGravity(Gravity.TOP, 105, 50); 
      toast.show(); 
     } 

     return error; 
    } 

这是signatureView类如何获得签名图片的位图

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

试试这个one.It返回路过观为位图

//where view can be any view. 
public static Bitmap getBitmapFromView(View view) { 
    //Define a bitmap with the same size as the view 
    Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),Bitmap.Config.RGB_565); 
    //Bind a canvas to it 
    Canvas canvas = new Canvas(returnedBitmap); 
    //Get the view's background 
    Drawable bgDrawable =view.getBackground(); 
    if (bgDrawable!=null) 
     //has background drawable, then draw it on the canvas 
     bgDrawable.draw(canvas); 
    else 
     //does not have background drawable, then draw white background on the canvas 
     canvas.drawColor(Color.WHITE); 
    // draw the view on the canvas 
    view.draw(canvas); 
    //return the bitmap 
    return returnedBitmap; 
} 

,并调用它像必经之地。

mGetSign.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      Log.v("log_tag", "Panel Saved"); 
      //where result is a bitmap which holds passed mView as Bitmap     
      Bitmap result=getBitmapFromView(mView); 
      } 
     } 
    }); 
+0

错误即将 –

+0

位图时,我试图调用上的保存按钮,它显示错误 –

+0

u能请告诉我,我必须在拿到价值保存按钮? –

1

你可以使用

Bitmap bitmap = ((BitmapDrawable)yourView.getDrawable()).getBitmap(); 
0
 public class CaptureFragment extends FragmentActivity { 


    LinearLayout mContent; 
    signature mSignature; 
    Button mClear, mGetSign, mCancel; 
    public static String tempDir; 
    public int count = 1; 
    public String current = null; 
    private Bitmap mBitmap; 
    View mView; 
    String upLoadServerUri = null; 
    File mypath; 


    private Bitmap bitmap; 
    private String uniqueId; 
    private EditText yourName; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.signature); 

     tempDir = Environment.getExternalStorageDirectory() + "/" + getResources().getString(R.string.external_dir) + "/"; 
     ContextWrapper cw = new ContextWrapper(getApplicationContext()); 
     File directory = cw.getDir(getResources().getString(R.string.external_dir), Context.MODE_PRIVATE); 
     prepareDirectory(); 
     uniqueId = getTodaysDate() + "_" + getCurrentTime() + "_" + Math.random(); 
     current = uniqueId + ".png"; 
     mypath= new File(directory,current); 
     //Toast.makeText(CaptureSignature.this, "Path"+mypath, Toast.LENGTH_SHORT).show(); 

     mContent = (LinearLayout) findViewById(R.id.linearLayout); 
     mSignature = new signature(this, null); 
     mSignature.setBackgroundColor(Color.WHITE); 
     mContent.addView(mSignature, RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.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; 

     //yourName = (EditText) findViewById(R.id.yourName); 

     /* mClear.setOnClickListener(new View.OnClickListener() 
     { 
      public void onClick(View v) 
      { 
      finish(); 
      } 
     });*/ 

     mGetSign.setOnClickListener(new View.OnClickListener() 
     { 
      public void onClick(View v) 
      { 
       Log.v("log_tag", "Panel Saved"); 
       boolean error = captureSignature(); 
       if(!error){ 
        mView.setDrawingCacheEnabled(true); 
        mSignature.save(mView); 
        Bundle b = new Bundle(); 
        b.putString("status", "done"); 
        Intent intent = new Intent(); 
        intent.putExtras(b); 
        setResult(RESULT_OK,intent); 
        finish(); 
       } 
      } 
     }); 

     /*mCancel.setOnClickListener(new View.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(); 
    } 

    private boolean captureSignature() { 

     boolean error = false; 
     String errorMessage = ""; 
/* if(yourName.getText().toString().equalsIgnoreCase("")){ 
      errorMessage = errorMessage + "Please enter your Name\n"; 
      error = true; 
     }*/ 



     if(error){ 
      Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT); 
      toast.setGravity(Gravity.TOP, 75, 50); 
      toast.show(); 
     } 

     return error; 
    } 

    private String getTodaysDate() { 

     final Calendar c = Calendar.getInstance(); 
     int todaysDate =  (c.get(Calendar.YEAR) * 10000) + 
       ((c.get(Calendar.MONTH) + 1) * 100) + 
       (c.get(Calendar.DAY_OF_MONTH)); 
     Log.w("DATE:", String.valueOf(todaysDate)); 
     return(String.valueOf(todaysDate)); 

    } 

    private String getCurrentTime() { 

     final Calendar c = Calendar.getInstance(); 
     int currentTime =  (c.get(Calendar.HOUR_OF_DAY) * 10000) + 
       (c.get(Calendar.MINUTE) * 100) + 
       (c.get(Calendar.SECOND)); 
     Log.w("TIME:", String.valueOf(currentTime)); 
     return(String.valueOf(currentTime)); 

    } 
    private boolean prepareDirectory() 
    { 
     try 
     { 
      if (makedirs()) 
      { 
       return true; 
      } else { 
       return false; 
      } 
     } catch (Exception e) 
     { 
      e.printStackTrace(); 
      Toast.makeText(this, "Could not initiate File System.. Is Sdcard mounted properly?", Toast.LENGTH_SHORT).show(); 
      return false; 
     } 
    } 

    private boolean makedirs() 
    { 
     File tempdir = new File(tempDir); 
     if (!tempdir.exists()) 
      tempdir.mkdirs(); 

     if (tempdir.isDirectory()) 
     { 
      File[] files = tempdir.listFiles(); 
      for (File file : files) 
      { 
       if (!file.delete()) 
       { 
        System.out.println("Failed to delete " + file); 
       } 
      } 
     } 
     return (tempdir.isDirectory()); 
    } 

    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 = MediaStore.Images.Media.insertImage(getContentResolver(), mBitmap, "title", null); 
       // Log.v("log_tag", "url: " + url); 
       //Toast.makeText(getApplicationContext(), "URL :"+mypath.toString(), Toast.LENGTH_SHORT).show(); 
       //new UploadImage().execute(null); 
       //changeStatus(); 
       // uploadImage(); 
       //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

那我确实是alredy但我必须得到BitMapvalue mGetSign你明白了吗? –

相关问题