android - usar - Colocación de controles de zoom en una vista de mapa
mapas en android studio (7)
El truco aquí es colocar otro contenedor de diseño en el que desee colocar los controles de zoom y luego insertar los controles de zoom en eso.
El verdadero truco es usar RelativeLayout
lugar de LinearLayout
para posicionar los elementos, como se muestra en este ejemplo layout.xml
:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.google.android.maps.MapView
android:id="@+id/myMapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:enabled="true"
android:clickable="true"
android:apiKey="MY_MAP_API_KEY"
/>
<LinearLayout android:id="@+id/layout_zoom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
/>
</RelativeLayout>
El elemento layout_zoom LinearLayout se ubica en la parte inferior central de la pantalla, colocándolo sobre la mitad / parte inferior de MapView
.
Luego, dentro de Activity onCreate
, obtenga una referencia al elemento layout_zoom e inserte ZoomControl en él, como ya lo hizo:
LinearLayout zoomLayout =(LinearLayout)findViewById(R.id.layout_zoom);
View zoomView = myMapView.getZoomControls();
zoomLayout.addView(zoomView, new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
myMapView.displayZoomControls(true);
Los ZoomControls ahora deberían aparecer en un clic largo, sin robar los eventos táctiles del mapa.
Estoy intentando que los controles del zoom aparezcan en una vista de mapview
, el siguiente código casi funciona, pero los controles del zoom aparecen en la parte superior izquierda de la vista del mapview
, no en el centro inferior como lo estoy especificando a través de setGravity()
. ¿Alguien me puede iluminar sobre lo que me estoy perdiendo?
zoomView = (LinearLayout) mapView.getZoomControls();
zoomView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT));
zoomView.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL);
mapView.addView(zoomView);
Estas vistas / diseños se construyen mediante programación, no hay un archivo de diseño para ajustar.
Reto: el problema con el uso de FILL_PARENT es que el control del zoom "roba" todos los eventos táctiles; para que no pueda desplazarse por el mapa mientras los controles de zoom estén visibles. ¿Sabes cómo prevenir esto?
Reto: gracias por su respuesta, pero la idea era hacerlo sin usar diseños XML.
Eventualmente resolví el problema. Como MapView es una subclase de ViewGroup, puede agregar fácilmente vistas secundarias (como los controles de zoom). Todo lo que necesita es una instancia de MapView.LayoutParams y listo. Hice algo como esto (coloca controles de zoom en la parte inferior central de la vista del mapa).
// layout to insert zoomcontrols at the bottom center of a mapview
MapView.LayoutParams params = MapView.LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT,
mapViewWidth / 2, mapViewHeight,
MapView.LayoutParams.BOTTOM_CENTER);
// add zoom controls
mapView.addView(mapView.getZoomControls(), params);
del hilo de google groups encontré esto:
ZoomControls sin XML:
public class MyMapActivity extends MapActivity { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RelativeLayout relativeLayout = new RelativeLayout(this);
setContentView(relativeLayout);
final MapView mapView = new MapView(this, DEBUG_MAP_API_KEY);
RelativeLayout.LayoutParams mapViewLayoutParams = new
RelativeLayout.LayoutParams
(RelativeLayout.LayoutParams.FILL_PARENT,RelativeLayout.LayoutParams.FILL_PARENT );
relativeLayout.addView(mapView, mapViewLayoutParams);
RelativeLayout.LayoutParams zoomControlsLayoutParams = new
RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT );
zoomControlsLayoutParams.addRule
(RelativeLayout.ALIGN_PARENT_BOTTOM);
zoomControlsLayoutParams.addRule
(RelativeLayout.CENTER_HORIZONTAL);
relativeLayout.addView(mapView.getZoomControls(),
zoomControlsLayoutParams);
mapView.setClickable(true);
mapView.setEnabled(true);
}
estaba 100% trabajando para mí con SDK1.1
Lo anterior no funcionó para mí, pero esto sí (para colocar el control en la parte inferior derecha):
mapView.setBuiltInZoomControls(true);
ZoomButtonsController zbc = mapView.getZoomButtonsController();
ViewGroup container = zbc.getContainer();
for (int i = 0; i < container.getChildCount(); i++) {
View child = container.getChildAt(i);
if (child instanceof ZoomControls) {
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) child.getLayoutParams();
lp.gravity = Gravity.RIGHT | Gravity.BOTTOM;
child.requestLayout();
break;
}
}
Desafortunadamente no puedo agregar un comentario a la solución aprobada por Jason Hudgins desde el 28 de noviembre a las 6:32 pero recibí un pequeño error con su código:
En esta línea:
MapView.LayoutParams params = MapView.LayoutParams(
El error que me dio Eclipse fue
"El método LayoutParams (int, int, int, int, int) no está definido para el tipo MapView"
en su lugar, la creación de un nuevo objeto MapView.LayoutParams lo solucionó de esta manera:
MapView.LayoutParams params = **new** MapView.LayoutParams(
Me llevó algo de tiempo averiguarlo, ya que soy un n00b: D
Agregue la siguiente línea al método OnCreate()
de su clase MapView
:
view.setBuiltInZoomControls(true);