Après avoir passé toute la journée dans le Rnd et l'essai de quelques solutions de rechange j'ai trouvé des solution finale. En fait, j'ai trouvé deux solutions pour un même problème, mais je voudrais suggérer l'utilisation de la Variante 2 parce que c'est vraiment très facile de comparer à la Variante 1.
En fait, j'ai trouvé la Variante 1 avec l'aide de TheLittleNaruto , AndroidHacker et quelques autres développeurs et la Variante 2 avec l'aide de Khan merci donc à tous.
Alternative 1
Comment Dessiner Gratuitement style de polygone dans la Carte V2 (que l'on peut faire avec la Carte V1) ? Est-il possible dans la Carte V2 ?
Oui,C'est faisable, mais vous ne pouvez pas obtenir directement OnTouch() & OnDraw()
sur la carte.Donc, Nous devons avoir à penser à une autre façon d'atteindre cet objectif.
Est-il une astuce ou une alternative à réaliser cette chose , si oui comment ?
Oui, Google Map V2 n'est pas supprot sur Touch() or OnDraw()
sur la Carte à l'aide de class="com.google.android.gms.maps.SupportMapFragment"
nous avons donc de prévoir un certain custom Fragment.
Est-il possible avec d'événement tactile qui renvoient tableau de lat-long ?
Oui, si nous créons sur mesure fragment de carte et de l'aide que nous pouvons les Toucher ou de l'événement Glisser sur la carte.
Comment puis-je obtenir Lat-long de la base sur les coordonnées d'écran sur setOnDragListener ?
setOnDragListener
sera de retour à l'écran des coordonnées (x,y) et Maintenant il y a une certaine technique pour convertir (x,y) pour LatLng et qui est appelée Projection et, du même Point & LatLng.
customMapFragment.setOnDragListener(new MapWrapperLayout.OnDragListener() {@Override
public void onDrag(MotionEvent motionEvent) {
Log.i("ON_DRAG", "X:" + String.valueOf(motionEvent.getX()));
Log.i("ON_DRAG", "Y:" + String.valueOf(motionEvent.getY()));
float x = motionEvent.getX(); // get screen x position or coordinate
float y = motionEvent.getY(); // get screen y position or coordinate
int x_co = Integer.parseInt(String.valueOf(Math.round(x))); // casting float to int
int y_co = Integer.parseInt(String.valueOf(Math.round(y))); // casting float to int
projection = mMap.getProjection(); // Will convert your x,y to LatLng
Point x_y_points = new Point(x_co, y_co);// accept int x,y value
LatLng latLng = mMap.getProjection().fromScreenLocation(x_y_points); // convert x,y to LatLng
latitude = latLng.latitude; // your latitude
longitude = latLng.longitude; // your longitude
Log.i("ON_DRAG", "lat:" + latitude);
Log.i("ON_DRAG", "long:" + longitude);
// Handle motion event:
}
});
Comment sa fonctionne ?
Comme je l'ai déjà dit que nous devrions avoir à créer de la coutume, de la racine de la vue et de l'aide que nous pouvons obtenir Touchez ou faites Glisser Même sur la carte.
Étape : 1 nous créons MySupportMapFragment extends SupportMapFragment
et nous allons l'utiliser comme sortie de fichier xml ,
<fragment
android:id="@+id/map"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
class="pkg_name.MySupportMapFragment" />
Étape : 2 Créer quelques - MapWrapperLayout extends FrameLayout
on peut donc définir certains Touchez ou faites Glisser l'auditeur un cette mise en page et intégrer ce point de vue avec vue de la carte. Donc, Nous avons besoin d'une Interface qui va les utiliser dans Root_Map.java
MySupportMapFragment.Java
public class MySupportMapFragment extends SupportMapFragment {
public View mOriginalContentView;
public MapWrapperLayout mMapWrapperLayout;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
mOriginalContentView = super.onCreateView(inflater, parent, savedInstanceState);
mMapWrapperLayout = new MapWrapperLayout(getActivity());
mMapWrapperLayout.addView(mOriginalContentView);
return mMapWrapperLayout;
}
@Override
public View getView() {
return mOriginalContentView;
}
public void setOnDragListener(MapWrapperLayout.OnDragListener onDragListener) {
mMapWrapperLayout.setOnDragListener(onDragListener);
}
}
MapWrapperLayout.java
public class MapWrapperLayout extends FrameLayout {
private OnDragListener mOnDragListener;
public MapWrapperLayout(Context context) {
super(context);
}
public interface OnDragListener {
public void onDrag(MotionEvent motionEvent);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (mOnDragListener != null) {
mOnDragListener.onDrag(ev);
}
return super.dispatchTouchEvent(ev);
}
public void setOnDragListener(OnDragListener mOnDragListener) {
this.mOnDragListener = mOnDragListener;
}
}
Root_Map.Java
public class Root_Map extends FragmentActivity {
private GoogleMap mMap;
public static boolean mMapIsTouched = false;
MySupportMapFragment customMapFragment;
Projection projection;
public double latitude;
public double longitude;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.root_map);
MySupportMapFragment customMapFragment = ((MySupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map));
mMap = customMapFragment.getMap();
customMapFragment.setOnDragListener(new MapWrapperLayout.OnDragListener() { @Override
public void onDrag(MotionEvent motionEvent) {
Log.i("ON_DRAG", "X:" + String.valueOf(motionEvent.getX()));
Log.i("ON_DRAG", "Y:" + String.valueOf(motionEvent.getY()));
float x = motionEvent.getX();
float y = motionEvent.getY();
int x_co = Integer.parseInt(String.valueOf(Math.round(x)));
int y_co = Integer.parseInt(String.valueOf(Math.round(y)));
projection = mMap.getProjection();
Point x_y_points = new Point(x_co, y_co);
LatLng latLng = mMap.getProjection().fromScreenLocation(x_y_points);
latitude = latLng.latitude;
longitude = latLng.longitude;
Log.i("ON_DRAG", "lat:" + latitude);
Log.i("ON_DRAG", "long:" + longitude);
// Handle motion event:
}
});
}}
Référence Link1 , Link2
Jusqu'ici je suis en mesure d'obtenir LatLong de base X,Y coordonnées de l'écran , Maintenant j'ai juste à stocker dans le Tableau et qu'tableau sera utilisé pour dessiner une carte et enfin il regarde comme sans forme de polygone.
J'espère que ce sera certainement vous aider.
Mise à jour:
La variante 2
Comme nous maintenant que la structure du Châssis est transparent, de sorte que j'ai réaliser à l'aide de Cadre de Mise en page.
Dans ce cas, il n'est pas nécessaire de créer des custom fragment. Je viens d'utiliser un Cadre de Mise en page comme la racine de mise en page. Donc, fondamentalement, je vais obtenir de l'Événement Tactile de racine mise en page et qui va me rendre à l'écran des coordonnées que nous sommes dans la coutume fragment.
Maintenant, j'ai utilisé un Bouton à l'intérieur de la "contour Libre". Ainsi, lorsque vous cliquez sur cela, alors vous pouvez déplacer vos doigts sur la carte et dessiner à main libre polygone et qui permet de désactiver votre carte de mobiliers sur l'écran.Lorsque vous reClick sur le même bouton, l'écran passe en mode idéal.
root_map.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<fragment
android:id="@+id/map"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
class="com.google.android.gms.maps.SupportMapFragment" />
<FrameLayout
android:id="@+id/fram_map"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<Button
android:id="@+id/btn_draw_State"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Free Draw" />
</FrameLayout>
</FrameLayout>
Root_Map.java
FrameLayout fram_map = (FrameLayout) findViewById(R.id.fram_map);
Button btn_draw_State = (Button) findViewById(R.id.btn_draw_State);
Boolean Is_MAP_Moveable = false; // to detect map is movable
// Bouton pour changer de Carte et mobiliers de l'etat
btn_draw_State.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (Is_MAP_Moveable != true) {
Is_MAP_Moveable = true;
} else {
Is_MAP_Moveable = false;
}
}
});
Touch Sur de la structure du Châssis et avec l'aide de la faire certaines tâches
fram_map.setOnTouchListener(new View.OnTouchListener() { @Override
public boolean onTouch(View v, MotionEvent event) {
float x = event.getX();
float y = event.getY();
int x_co = Math.round(x);
int y_co = Math.round(y);
projection = mMap.getProjection();
Point x_y_points = new Point(x_co, y_co);
LatLng latLng = mMap.getProjection().fromScreenLocation(x_y_points);
latitude = latLng.latitude;
longitude = latLng.longitude;
int eventaction = event.getAction();
switch (eventaction) {
case MotionEvent.ACTION_DOWN:
// finger touches the screen
val.add(new LatLng(latitude, longitude));
case MotionEvent.ACTION_MOVE:
// finger moves on the screen
val.add(new LatLng(latitude, longitude));
case MotionEvent.ACTION_UP:
// finger leaves the screen
Draw_Map();
break;
}
if (Is_MAP_Moveable == true) {
return true;
} else {
return false;
}
}
});
// Dessiner votre carte
public void Draw_Map() {
rectOptions = new PolygonOptions();
rectOptions.addAll(val);
rectOptions.strokeColor(Color.BLUE);
rectOptions.strokeWidth(7);
rectOptions.fillColor(Color.CYAN);
polygon = mMap.addPolygon(rectOptions);
}
Pourtant, Maintenant vous avez juste à maintenir votre liste que vous dessinez , vous devez effacer votre liste précédente des données.