Autore Topic: Non si aggiorna la MapView  (Letto 562 volte)

Offline n3tmaster

  • Utente junior
  • **
  • Post: 96
  • Respect: 0
    • Google+
    • lerocchi
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4 - Nexus 7 - PadFone JB
  • Sistema operativo:
    Mac OSX 10.7
Non si aggiorna la MapView
« il: 11 Aprile 2012, 18:22:16 CEST »
0
Salve a tutti,
vi posto un problema che mi sta facendo dannare non poco... dato che parte da un progetto che sta diventando abbastanza complesso (da non poter essere illustrato interamente in questa sede) tenterò di fare un piccolo preambolo.

Ho creato un activity che estende MapView, e utilizzo una mia classe "CustomView" che estende una ImageView, per poter visualizzare contemporaneamente i dati (spaziali) di una mia fonte, con lo strato informativo proveniente da GoogleMap.
Nella funzione overloaded onDraw creo di fatto l'immagine risultante.

La mia CustomView utilizza due istanze di Bitmap contenenti rispettivamente l'immagine della sorgente 1 e quella relativa alla mia MapView.

Per lanciare l'onDraw utilizzo un altro metodo che ho creato nella mia CustomView e che di fatto salva l'immagine recuperata da MapView.

Questo è il metodo della mia custom view che accetta una Drawable e un valore (1 o -1) che indica se devo posizionare questo strato "sopra" o "sotto" all'altra immagine

Codice (Java): [Seleziona]
       
public void setMapBitmap(Drawable bm, int zDirection){
                bm.setAlpha(10);
                this.zDirection=zDirection;
                //super.setImageBitmap(((BitmapDrawable)bm).getBitmap());
                //salvo lo sfondo per recuperarlo internamente
                sfondoMap=((BitmapDrawable)bm).getBitmap();
                invalidate();
               
        }

mentre qui di seguito vi è la mia onDraw overloaded
Codice (Java): [Seleziona]
@Override
        protected void onDraw(Canvas canvas){
                super.onDraw(canvas);
               
                //sfondoMap è una bitmap che contiene la mappa
                //sfondo è una bitmap che contiene l'altra mia immagine
               //painMap è un oggetto Paint che definisce la modalita di disegno, in particolare ho utilizzato una trasparenza di 180
                        if(zDirection==-1){
                                canvas.drawBitmap(sfondoMap, 0, 0,null);// lo disegno senza trasparenza perché sta in fondo
                                canvas.drawBitmap(sfondo, 0, 0,paintMap);
                        }
                        if(zDirection==1){
                                canvas.drawBitmap(sfondo, 0, 0,null);
                                canvas.drawBitmap(sfondoMap, 0, 0,paintMap);  //lo disegno con la trasparenza perché sta in cima
                        }      
               
               
               
               
        }


Infine questo è il metodo che dalla mia Activity lancia il metodo di disegno della mia CustomView

Codice (Java): [Seleziona]
    private void showMapView(int zDirection){
        MyGeoTools mgt;
                Bitmap miaDrw;
                GeoPoint mioP;
                double[] questoExtent;
             
                //adesso recupero info da gmail
             Log.i("res img",""+imgView.getRight()+" ; "+ imgView.getBottom());
                miaMapView.layout(0, 0, imgView.getRight(), imgView.getBottom());
   
                questoExtent=miaMappa.getExtent(0);
               
/* MyGeoTools è una mia classe che trasforma le coordinate delle mie mappe da Utm32 -datum wgs84 in transverse mercatore di google */
                mgt = new MyGeoTools(32,(questoExtent[0]+questoExtent[2])/2,(questoExtent[1]+questoExtent[3])/2,true);
                mgt.utmToLatLng();
               
                mioP = new GeoPoint((int)(mgt.getLatitude()*1000000),(int)(mgt.getLongitude()*1000000));
       
                mioMVController.setCenter(mioP);
        //zoomLevel è un mio attributo che gestisco per sapere a che livello di zoom sono
                mioMVController.setZoom(zoomLevel);
               
                miaMapView.destroyDrawingCache();
        miaMapView.buildDrawingCache(true);
     
        miaDrw= miaMapView.getDrawingCache(true);
           
               
               
                imgView.setMapBitmap(new BitmapDrawable(miaDrw),zDirection);
    }


Per completezza, nel mio metodo onCreate dell'activity ho le seguenti dichiarazioni
...
...
//API_KEY contiene la mia key per gmap
miaMapView = new MapView(this, API_KEY);
        miaMapView.setDrawingCacheEnabled(true);
       
         miaMapView.setSatellite(false);
        mioMVController=miaMapView.getController();
      miaMapView.destroyDrawingCache();
        miaMapView.buildDrawingCache(true);
...
...
Codice (Java): [Seleziona]
 

dove è che lancio la mia showMapView? semplice: è agganciata ad una voce di menu e ad un altro metodo che gestisce alcuni eventi (pulsanti che faccio premere sulla mia app):

Codice (Java): [Seleziona]
@Override
        public boolean onOptionsItemSelected(MenuItem item) {
                Log.i(LOG_TAG, "onOptionsItemSelected Called!");
       
                switch (item.getItemId()) {
                case Menu.FIRST :
                        Log.i(LOG_TAG,"set satellite");
                       
                        satelliteSelected=!item.isChecked();
                        miaMapView.setSatellite(satelliteSelected);
                        if(subMenu[1].isChecked()){
                                imgView.setMapMode(true);
                                showMapView(1);
                               
                        }else if(subMenu[2].isChecked()){
                                imgView.setMapMode(true);
                                showMapView(-1);
                        }
                        return true;
                       
                case Menu.FIRST +1:

                        Log.i(LOG_TAG,"primo piano");
// QUI CHIAMO IL METODO INCRIMINATO

                        radioSelected=1;
                        imgView.setMapMode(true);
                        showMapView(1);
                       
                        return true;
                       
                case Menu.FIRST + 2:
                        Log.i(LOG_TAG,"secondo piano");
                        radioSelected=2;
                        imgView.setMapMode(true);
                        showMapView(-1);
                       
                        return true;
                       
                case Menu.FIRST + 3:
                        Log.i(LOG_TAG,"no gmap");
                        radioSelected=3;
                        imgView.setMapMode(false);
                        imgView.invalidate();
                       
                        return true;
               
               
                }
                // Importante richiamare l'implementazione padre nel caso
                // di item non gestiti
                return super.onOptionsItemSelected(item);
        }

Bene..il problema è il seguente... finché chiamo la mia showMapView tramite l'evento generato dalla selezione del menu, tutto funziona perfettamente...
mentre se chiamo la mia funzione da un altro evento (la pressione di un pulsante)  l'immagine bitmap che dovrebbe essere "riempita" dalla getDrawingCache di MapView di fatto mi restituisce un immagine "vuota" o non aggiornata (cioè la precedente immagine memorizzata)
come se non avesse fatto la chiamata.... eppure con il debug alla mano vedo che di li ci passa..ma non sortisce alcun effetto e l'unico modo per me di vedere la mappa google aggiornata è quella di chiamare ESPLICITAMENTE la mia voce di menu...

Questo è il codice che lancio quando clicco sul pulsante sopra citato

Codice (Java): [Seleziona]
/*
...
codice che aggiorna le mappe personali
...
*/


//Codice che aggiorna la mappa di google ---- NON FUNZIONA
imgView.setMapMode(true);
                                        showMapView(1);  

       

Capisco che la mia richiesta sia un pò complicata..ma se qualcuno di voi ha già sbattuto il capo su cose di questo tipo magari mi può illuminare..io ho quasi rinunciato a capire...
Leandro Rocchi
Software Developer - Geodatabase Designer