Autore Topic: Firma "a mano"  (Letto 1190 volte)

Offline Teo

  • Utente junior
  • **
  • Post: 98
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Acer Liquid E / Xoom2
  • Sistema operativo:
    Mac OS X 10.8
Firma "a mano"
« il: 26 Agosto 2011, 14:31:07 CEST »
0
Ciao a tutti, ho implementato un layout che mi permette di disegnare a mano libera la mia firma, ora vorrei salvarla, qualcuno saprebbe dirmi (PER PIACERE  :'( :'( ) come potrei fare, visto che l'immagine e' contenuta solo nel canvas...

Offline Teo

  • Utente junior
  • **
  • Post: 98
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Acer Liquid E / Xoom2
  • Sistema operativo:
    Mac OS X 10.8
Re:Firma "a mano"
« Risposta #1 il: 26 Agosto 2011, 14:48:20 CEST »
+1
Aggiungo anche il codice  :-P

Codice (Java): [Seleziona]
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.nio.ByteBuffer;


import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;

public class Signature extends Activity {
        LinearLayout content;
        signature pnlpanel;
        Button btn;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.paint);

                content = (LinearLayout) findViewById(R.id.paintLayout);
                pnlpanel = new signature(this, null);
                pnlpanel.setBackgroundColor(Color.WHITE);
                content.addView(pnlpanel, LayoutParams.FILL_PARENT,
                                LayoutParams.FILL_PARENT);

                btn = (Button) findViewById(R.id.cancellaFirma);
                btn.setOnClickListener(new OnClickListener() {
                        public void onClick(View v) {
                                pnlpanel.clear();
                        }
                });
               
       
        }

        public class signature extends View {

                private static final float STROKE_WIDTH = 5f;

                /** Need to track this so the dirty region can accommodate the stroke. **/
                private static final float HALF_STROKE_WIDTH = STROKE_WIDTH / 2;

                private Paint paint = new Paint();
                private Path path = new Path();

                /**
                 * Optimizes painting by invalidating the smallest possible area.
                 */

                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() {

                        // TODO Auto-generated method stub

                }

                /**
                 * Erases the signature.
                 */

                public void clear() {
                        path.reset();

                        // Repaints the entire view.
                        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();

                        switch (event.getAction()) {
                        case MotionEvent.ACTION_DOWN:
                                path.moveTo(eventX, eventY);
                                lastTouchX = eventX;
                                lastTouchY = eventY;
                                // There is no end point yet, so don't waste cycles
                                // invalidating.
                                return true;

                        case MotionEvent.ACTION_MOVE:
                        case MotionEvent.ACTION_UP:
                                // Start tracking the dirty region.
                                resetDirtyRect(eventX, eventY);

                                // When the hardware tracks events faster than they are
                                // delivered, the
                                // event will contain a history of those skipped points.
                                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);
                                }

                                // After replaying history, connect the line to the touch point.
                                path.lineTo(eventX, eventY);
                                break;

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

                        // Include half the stroke width to avoid clipping.
                        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) {
                        // TODO Auto-generated method stub

                }

                /**
                 * Called when replaying history to ensure the dirty region includes all
                 * points.
                 */

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

                /**
                 * Resets the dirty region when the motion event occurs.
                 */

                private void resetDirtyRect(float eventX, float eventY) {

                        // The lastTouchX and lastTouchY were set when the ACTION_DOWN
                        // motion event occurred.
                        dirtyRect.left = Math.min(lastTouchX, eventX);
                        dirtyRect.right = Math.max(lastTouchX, eventX);
                        dirtyRect.top = Math.min(lastTouchY, eventY);
                        dirtyRect.bottom = Math.max(lastTouchY, eventY);
                }
                private Bitmap getBitmap(){
                        return bitmap;
                }
               
                private void setBitmap(Bitmap bitmap){
                        this.bitmap = bitmap;
                }

        }
       

}

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Firma "a mano"
« Risposta #2 il: 26 Agosto 2011, 18:00:11 CEST »
0
Puoi provare in questo modo, una volta che la tua view è già stata disegnata :

Codice (Java): [Seleziona]
public void saveViewToBitmap(View view){
 // Puoi usare Bitmap.Config.ARGB_8888 per la trasparenza oppure Bitmap.Config.RGB_565 senza trasparenza
 Bitmap  bitmap = Bitmap.createBitmap( view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
 // Poi passi la bitmap ad un nuovo Canvas e quest'ultimo nel metodo draw() della view
 // In questo modo viene fatto un render manuale sul Canvas dato...che a sua volta disegna sulla bitmap
 view.draw(new Canvas(bitmap));
 // Ora puoi salvare la Bitmap su file o usarla come vuoi
 // Salva su file...
 ...
}

Prova e fammi sapere  :-P

Offline Teo

  • Utente junior
  • **
  • Post: 98
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Acer Liquid E / Xoom2
  • Sistema operativo:
    Mac OS X 10.8
Re:Firma "a mano"
« Risposta #3 il: 31 Agosto 2011, 17:06:17 CEST »
0
Alla fine, ho fatto una cosa simile pure io.. anche se il vero problema è che non riesco più a recuperarla quando faccio l'onResume dell'activity.. cioè salvata è salvata, e pure correttamente, ma quando giro il tablet, quindi l'activity passa per l'onResume, non riesco a ridisegnare l'immagine salvata  :'(  Idee?

Offline ROS

  • Utente normale
  • ***
  • Post: 196
  • Respect: +5
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 10.04
Re:Firma "a mano"
« Risposta #4 il: 27 Novembre 2011, 02:19:33 CET »
0
Vorrei implementare anche io un "pannello" in cui e' possibile disegnare e poi salvarne le informazioni...
Il codice e' quello di sopra?

Per quanto riguarda il lato XML invece cosa hai usato?

Offline Teo

  • Utente junior
  • **
  • Post: 98
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Acer Liquid E / Xoom2
  • Sistema operativo:
    Mac OS X 10.8
Re:Firma "a mano"
« Risposta #5 il: 27 Novembre 2011, 22:50:01 CET »
0
si il codice è quello..
mentre per l'xml se non sbaglio avevo messo solo il layout e basta..
Però non ho sottomano il codice ora..