2016-07-07 22 views
0


Ich implementiere eine grafische Signaturerfassungsfunktion für meine Android-App. Online Ich habe eine perfekt funktionierende Funktion gefunden und es ist bereits in meinem Code. Der Benutzer zeichnet seine Unterschrift und das Bild wird korrekt gespeichert!
Jetzt möchte ich diesen Code hinzufügen: Wenn onCreate Funktion aufgerufen wird, möchte ich überprüfen, ob ein Signaturbild bereits vorhanden ist, und wenn ja, laden Sie es. Mit dieser Implementierung können Benutzer ihre eigene Signatur überprüfen.
Ist das möglich? Vorschläge werden wirklich geschätzt! Danke im Voraus!Android: Laden Sie PNG-Bild mit Canvas

Hier ist mein Code:

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.firma_allievo); 
    tempDir = Environment.getExternalStorageDirectory().toString() + "/temp/"+corsok+"/"; 
    ContextWrapper cw = new ContextWrapper(getApplicationContext()); 

    current = tempDir + allievo + ".png"; // THIS IS THE PATH OF THE SIGNATURE IMAGE FILE 

    mypath= new File(current); 
    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(true); 
    mCancel = (Button)findViewById(R.id.cancel); 
    mView = mContent; 

    mClear.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      mSignature.clear(); 
     } 
    }); 

    mGetSign.setOnClickListener(new OnClickListener() 
    { 
     public void onClick(View v) 
     { 
      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(); 
      } 
     } 
    }); 
} 

Antwort

0

Es sollte so tun dies so einfach sein:

ImageView image = (ImageView) findViewById(R.id.test_image); 
Bitmap bMap = BitmapFactory.decodeFile("/sdcard/test2.png"); 
image.setImageBitmap(bMap); 

Wenn Sie das Bild auf Leinwand zeichnen möchten, dann können Sie die Bitmap verwenden eine erstellen BitmapDrawable und dann Drawable auf Canvas zeichnen ist trivial.

Bitmap bMap = BitmapFactory.decodeFile("/sdcard/test2.png"); 
Drawable d = new BitmapDrawable(bMap); 
d.setBounds(left, top, right, bottom); 
d.draw(canvas); 
0

Hier ist die signature unter:

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) 
    { 
     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); 
       //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); 
     acquisisciFirma = "SI"; 

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

von mir gelöst! Die geladene Bitmap wird in der Canvas-Komponente als Hintergrund festgelegt. Hier ist der Code:

File file = new File(current); 
if(file.exists()) { 
    Bitmap bMap = BitmapFactory.decodeFile(current); 
    Drawable d = new BitmapDrawable(bMap); 
    mSignature.setBackground(d); 
} 

Hinweis: Mindest API-Level 16!