Unterschriften-Feld

T

Tom299

Stammgast
122
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 bearbeitet von einem Moderator:
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
 
  • Danke
Reaktionen: Tom299
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:
 
Hallo Tom,

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

Ähnliche Themen

H
  • HoustonWeHaveAProblem
Antworten
18
Aufrufe
978
jogimuc
J
E
Antworten
4
Aufrufe
765
enrem
E
H
Antworten
1
Aufrufe
962
Jaiel
Jaiel
Zurück
Oben Unten