Originariamente inviato da
MarcosMarble
Ciao a tutti ragazzi,
mi sono addentrato da poco nella programmazione con Eclipse e relativo SDK e ho già sviluppato alcune applicazioni di prova.
Ora mi sorge un dubbio al quale non sono riuscito a trovare ancora del codice sorgente o qualche tutorial:
vorrei sviluppare una specie di blocco note dove si può scrivere (un po come fa il rich-note) sia con del testo sia a mano disegnando. L'utente può scegliere in qualsiasi momento se passare dalla modalità testo a quella grafica aggiungendo appunto delle scritte disegnando direttamente sulla nota.
Fino all'inserimento di testo non c'è alcunissimo problema, ma non trovo da nessuna parte del codice per poter in qualche modo permettere all'utente di disegnare sullo schermo e salvare la nota in formato editabile.
Qualcuno può aiutarmi? .-)
Grazie anticipatamente.
Un salutone a tutti
Ciao,
per quanto io abbia implementato il disegno on Touch, posso suggerirti di visionare una CustomView molto carina per disegnare.
A me personalmente ha dato un suggerimento per creare una mia ulteriore CustomView, che utilizzo nella mia applicazione per la firma dei clienti onTouch su dei rapporti di interventi (che poi salvo come .png, encodo in Base64 con destinazione sqlite (in un campo blob), per poi spedire la stringa Base64 ad un Webservice pubblicato da un webserver IIS che la decodifica in Base64 e la memorizza in SQL Server in un campo varbinary).
Questa è la classe della CustomView:
codice:
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
public class MyView extends View {
boolean freeTouched = false;
Path freePath;
Bitmap myCanvasBitmap = null;
Canvas myCanvas = null;
Matrix identityMatrix;
public MyView(Context context) {
super(context);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onDraw(Canvas canvas) {
if(freeTouched){
Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.rgb(50, 50, 50));
paint.setStrokeWidth(10);
myCanvas.drawPath(freePath, paint);
canvas.drawBitmap(myCanvasBitmap, identityMatrix, null);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_UP:
//freeTouched = false;
freeTouched = true;
break;
case MotionEvent.ACTION_DOWN:
freeTouched = true;
freePath = new Path();
freePath.moveTo(event.getX(), event.getY());
//myCanvasBitmap.eraseColor(Color.BLACK);
break;
case MotionEvent.ACTION_MOVE:
freePath.lineTo(event.getX(), event.getY());
invalidate();
break;
}
return true;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int w = MeasureSpec.getSize(widthMeasureSpec);
int h = MeasureSpec.getSize(heightMeasureSpec);
//myCanvasBitmap = Bitmap.createBitmap(w , h/2 , Bitmap.Config.ARGB_8888);
myCanvasBitmap = Bitmap.createBitmap(w , h , Bitmap.Config.ARGB_8888);
myCanvas = new Canvas();
myCanvas.setBitmap(myCanvasBitmap);
//***
identityMatrix = new Matrix();
setMeasuredDimension(w, h);
}
public Bitmap getCanvasBitmap(){
return myCanvasBitmap;
}
}
e questa è la Activity che utilizza la CustomView:
codice:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Calendar;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.os.Bundle;
import android.os.Environment;
import android.view.Display;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View.MeasureSpec;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;
public class Firma extends Activity {
MyView myView;
CharSequence menuSelezionato;
int idMenu;
Calendar c;
String nomeFile, nomeFileUltimaImmagine;
Bundle bundle;
int w,h;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myView = new MyView(this);
myView.setBackgroundColor(Color.WHITE);
setTitle("Al termine, premere il tasto 'back' (freccia indietro) sul tel");
setContentView(myView);
Toast.makeText(Firma.this, "SCHERMO RUOTATO! Firmare in orizzontale lungo secondo la barra superiore!", Toast.LENGTH_LONG).show();
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
menu.add("Salva Firma");
menu.add("Niente");
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
menuSelezionato = item.getTitle();
if (menuSelezionato.equals("Configurazione e Log")) {
idMenu = 0;
} else {
idMenu = 1;
}
switch (idMenu){
case 0:
Bitmap bmp = myView.getCanvasBitmap();
finish();
break;
case 1:
break;
}
return super.onOptionsItemSelected(item);
}
public void onBackPressed(){
Bitmap bmp = myView.getCanvasBitmap();
c = Calendar.getInstance();
//Save in file
String extStorageDirectory = Environment.getExternalStorageDirectory().toString() + "/" + "FirmeChiamate";
OutputStream outStream = null;
nomeFile = "firma_" + c.getTimeInMillis() + "_.png";
File file = new File(extStorageDirectory, nomeFile);
try {
outStream = new FileOutputStream(file);
//bmp.compress(Bitmap.CompressFormat.PNG, 100, outStream);
bmp.compress(Bitmap.CompressFormat.PNG, 100, outStream);
outStream.flush();
outStream.close();
//Toast.makeText(Firma.this, "Firma Salvata: " + extStorageDirectory + "/" + nomeFile, Toast.LENGTH_LONG).show();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(Firma.this, e.toString(), Toast.LENGTH_LONG).show();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(Firma.this, e.toString(), Toast.LENGTH_LONG).show();
}
Intent mIntent = new Intent();
mIntent.putExtra("firma", extStorageDirectory + "/" + nomeFile);
mIntent.putExtra("hoGiaFirmato", "S");
setResult(RESULT_OK, mIntent);
finish();
}
public Bitmap ruotaBitmap(Bitmap pBitmapDaRuotare){
Matrix mat = new Matrix();
mat.postRotate(90);
Bitmap bitmapRuotato = Bitmap.createBitmap(pBitmapDaRuotare, 0, 0, pBitmapDaRuotare.getWidth(), pBitmapDaRuotare.getHeight(), mat, true);
return bitmapRuotato;
}
}
Per completezza, in una precedente Activity poi questo è il metodo di store Base64 in sqlite:
codice:
public void insertFirmaEvento(String pIdEvento, String pIdChiamata, String pFirma){
//***test byte array
try {
//String imageFirma = "/mnt/sdcard/FirmeChiamate/firma_1341605171766_.png";
Bitmap bitmap = BitmapFactory.decodeFile(pFirma);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
String stringaBase64Blob = Base64.encodeToString(stream.toByteArray(), Base64.DEFAULT);
miodb.openToWrite();
miodb.insertFirma(pIdEvento, pIdChiamata, stringaBase64Blob);
miodb.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//*** fine test byte array
}
A parte i metodi per ruotare il Bmp (lo schermo va in landscape durante la firma, per poi tornare portrait) e quelli per la storicizzazione in /sdcard (appoggio) e in db sqlite (blob Base64),
spero che queste indicazioni possano aiutarti per iniziare.
Ciao!