Bonjour,

Je développe actuellement une petite application utilisant des BitMap "mappables", de manière à faire un peu comme la balise html <map>. Pour cela, j'utilise le widget ImageMap disponible ici.

Les images que je charge sont stockées dans les ressources mais sont assez lourdes (1920x1080, ce qui en BitMap doit faire 8Mo par image). J'aimerai donc pouvoir à chaque changement d'activité, forcer la libération de la mémoire, afin de pouvoir utiliser une autre image et éviter l'exception OutOfMemory. Par exemple, l'application fonctionne bien sur mon Galaxy ace 2 mais sur un émulateur de nexus 7 avec "VM Heap" = 32, ça plante ! Je pense qu'utiliser plusieurs tailles d'images dans les ressources améliorera cela, mais je voudrais faire mieux et être sur à 100% de ne pas déclencher cette exception.

J'ai donc pensé à utiliser la méthode recycle() sur les bitmaps de la classe ImageMap, que j'appelle dans onPause(), dans le but de recharger l'image dans onResume(). Ça ne plante plus mais lorsque'on utilise le bouton de retour arrière, l'image n’apparaît plus. J'ai comme l'impression que ça supprime la ressource de la mémoire.

Voici le code de mon activité, l'idée est ici de lancer une activité selon la zone ou l'on clique sur l'image :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class TerreActivity extends Activity {
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_terre);
 
        // On définit une image avec zones cliquables
        ImageMap mImageMap = (ImageMap) findViewById(R.id.map);
 
        // On détecte les clics sur l'image
        mImageMap.addOnImageMapClickedHandler(new ImageMap.OnImageMapClickedHandler() {
            @Override
            public void onImageMapClicked(int id) {
                            	Toast T = null;
            	switch (id) {
            		case R.id.Europe :
            			Intent intent = new Intent(TerreActivity.this, EuropeActivity.class);
                  		startActivity(intent);
        				break;
					...
					...
            	}            	
            }
 
            @Override
            public void onBubbleClicked(int id) {
            }
        });
    }       
}
Le fichier xml activity_terre contient ce widget :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
<com.bibi.voyageur.ImageMap 
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/carte_terre"
        maps:map="carte_terre"/>
Ici, la ressource carte_terre est l'image à mapper.
maps:map="carte_terre" indique le nom du fichier xml contenant les coordonnées des zones cliquables.

J'espère que quelqu'un d'entre vous aura la solution à mon problème

Merci d'avance =)