Problème de marqueurs GPS

Icone blanche

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

Après moult essais et recherche sur internet je ne parviens pas à résoudre un problème d'affichage d'icône sur des marqueurs intégrés dans une Google Map.

En effet, au début j'ai mes 4 marqueurs verts (P7) qui s'affiche près de ma position GPS, quand c'est mis à jour j'ai bien le marqueur le plus proche qui devient jaune (P6), mais après un certains temps 3 marqueurs sur les 4 obtiennent une icône toute blanche de la même taille que l'image qu'ils devraient avoir mais sous forme de carré blanc unis en l'occurence.

Je n'arrives pas à déterminer le problème.

Voici mon code source afin que vous puissiez m'aider :

  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
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
package com.niko300.defibrilateur;


import android.support.v4.app.FragmentManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.InflateException;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import android.location.LocationListener;
import android.widget.TextView;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptor;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

import java.util.ArrayList;

/**
 * Created by Nicolas on 28/04/2016.
 */
public class Fragment1 extends Fragment implements OnMapReadyCallback, GoogleMap.OnCameraChangeListener {

    static final String TAG = "Fragment1_defibrilateur";
    private GoogleMap mMap;
    public double longitude = 0D;
    public double latitude = 0D;
    LatLng p0 = new LatLng(0D, 0D);
    Context contexte;
    private static View rootView;
    private static boolean isAlreadyMarked = false;
    Marker marqueurPrincipal;
    ArrayList<Marker> listeMarqueurs = new ArrayList<Marker>();
    TextView texteRemarque;
    TextView texteNbrDef;
    int cptMarqueurs = 0;
    Marker marqueurLePlusProche;
    Marker marqueurLeMoinsProche;
    public static ArrayList<Double> longitudeMarqueur = new ArrayList<Double>();
    public static ArrayList<Double> latitudeMarqueur = new ArrayList<Double>();
    public double longitudeDeBase = 0;
    public double latitudeDeBase = 0;
    public ArrayList<Float> listeDistances = new ArrayList<Float>();

    public BitmapDescriptor iconeP6;
    public BitmapDescriptor iconeP7;


    // newInstance constructor for creating fragment with arguments
    public Fragment1() {


    }

    // Store instance variables based on arguments passed
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        contexte = this.getContext();

        MapsInitializer.initialize(contexte);

        iconeP6 = BitmapDescriptorFactory.fromResource(R.drawable.p6);
        iconeP7 = BitmapDescriptorFactory.fromResource(R.drawable.p7);

        final LocationListener locationListener = new LocationListener() {
            public void onLocationChanged(Location location) {
                longitude = location.getLongitude();
                latitude = location.getLatitude();
                p0 = new LatLng(latitude, longitude);
                float positionAbsolueMin = 9999999F;

                Location loc1 = new Location(LocationManager.GPS_PROVIDER);
                Location loc2 = new Location(LocationManager.GPS_PROVIDER);

                loc1.setLongitude(longitude);
                loc1.setLatitude(latitude);

                if (!isAlreadyMarked)
                {
                    longitudeDeBase = longitude;
                    latitudeDeBase = latitude;

                    isAlreadyMarked = true;

                    marqueurPrincipal = mMap.addMarker(new MarkerOptions().position(p0).title("Ma position"));

                    mMap.moveCamera(CameraUpdateFactory.newLatLng(p0));
                    mMap.moveCamera(CameraUpdateFactory.zoomTo(16.2F));

                    longitudeMarqueur.add(longitude+0.0005D);
                    latitudeMarqueur.add(latitude-0.0005D);

                    Marker marqueur1 = mMap.addMarker(new MarkerOptions()
                            .position(new LatLng(latitudeMarqueur.get(latitudeMarqueur.size()-1),longitudeMarqueur.get(longitudeMarqueur.size()-1) ))
                            .title("Point 1")
                            .icon(iconeP7));

                    marqueurLeMoinsProche = marqueur1;

                    cptMarqueurs++;
                    listeDistances.add(0F);
                    listeMarqueurs.add(marqueur1);

                    longitudeMarqueur.add(longitude-0.0005D);
                    latitudeMarqueur.add(latitude+0.0005D);

                    Marker marqueur2 = mMap.addMarker(new MarkerOptions()
                            .position(new LatLng(latitudeMarqueur.get(latitudeMarqueur.size()-1),longitudeMarqueur.get(longitudeMarqueur.size()-1) ))
                            .title("Point 2")
                            .icon(iconeP7));
                    cptMarqueurs++;
                    listeDistances.add(0F);
                    listeMarqueurs.add(marqueur2);

                    longitudeMarqueur.add(longitude+0.0004D);
                    latitudeMarqueur.add(latitude+0.0004D);

                    Marker marqueur3 = mMap.addMarker(new MarkerOptions()
                            .position(new LatLng(latitudeMarqueur.get(latitudeMarqueur.size()-1),longitudeMarqueur.get(longitudeMarqueur.size()-1) ))
                            .title("Point 3")
                            .icon(iconeP7));
                    cptMarqueurs++;
                    listeDistances.add(0F);
                    listeMarqueurs.add(marqueur3);

                    longitudeMarqueur.add(longitude-0.0005D);
                    latitudeMarqueur.add(latitude-0.0005D);

                    Marker marqueur4 = mMap.addMarker(new MarkerOptions()
                            .position(new LatLng(latitudeMarqueur.get(latitudeMarqueur.size()-1),longitudeMarqueur.get(longitudeMarqueur.size()-1) ))
                            .title("Point 4")
                            .icon(iconeP7));
                    cptMarqueurs++;
                    listeDistances.add(0F);
                    listeMarqueurs.add(marqueur4);

                    texteRemarque.setText("Localisation trouvée !");


                }
                else
                {

                    for (int i = 0; i < latitudeMarqueur.size() - 1; i++)
                    {
                        loc2.setLongitude(longitudeMarqueur.get(i));
                        loc2.setLatitude(latitudeMarqueur.get(i));
                        listeDistances.set(i, loc1.distanceTo(loc2));
                    }



                    marqueurPrincipal.setPosition(p0);
                    texteNbrDef.setText(cptMarqueurs+"");
                    positionAbsolueMin = 9999999F;

                    for (int i = 0; i < latitudeMarqueur.size() - 1; i++)
                    {

                        if (listeDistances.get(i) < positionAbsolueMin)
                        {
                            marqueurLePlusProche = listeMarqueurs.get(i);
                            positionAbsolueMin = listeDistances.get(i);
                        }

                    }


                    marqueurLeMoinsProche.setIcon(iconeP7);
                    marqueurLePlusProche.setIcon(iconeP6);
                    marqueurLeMoinsProche = marqueurLePlusProche;
                }

            }



            @Override
            public void onStatusChanged(String s, int i, Bundle bundle) {

            }

            @Override
            public void onProviderEnabled(String s) {

            }

            @Override
            public void onProviderDisabled(String s) {

            }
        };

        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        LocationManager lm = (LocationManager) contexte.getSystemService(Context.LOCATION_SERVICE);

        if (ActivityCompat.checkSelfPermission(contexte, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(contexte, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

        }
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, (long) 2000, (float) 10, locationListener);

        //}

    }

    // Inflate the view for the fragment based on layout XML
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {



        //View view = inflater.inflate(R.layout.layout_fragment1, container, false);


        if (rootView != null) {
            ViewGroup parent = (ViewGroup) rootView.getParent();
            if (parent != null)
                parent.removeView(rootView);
        }
        try {
            rootView = inflater.inflate(R.layout.layout_fragment1, container, false);
        } catch (InflateException e) {
        /* map is already there, just return view as it is  */
        }

        texteRemarque = (TextView) rootView.findViewById(R.id.txtRemarque);
        texteNbrDef = (TextView) rootView.findViewById(R.id.txtNbrDef);

        mMap = getMapFragment().getMap();
        mMap.setOnCameraChangeListener(getCameraChangeListener());


        return rootView;

    }

    @Override
    public void onMapReady(GoogleMap googleMap) {


    }

    private SupportMapFragment getMapFragment() {
        FragmentManager fm = null;

        Log.d(TAG, "sdk: " + Build.VERSION.SDK_INT);
        Log.d(TAG, "release: " + Build.VERSION.RELEASE);

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            Log.d(TAG, "using getFragmentManager");
            fm = getFragmentManager();
        } else {
            Log.d(TAG, "using getChildFragmentManager");
            fm = getChildFragmentManager();
        }

        return (SupportMapFragment) fm.findFragmentById(R.id.map);
    }

    @Override
    public void onCameraChange(CameraPosition cameraPosition) {


    }

    public GoogleMap.OnCameraChangeListener getCameraChangeListener()
    {
        return new GoogleMap.OnCameraChangeListener()
        {
            @Override
            public void onCameraChange(CameraPosition cameraPosition)
            {
                final CameraPosition camPos = cameraPosition;

                getActivity().runOnUiThread(new Runnable() {
                    public void run() {
                        //texteZoom.setText("Niveau de zoom : " + camPos.zoom);
                    }
                });
            }
        };
    }


}

Merci d'avance pour votre aide ;)

PS : Au passage, ce site est super bien conçu, je suis nouveau et je le trouves vraiment cool ! Bravo aux devs !

Tu as un peu plus d'infos sur ce que tu as déjà investigué et sur ce que tu penses être la source de ton problème. Car là, on a juste le problème + un nombre conséquent de lignes de code. Personnellement, ça ne me motive pas trop pour aider…

+0 -0
Auteur du sujet

J'ajoute des marqueurs au fur et à mesure en dur dans une liste de marqueurs. Ensuite une fois qu'ils sont placés sur la carte, la méthode est ré-appelé par l'événement de changement de position du dispositif. Ca passe dorénavant toujours dans le else et dans ce else j'enregistre toutes les distances entre mon dispositif et chacun des marqueurs puis je passe en revue ces distances et j'obtient la plus petite distance dont je met le marqueur associé dans "marqueurLePlusProche" ensuite j'attribue les bonnes icones le plus proche a l'icone jaune et le précédent devient vert.

Le problème se situe dans ce bloc de code :

 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
32
33
34
else
                {

                    for (int i = 0; i < latitudeMarqueur.size() - 1; i++)
                    {
                        loc2.setLongitude(longitudeMarqueur.get(i));
                        loc2.setLatitude(latitudeMarqueur.get(i));
                        listeDistances.set(i, loc1.distanceTo(loc2));
                    }



                    marqueurPrincipal.setPosition(p0);
                    texteNbrDef.setText(cptMarqueurs+"");
                    positionAbsolueMin = 9999999F;

                    for (int i = 0; i < latitudeMarqueur.size() - 1; i++)
                    {

                        if (listeDistances.get(i) < positionAbsolueMin)
                        {
                            marqueurLePlusProche = listeMarqueurs.get(i);
                            positionAbsolueMin = listeDistances.get(i);
                        }

                    }


                    marqueurLeMoinsProche.setIcon(iconeP7);
                    marqueurLePlusProche.setIcon(iconeP6);
                    marqueurLeMoinsProche = marqueurLePlusProche;
                }

            }

Plus précisément à ce niveau :

1
2
3
                    marqueurLeMoinsProche.setIcon(iconeP7);
                    marqueurLePlusProche.setIcon(iconeP6);
                    marqueurLeMoinsProche = marqueurLePlusProche;

Édité par Niko300

Cette réponse a aidé l'auteur du sujet

Salut Niko300,

Ca fait quelques temps que j'ai repéré ton post et que j'aimerai faire un essai de ton code et essayer de t'aider avec l'envie de tester les dernières versions de android studio, la preview d'android N etc…mais je n'arrive pas du tout à me dégager un peu de temps. En plus j'ai bientôt un gros chantier au boulot sur Google Maps sur Android, du coup ça ne me fera pas de mal de pratiquer un peu :)

+1 -0

Cette réponse a aidé l'auteur du sujet

Bon, j'ai enfin eu le temps de me pencher sur ton problème. La réponse assez simple : C'est un bug de google maps Issue 9765: Bug: setIcon(With resource id) on marker outside view makes the marker white. Histoire de cache mal géré ou un truc du genre, je n'ai pas regardé dans le détail.

La recommandation de Google en attendant une correction

We can repro this bug which causes certain marker icons to render as white patches. Your app may be affected if an icon bitmap is shared among multiple markers, although the issue only manifests in specific usage scenarios.

In the short term, we'd recommend the workaround in #8 – use a unique Bitmap object for each marker:

marker.setIcon(BitmapDescriptorFactory.fromBitmap( BitmapFactory.decodeResource(getResources(), R.drawable.drawableid)));

and

new MarkerOptions().icon(BitmapDescriptorFactory.fromBitmap( BitmapFactory.decodeResource(getResources(), R.drawable.drawableid)));

Creating a BitmapDescriptor once and reusing it won’t be sufficient. E.g. if you’re doing:

BitmapDescriptor bd = …; marker1.setIcon(bd); marker2.setIcon(bd);

…then the workaround would be:

marker1.setIcon(BitmapDescriptorFactory.fromBitmap( BitmapFactory.decodeResource(getResources(), R.drawable.drawableid))); marker2.setIcon(BitmapDescriptorFactory.fromBitmap( BitmapFactory.decodeResource(getResources(), R.drawable.drawableid)));

Please note that, if your app uses a lot of markers, this workaround could possibly result in higher memory consumption. Also, unfortunately the workaround doesn’t apply when the default icon is used via BitmapDescriptorFactory.defaultMarker().

Le code à modifier

marqueurLePlusProche.setIcon(iconeP6);

par

marqueurLePlusProche.setIcon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.p7)));

Le seul inconvégnant de ce hack est qu'on stocke en mémoire une nouvelle instance de l'icone pour chaque Marker affiché. Dans ton cas ça ne posera pas de problème, mais si tu veux afficher un grand nombre de marker, il faudra y faire attention. Une autre solution peut aussi être de downgrader play-services à une version antérieure.

Remarque code clean / norme java / refactoring

Quelques remarques concernant ton code car j'ai eu beaucoup de mal à le lire et rentrer dedans :

  • Utiliser les conventions de nommages et de présentation de Java
  • Éviter un trop grand nombre de sauts de ligne entre 2 méthodes ou 2 instructions
  • Ne pas mélanger français et anglais pour le nom des méthodes et variables (généralement le tout anglais est recommandé)
  • Refactoriser quand ça devient trop verbeux, trop long ou illisible

J'ai lu un excellent livre à ce sujet, que tu trouveras en anglais ou en français et qui ma vraiment amené à un autre niveau d'attention et de pensé concernant le coder propre : Coder proprement Robert C. MARTIN

Compatibilité Android Marshmallow (API >= 23)

J'avais un crash au lancement de l'application avec Marshmallow concernant les demandes d'autorisations qui sont maintenant demandées au lancement de l'app. Il y avait ça dans ton code (le if était vide c'est bizarre):

1
2
3
4
5
6
7
8
        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        LocationManager lm = (LocationManager) contexte.getSystemService(Context.LOCATION_SERVICE);

        if (ActivityCompat.checkSelfPermission(contexte, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(contexte, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

        }
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, (long) 500, (float) 0, locationListener);

que j'ai remplacé par ça :

1
2
3
4
5
6
        if (canAccessLocation() && canAccessCoarseLocation()) {
            LocationManager lm = (LocationManager) contexte.getSystemService(Context.LOCATION_SERVICE);
            lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 500, 0, locationListener);
        } else {
            Toast.makeText(getContext(), "Error permissions", Toast.LENGTH_LONG).show();
        }

et ci-dessous les méthodes canAccessLocation() et canAccessCoarseLocation() qui permet de faire un bel exemple de refactoring permettant de supprimer du code redondant et d'augmenter sa lecture/compréhension

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
    private boolean canAccessLocation() {
        return(hasPermission(Manifest.permission.ACCESS_FINE_LOCATION));
    }

    private boolean canAccessCoarseLocation() {
        return(hasPermission(Manifest.permission.ACCESS_COARSE_LOCATION));
    }


    private boolean hasPermission(String perm) {
        return(PackageManager.PERMISSION_GRANTED==ActivityCompat.checkSelfPermission(contexte, perm));
    }
+1 -0
Auteur du sujet

Merci beaucoup ! Je ne m'attendais pas à une réponse aussi précise depuis tout le temps que j'ai posté ce problème (il y a 2 mois sur le SDZ et quasiment 1 mois sur ZDS).

Convention de nommage ? Je suis d'accord que j'abuse des noms de méthodes franglais, c'est une mauvaise habitude que j'ai prise. Mais je fait toujours en sorte d'écrire les noms de méthodes et de variables en Camel Casse. Les sauts de lignes inutiles, c'est une autre mauvaise habitude que j'ai quand je suis en plein développement d'un nouveau truc que j'ai jamais fait et que je veux avoir des points de repère pour isoler des parties de code importantes. Le If vide c'est parce que Android Studio voulait absolument le If pour la compatibilité Android 6 et que quand je mettais l'instruction dans le If ça ne marchais pas et que je voulais absolument tester si mon programme marchais pour avoir un POC mais je penses avoir bêtement inversé la condition donc il ne rentrais jamais dedans si j'ai bien compris. Bien entendu je vais tenir compte de tes précieux conseils et mes justifications ne sont là que pour donner une explication à ce qui m'a amené à ces mauvaises pratiques.

Merci encore ;)

Edit : La condition pour Marshmallow n'est pas acceptée par Android Studio sous forme d'appel de méthodes, je l'ai reformulée de A à Z.

Édité par Niko300

Héhé, content d'avoir pu t'aider :). La prochaine fois si tu veux avoir plus de réponses, explique un peu plus le contexte, le fonctionnement de ton app, ce que tu essaies de faire, et une ou deux images qui montrent le problème, ça motive souvent les gens un peu plus et tu auras une réponse sous moins de 2 mois :D.

Je vois que tu as l'air d'être conscient des mauvaises habitudes de code que tu à prises, si tu es motivé pour les corriger et bien plus encore, je te conseil vraiment le livre dont j'ai parlé plus haut, Coder proprement !

Bizarre que ça ne marche pas ce que j'ai fait pour le support de marshmallow, ça marchait bien chez moi. Tu as bien pensé à augmenter ton projet en API 23 dans le fichier de config gradle ?

+0 -0
Auteur du sujet

Non je n'ai pas augmenté l'API, je pensais que c'était déjà en API 23 étant donné qu'il m'indique que je dois tester la condition. Je n'hésiterai pas à revenir vers toi pour d'autres problèmes concernant Android. Je dois migrer toutes mes app Android d'Eclipse vers Android Studio dans un premier temps.

Merci pour la référence biblique :)

Édité par Niko300

Auteur du sujet

Je bute maintenant immédiatement sur un autre problème qui me parait difficile à régler mais qui est simpliste en soit. En fait, je voudrais réduire la taille des marqueurs au de-zoom et au fur et à mesure les agrandir jusqu'à leur taille normale quand le zoom est au max. Le problème c'est qu'il n'y a pas de propriété "taille" pour les marqueurs et qu'il n'y a même pas de méthode getIcon() sur les marqueurs… :'(

Je penses avoir trouvé la solution : http://stackoverflow.com/questions/14851641/change-marker-size-in-google-maps-api-v2

Édité par Niko300

Généralement ce qui est fait c'est plutôt d'utiliser des cluster (regroupement de markers).

Mais sinon tu peux aussi faire un scale sur tes Bitmap et les re-afficher. Ou créer des bitmaps de différentes tailles dans tes ressources et suivant le degré de zoom tu utilises la taille adaptée.

+0 -0
Auteur du sujet

J'y ai pensé pour l'histoire de prévoir plusieurs tailles dans mes ressources mais le problème c'est que je n'ai aucune méthode qui me donne l'icone courante du marqueur et donc impossible de lui réattribuer une icone d'une autre taille mais de la bonne couleur… En plus c'est fastidieux, il me faudrait environ 20 tailles différentes pour les 6 couleurs existantes.

Auteur du sujet

Finalement j'ai trouvé une méthode qui "fonctionne" et que je lance à chaque changement de zoom :

1
2
3
4
5
                for (int i = 0; i < listeMarqueurs.size(); i++)
                {
listeMarqueurs.get(i).setIcon(BitmapDescriptorFactory.fromBitmap(scaleImage(getResources(), R.drawable.p2,(int)(mMap.getMaxZoomLevel() / camPos.zoom))));
                        listeMarqueurs.get(i).setAnchor(0.5F,0.5F);
                }

La méthode que j'ai trouvé sur "stack overflow" est la suivante :

 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
private Bitmap scaleImage(Resources res, int id, int lessSideSize) {
        Bitmap b = null;
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;

        BitmapFactory.decodeResource(res, id, o);

        float sc = 0.0f;
        int scale = 1;
        // if image height is greater than width
        if (o.outHeight > o.outWidth) {
            sc = o.outHeight / lessSideSize;
            scale = Math.round(sc);
        }
        // if image width is greater than height
        else {
            sc = o.outWidth / lessSideSize;
            scale = Math.round(sc);
        }

        // Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        b = BitmapFactory.decodeResource(res, id, o2);
        return b;
    }

Le but est de fournir à cette méthode comme valeur de facteur taille : La taille de zoom maximum divisée par le zoom actuel. Cette valeur si j'ai bien compris, permet de diviser la valeur de base pour la largeur et la longueur. Donc logiquement si mon niveau de zoom est de "1" (carte complètement dézoomée), je divise le zoom total possible, par exemple "20" par "1", ce qui me donne 20 et je divise donc la taille de mon icône par 20 et l'icône en dézoomée doit être toute petite. Si je suis au niveau de zoom maximum, par exemple "20", 20 / 20 = 1 donc je divise la taille de mon icône par 1, autrement dit elle reste de sa taille normale pour le zoom maximum.

Sauf que le problème c'est que la taille des icônes fait toujours à peu près 1 pixel et ce peu importe le niveau de zoom…

Pouvez-vous m'aider ?

Auteur du sujet

Apparemment il fallait fournir un pourcentage de taille (100% étant la taille de base) J'ai donc fait les modifs et j'ai appelé cette nouvelle méthode pour toutes mes attributions d'icônes mais maintenant j'ai des clignotements à chaque changement de Camera laissant apparaitre de temps en temps plusieurs autres marqueurs jaune (indiquant le plus proche).

Pouvez-vous m'aider ?

Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte