Visualizzazione stampabile
-
Disegnare con Android
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
-
Quote:
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!
-
Grazie mille, mi cimenterò in questa impresa..
alla fine vorrei semplicemente realizare una sorta di blocco note in cui si può mettere qualsiasi cosa, dal semplice carattere utilizzando i font di sistema, passando per le checklist e appunto disegni a mano libera... spero di riuscire a realizzare qualcosa di carino e pratico. ;)
Ancora Grazie e Un salutone.
-
Quote:
Originariamente inviato da
frank17next
...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
Che Black Bordel! :D :D
-
Quote:
Originariamente inviato da
TheCopacabanaMan
Che Black Bordel! :D :D
Ahah, non me ne parlare... Non ho trovato di meglio (al netto del mero scambio file) psr far parlare android con il 'mondo microsoft: windows+iis+sql server...
C'ho perso in salute ma almeno funge come 1 orologio :)
Inviato dal mio GT-N7000 con Tapatalk 2