Bonjour,
Je développe une application de réalité augmentée. Le principe : La caméra se lance en fond et j'y superpose des marqueurs correspondants à des lieux en fonction de leur coordonnées GPS.
Par exemple, si je lance l'application et que je dirige la caméra du téléphone vers un bâtiment dont j'ai les coordonnées GPS, un marqueur s'affichera au niveau du bâtiment et suivra celui-ci lorsque je bougerai le téléphone.
Le problème, c'est qu'il y a parfois plusieurs marqueurs superposés, par exemple si des bâtiments se trouvent l'un derrière l'autre.
Je voudrais donc réussir à afficher les marqueurs les uns en dessous des autres s'ils se superposent.
J'ai essayé avec un RelativeLayout superposé à ma vue de caméra, mais ça ne change rien.
Voici le code de création des marqueurs :
Et la partie où je déplace mes marqueurs :
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 @Override public void onResume() { super.onResume(); for(int j=0;j<markers.length;j++) { //System.out.println(prefMarkers[j]); if(markers[j] == null) { RelativeLayout.LayoutParams rParams = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); markers = new DataList(); // Ma liste de marqueurs for(int i=0; i<markers.size();i++) { markers[i].setOnClickListener(clickListener); //addContentView(markers[j].get(i), params); relative.addView(markers[j].get(i), rParams); } } }}}
Je m'y prend sans doute pas de la bonne manière, mais voyez-vous comment je pourrais faire ?
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
32 public final static void moveSpot(Context c, View tv, GeoPoint p, float azimut, Location me, int screenWidth, float roll, int screenHeight, float pitch) { int angle = // Calculs RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams( FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT); lp.leftMargin = -angle * screenWidth / 90; lp.addRule(RelativeLayout.ABOVE); tv.setLayoutParams(lp); } public SensorEventListener createListener() { return new SensorEventListener() { public void onAccuracyChanged(Sensor _sensor, int _accuracy) { } public void onSensorChanged(SensorEvent evt) { if (evt.sensor.getType() == Sensor.TYPE_ORIENTATION && markers != null) { for(int j=0;j<markers.length;j++) moveSpot(context, markers[i], markers[i] .getGeoPoint(), azimut, myLoc, mScreenWidth, roll, mScreenHeight, pitch); } }; }
Merci d'avance,
Aenur56
Partager