Salve. Sto cercando di disegnare un'immagine Bitmap su un canvas più alto di un tot. Questo perché devo poter condividere l'immagine su facebook dove sotto mostra delle informazioni aggiuntive (che vado a scrivere io sul canvas). Diciamo un po come quelle immagini di quelle applicazioni che mostrano il percorso svolto e sotto ci sono dati come km, calorie ecc.
1) Ottengo la mia Bitmap (catturo l'immagine dello schermo Android) e la salvo nel telefono.
2) Passo la bitmap al metodo che dovrebbe le opportune modifiche
3) Salvo il risultato nel telefono (sovrascrivo la bitmap originale in sostanza)
4) Avvio l'Intent per la condivisione
Codice:
codice:
public void shareTrack(View v) {
if(NOTHING) {
return;
}
// sposta la visuale sul tracciato e visualizza lo start
// nascondo i markers centrali
if(PATH_MARKERS) {
for (int i = 1; i < mMarkersList.size() - 1; i++) {
mMarkersList.get(i).setVisible(false);
}
}
// cattura e salva l'immagine della mappa
CaptureMapScreen();
// crea e salva nel telefono l'immagine catturata della mappa
File file = new File("/mnt/sdcard/" + "MyMapScreen" + ".png");
// crea il bitmap a partire dall'immagine della mappa aggiungendo
// informazioni varie
Bitmap bitmap = drawTextToBitmap(file);
// salva il risultato nel telefono
try {
FileOutputStream out = new FileOutputStream("/mnt/sdcard/"
+ "MyMapScreen" + ".png"); // era MyNewMapScreen
bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
out.flush();
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//I create the new file for the share
File shareFile = new File("/mnt/sdcard/"
+ "MyMapScreen" + ".png"); // era MyNewMapScreen
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("image/png");
shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(shareFile));
startActivity(Intent.createChooser(shareIntent, "Share"));
//Ripristino la visibilità dei Markers
if(PATH_MARKERS) {
for (int i = 1; i < mMarkersList.size() - 1; i++) {
mMarkersList.get(i).setVisible(true);
}
}
}
codice:
private Bitmap drawTextToBitmap(File file) {
try {
// ottengo la densità dello schermo
Resources resources = getResources();
float scale = resources.getDisplayMetrics().density;
Bitmap bitmap = BitmapFactory.decodeFile(file.getPath());
android.graphics.Bitmap.Config bitmapConfig = bitmap.getConfig();
// default bitmap
if(bitmapConfig == null) {
bitmapConfig = android.graphics.Bitmap.Config.ARGB_8888;
}
// le bitmaps sono immutabili
// allora è necessario convertirle in mutabili
// bitmap mappa
bitmap = bitmap.copy(bitmapConfig, true);
// colore sfondo
Paint backgroundPaint = new Paint();
backgroundPaint.setColor(Color.parseColor("#DDDDDD"));
// creo la bitmap per lo sfondo, più alto di 200 pixel rispetto all'immagine della mappa catturata
Bitmap bg = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight() + 200, Bitmap.Config.ARGB_8888);
// rendo mutabile la bitmap
bg = bg.copy(bitmapConfig, true);
// creo il canvas su cui disegnare
Canvas canvas = new Canvas(bg);
// disegno un rettangolo sul canvas alla quale applico un colore grigio molto chiaro
canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), backgroundPaint);
// disegno l'immagine della mappa sul canvas
canvas.drawBitmap(bitmap, 0, 0, null);
// oggetto paint con antialiasing per il testo
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
// text color (in base al tipo di mappa impostata)
if(mapType == GoogleMap.MAP_TYPE_NORMAL || mapType == GoogleMap.MAP_TYPE_NONE
|| mapType == GoogleMap.MAP_TYPE_TERRAIN) {
paint.setColor(Color.BLACK);
}
if(mapType == GoogleMap.MAP_TYPE_HYBRID || mapType == GoogleMap.MAP_TYPE_SATELLITE) {
paint.setColor(Color.WHITE);
}
// dimensioni del testo in pixel
paint.setTextSize((int) (20 * scale));
// text shadow (raggio, inclinazione sinistra, inclinazione destra, colore)
paint.setShadowLayer(20, 0, 0, Color.RED);
// font
Typeface tf = Typeface.createFromAsset(getAssets(),"my_font.ttf");
paint.setTypeface(tf);
// draw text to the Canvas center
Rect bounds = new Rect();
// ROBA DOVE SCRIVO COSE
return bitmap;
} catch (Exception e) {
return null;
}
}
La bitmap risultate sembra essere null, poiché ottengo NullPointerException a questa riga:
codice:
bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
O comunque ottengo la stessa eccezione se metto una stampa di Log della Bitmap prima di
salvarla nel telefono.