1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Unterschriften-Feld

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Tom299, 14.09.2011.

  1. Tom299, 14.09.2011 #1
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Hallo,

    hat sich schon mal jemand damit beschäftigt, eine Unterschrift in seiner App entgegenzunehmen? Es muß auch kein großartiger Check oder so gemacht werden, quasi bräuchte man sowas wie "paint light" oder so. Also einfach ein Feld, wo man (mit dem Finger?) seinen Karl Otto zeichnen kann und dann als Grafik abspeichern. Jemand eine Idee?

    Hab auch schon gegoogelt, aber da finde ich irgendwie nur fertige Apps von Drittanbietern, aber nichts, wie man sowas selbst entwickelt ...


    Gruß,
    Tom

    Ich hab jetzt doch noch was gefunden:
    TouchPaint.java | Android Developers

    Allerdings läuft das erst ab Api Level 9 (2.3.1) und blendet die Linien auch wieder aus. Aber ich denke als Grundlage sollte es genügen, wenn es auch viel mehr macht als ich will ;-)

    Ein einfacheres Beispiel (am besten ab Api Level 4) ist natürlich gerne gesehen :)
     
    Zuletzt von einem Moderator bearbeitet: 26.03.2012
  2. Neeldarax, 14.09.2011 #2
    Neeldarax

    Neeldarax Erfahrener Benutzer

    Beiträge:
    170
    Erhaltene Danke:
    31
    Registriert seit:
    07.12.2010
    Hi Tom299,

    du nimmst eine Klasse leitest diese vom View ab.
    Aktivierst DrawingCache.

    onTouchListener, onClickListener -> fährst du mit dem Finger über den Screen wird mehrmals onTouch ausgelösst, lässte los, onClick.. voila eine Linie mit paar Punkten.

    Methode onDraw(Canvas) überschreiben.
    canvas.drawLine von Punkt zu Punkt .

    Wenne fertig bist, nimmste den Cache und du hast ein Bitmap/Drawable was du als Array abspeichern kannst *g

    Gibt bestimmtt effektive Alternativen, aber diese funktioniert und als Ansatz sollte ja reichen ;)

    regards
     
    Tom299 bedankt sich.
  3. Tom299, 14.09.2011 #3
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Ich habs hinbekommen, hab mich aber dann doch am original Code-Beispiel orientiert, ansonsten müßte ich mir alle gezeichneten Linien merken, was ich aber nicht will usw. :tongue:

    Falls jemand mal sowas in der Art braucht, hier meine kleine Beispiel-App:

    Code:
    package test.de;
    
    import android.app.Activity;
    import android.graphics.Color;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    
    public class Unterschrift extends Activity {
        
        private static final int MENU_CLEAR = Menu.FIRST;
        private static final int MENU_SAVE = Menu.FIRST+1;
        private static final int MENU_LOAD = Menu.FIRST+2;
        
        private DrawView drawView = null;
        
        
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            
            drawView = new DrawView(this);
            drawView.setBackgroundColor(Color.WHITE);
            setContentView(drawView);
            drawView.requestFocus();
        }
        
        @Override public boolean onCreateOptionsMenu(Menu menu) {
            menu.add(0, MENU_CLEAR, 0, "Clear");
            menu.add(0, MENU_SAVE, 0, "Save");
            menu.add(0, MENU_LOAD, 0, "Load");
            return super.onCreateOptionsMenu(menu);
        }
        
        @Override public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
                case MENU_CLEAR:
                    drawView.clearBitmap();
                    return true;
                case MENU_SAVE:
                    drawView.saveBitmap();
                    return true;
                case MENU_LOAD:
                    drawView.loadBitmap();
                    return true;                
                default:
                    return super.onOptionsItemSelected(item);
            }
        }
    }
    
    Code:
    package test.de;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.Bitmap.CompressFormat;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.os.Environment;
    import android.view.MotionEvent;
    import android.view.View;
    
    
    public class DrawView extends View {
    
        private Paint paint = new Paint();
        private float lastX, lastY;
        private boolean drawing = false;
        
        private Bitmap bitmap;
        private Canvas canvas;
    
        
        public DrawView(Context context) {
            super(context);
            setFocusable(true);
            paint.setAntiAlias(true);
            paint.setARGB(255, 255, 255, 255);        
        }
        
        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565);
            canvas = new Canvas(bitmap);
            if (bitmap != null) {
                canvas.drawBitmap(bitmap, 0, 0, null);
            }        
            invalidate();
        }
        
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            
            if (bitmap != null) {
                canvas.drawBitmap(bitmap, 0, 0, null);
            }        
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                drawPoint(event.getX(), event.getY(), event.getPressure());
                return true;
            }
            else if (event.getAction() == MotionEvent.ACTION_UP) {
                drawing = false;
                return true;
            }
            else if (event.getAction() == MotionEvent.ACTION_MOVE) {
                drawing = true;
                drawPoint(event.getX(), event.getY(), event.getPressure());
                return true;            
            }
            
            return false;
        }
        
        private void drawPoint(float x, float y, float pressure) {
            if (bitmap != null) {            
                //int pressureLevel = (int)(pressure * 255);
                //paint.setARGB(pressureLevel, 255, 255, 255);
                paint.setARGB(255, 255, 255, 255);
                if (drawing) {
                    canvas.drawLine(lastX, lastY, x, y, paint);
                }
                else {
                    canvas.drawPoint(x, y, paint);
                }
    
                lastX = x;
                lastY = y;
    
                invalidate();
            }        
        }
        
        public void clearBitmap() {
            if (canvas != null) {
                paint.setARGB(0xff, 0, 0, 0);
                canvas.drawPaint(paint);
                invalidate();
            }
        }
        
        public void saveBitmap() {
            if (bitmap != null) {
                try {
                    String path = Environment.getExternalStorageDirectory() + "/unterschrift/signatures";
                    File dir = new File(path);
                    if (!dir.exists() || !dir.isDirectory()) {
                        dir.mkdirs();
                    }
                    File file = new File(dir.getAbsolutePath() + "/signature.png");
                    FileOutputStream fos;
                    fos = new FileOutputStream(file);
                    bitmap.compress(CompressFormat.PNG, 100, fos);
                    fos.close();                
                } 
                catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
                catch (IOException io) {
                    io.printStackTrace();
                }            
            }
        }
        
        public void loadBitmap() {
            String path = Environment.getExternalStorageDirectory() + "/unterschrift/signatures/signature.png";
            Bitmap bmp = BitmapFactory.decodeFile(path);
            if (bmp != null) {
                if (canvas != null) {
                    canvas.drawBitmap(bmp, 0, 0, null);
                }
                invalidate();
            }
        }
    }
    
    in die manifest noch:
    Code:
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    
    danach sollte man malen, speichern und laden können :thumbup:
     
  4. colt.s, 26.03.2012 #4
    colt.s

    colt.s Neuer Benutzer

    Beiträge:
    3
    Erhaltene Danke:
    0
    Registriert seit:
    29.01.2012
    Hallo Tom,

    super vielen Dank für das Beispiel. Funktioniert einwandfrei und hat mir sehr geholfen!!!!
     

Diese Seite empfehlen