java - that - google maps api key android
Cambiar la posición del botón "Mi ubicación" de la API de Google Maps (15)
Fue un poco difícil lograr que esto funcione. Pero lo hice, y en el proceso también comencé a mover los botones del zoom. Aquí mi código completo:
package com.squirrel.hkairpollution;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.UiSettings;
import com.google.android.gms.maps.model.LatLng;
public class MySupportMapFragment extends SupportMapFragment {
private static final String TAG = HKAirPollution.TAG;
public MySupportMapFragment() {
return;
}
@Override
public View onCreateView(LayoutInflater arg0, ViewGroup arg1, Bundle arg2) {
Log.v(TAG, "In overridden onCreateView.");
View v = super.onCreateView(arg0, arg1, arg2);
Log.v(TAG, "Initialising map.");
initMap();
return v;
}
@Override
public void onViewCreated (View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
resetButtons();
}
private void initMap(){
UiSettings settings = getMap().getUiSettings();
settings.setAllGesturesEnabled(true);
settings.setMyLocationButtonEnabled(true);
LatLng latLong = new LatLng(22.320542, 114.185715);
getMap().moveCamera(CameraUpdateFactory.newLatLngZoom(latLong,11));
}
/**
* Move my position button at the bottom of map
*/
private void resetButtons()
{
// Get a reference to the zoom buttons and the position button.
ViewGroup v1 = (ViewGroup)this.getView();
ViewGroup v2 = (ViewGroup)v1.getChildAt(0);
ViewGroup v3 = (ViewGroup)v2.getChildAt(0);
ViewGroup v4 = (ViewGroup)v3.getChildAt(1);
// The My Position button
View position = (View)v4.getChildAt(0);
int positionWidth = position.getLayoutParams().width;
int positionHeight = position.getLayoutParams().height;
// Lay out the My Position button.
RelativeLayout.LayoutParams positionParams = new RelativeLayout.LayoutParams(positionWidth,positionHeight);
int margin = positionWidth/5;
positionParams.setMargins(0, 0, 0, margin);
positionParams.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
positionParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
position.setLayoutParams(positionParams);
// The Zoom buttons
View zoom = (View)v4.getChildAt(2);
int zoomWidth = zoom.getLayoutParams().width;
int zoomHeight = zoom.getLayoutParams().height;
// Lay out the Zoom buttons.
RelativeLayout.LayoutParams zoomParams = new RelativeLayout.LayoutParams(zoomWidth, zoomHeight);
zoomParams.setMargins(0, 0, 0, margin);
zoomParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
zoomParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
zoom.setLayoutParams(zoomParams);
}
}
Estoy usando Google Maps Android API v2, y necesito una forma de arriesgar la posición del botón "Mi ubicación".
Obtengo el botón "Mi ubicación" de la siguiente manera:
GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());
final GoogleMap map = ((SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map)).getMap();
// This gets the button
map.setMyLocationEnabled(true);
No me gusta ver estos identificadores de vista mágica que otros usan, sugiero usar etiquetas para encontrar los hijos de MapView
.
Aquí está mi solución para colocar el botón Mi ubicación arriba de los controles de Zoom .
// Get map views
View location_button =_mapView.findViewWithTag("GoogleMapMyLocationButton");
View zoom_in_button = _mapView.findViewWithTag("GoogleMapZoomInButton");
View zoom_layout = (View) zoom_in_button.getParent();
// adjust location button layout params above the zoom layout
RelativeLayout.LayoutParams location_layout = (RelativeLayout.LayoutParams) location_button.getLayoutParams();
location_layout.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0);
location_layout.addRule(RelativeLayout.ABOVE, zoom_layout.getId());
Primero, obtenga Google Map View:
View mapView = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getView();
A continuación, busque el botón Mi ubicación (identificación del depurador de Android Studio):
View btnMyLocation = ((View) mapView.findViewById(1).getParent()).findViewById(2);
Finalmente, simplemente configure nuevos parámetros RelativeLayout para el botón Mi ubicación (alinee el elemento primario derecho + centro verticalmente en este caso):
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(80,80); // size of button in dp
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
params.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
params.setMargins(0, 0, 20, 0);
btnMyLocation.setLayoutParams(params);
¡Auge! Ahora puedes moverlo como quieras;)
Puede obtener el botón "Mi ubicación" y moverlo, como:
public class MapFragment extends SupportMapFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View mapView = super.onCreateView(inflater, container, savedInstanceState);
// Get the button view
View locationButton = ((View) mapView.findViewById(1).getParent()).findViewById(2);
// and next place it, for exemple, on bottom right (as Google Maps app)
RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) locationButton.getLayoutParams();
// position on right bottom
rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0);
rlp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
rlp.setMargins(0, 0, 30, 30);
}
}
Puede que esta no sea la mejor solución, pero podría colocar su propio botón sobre el mapa y manejarlo usted mismo. Tomaría lo siguiente:
1) Coloque el mapa en un frameLayout y agregue su botón en la parte superior. P.ej
<FrameLayout
android:id="@+id/mapFrame"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<fragment
xmlns:map="http://schemas.android.com/apk/res-auto"
android:id="@+id/mapFragment"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
class="com.google.android.gms.maps.MapFragment"
map:mapType="normal"
map:uiCompass="true" />
<ImageButton
android:id="@+id/myMapLocationButton"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_gravity="bottom|right"
android:background="@drawable/myMapLocationDrawable"
android:contentDescription="My Location" />
</FrameLayout>
2) Edite la configuración de la IU de mapas para que el botón no aparezca cuando llame a setMyLocationEnabled (true). Puede hacerlo a través de map.getUiSettings (). setMyLocationButtonEnabled (false);
3) Controle el clic de su nuevo botón para emular lo que hace el botón suministrado. Ejemplo: llamar a mMap.setMyLocationEnabled (...); y desplaza el mapa a la ubicación actual.
Espero que ayude o que alguien llegue con una solución más simple para ti ;-)
Puede usar el siguiente enfoque:
View myLocationParent = ((View) getView().findViewById(1).getParent());
View myLocationParentParent = ((View) myLocationParent.getParent());
// my position button
int positionWidth = myLocationParent.getLayoutParams().width;
int positionHeight = myLocationParent.getLayoutParams().height;
// lay out position button
FrameLayout.LayoutParams positionParams = new FrameLayout.LayoutParams(
positionWidth, positionHeight);
positionParams.setMargins(0, 100, 0, 0);
myLocationParent.setLayoutParams(positionParams);
Resolví este problema en el fragmento de mi mapa al volver a colocar mi botón de ubicación en la esquina inferior derecha de la vista con el siguiente código, aquí está mi Actividad de Maps.java: -
agregue estas líneas de código en el método onCreate (),
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapView = mapFragment.getView();
mapFragment.getMapAsync(this);
y aquí está el código deMapReady (): -
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
mMap.setMyLocationEnabled(true);
// Add a marker in Sydney and move the camera
LatLng sydney = new LatLng(-34, 151);
mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
if (mapView != null &&
mapView.findViewById(Integer.parseInt("1")) != null) {
// Get the button view
View locationButton = ((View) mapView.findViewById(Integer.parseInt("1")).getParent()).findViewById(Integer.parseInt("2"));
// and next place it, on bottom right (as Google Maps app)
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams)
locationButton.getLayoutParams();
// position on right bottom
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
layoutParams.setMargins(0, 0, 30, 30);
}
}
Espero que esto resuelva tu problema. Gracias.
Si solo desea tener habilitada la indicación de ubicación (el punto azul) pero no necesita el botón predeterminado Mi ubicación:
mGoogleMap.setMyLocationEnabled(true);
mGoogleMap.getUiSettings().setMyLocationButtonEnabled(false);
De esta forma, también puede dibujar su propio botón donde desee sin elementos extraños como este mapView.findViewById(1).getParent())
.
Simplemente use GoogleMap.setPadding (izquierda, arriba, derecha, abajo), lo que le permite indicar partes del mapa que pueden quedar oscurecidas por otras vistas. El ajuste de relleno reubica los controles de mapa estándar, y las actualizaciones de la cámara usarán la región acolchada.
Una forma de lidiar con este problema. Borre el botón predeterminado y cree el suyo propio. En la sentencia OnCreate, agregue la siguiente:
GoogleMap mMap = ((MapView) inflatedView.findViewById(R.id.mapview)).getMap();
LocationManager locationManager =
(LocationManager)getActivity().getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
String provider = locationManager.getBestProvider(criteria, false);
Location location = locationManager.getLastKnownLocation(provider);
locationManager.requestLocationUpdates(provider, 2000, 1, this);
mMap.setMyLocationEnabled(true);
mMap.getUiSettings().setMyLocationButtonEnabled(false); // delete default button
Imagebutton imgbtn = (ImageButton) view.findViewById(R.id.imgbutton); //your button
imgbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new
LatLng(location.getLatitude(),
location.getLongitude()), 15));
}
});
Vea el método a continuación. Vive dentro de una clase que amplía SupportMapFragment. Obtiene la vista de contenedor para el botón y la muestra en la parte inferior, centrada horizontalmente.
/**
* Move my position button at the bottom of map
*/
private void resetMyPositionButton()
{
//deep paths for map controls
ViewGroup v1 = (ViewGroup)this.getView();
ViewGroup v2 = (ViewGroup)v1.getChildAt(0);
ViewGroup v3 = (ViewGroup)v2.getChildAt(0);
ViewGroup v4 = (ViewGroup)v3.getChildAt(1);
//my position button
View position = (View)v4.getChildAt(0);
int positionWidth = position.getLayoutParams().width;
int positionHeight = position.getLayoutParams().height;
//lay out position button
RelativeLayout.LayoutParams positionParams = new RelativeLayout.LayoutParams(positionWidth,positionHeight);
int margin = positionWidth/5;
positionParams.setMargins(0, 0, 0, margin);
positionParams.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
positionParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
position.setLayoutParams(positionParams);
}
Ya se explicó anteriormente. Solo una pequeña adición a la respuesta de fabLouis. También puede obtener su vista de mapa desde SupportMapFragment.
/**
* Move the button
*/
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().
findFragmentById(R.id.map);
View mapView = mapFragment.getView();
if (mapView != null &&
mapView.findViewById(1) != null) {
// Get the button view
View locationButton = ((View) mapView.findViewById(1).getParent()).findViewById(2);
// and next place it, on bottom right (as Google Maps app)
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams)
locationButton.getLayoutParams();
// position on right bottom
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
layoutParams.setMargins(0, 0, 30, 30);
}
Yo tuve el mismo problema. Terminé usando el Hierarchy Viewer para identificar la vista utilizada para mostrar el botón y manipularlo. Muy hacky, lo sé, pero no pude encontrar una forma diferente.
prueba este código
private void resetMyPositionButton()
{
Fragment fragment = ( (SupportMapFragment) getSupportFragmentManager().findFragmentById( R.id.map ) );
ViewGroup v1 = (ViewGroup) fragment.getView();
ViewGroup v2 = (ViewGroup)v1.getChildAt(0);
ViewGroup v3 = (ViewGroup)v2.getChildAt(2);
View position = (View)v3.getChildAt(0);
int positionWidth = position.getLayoutParams().width;
int positionHeight = position.getLayoutParams().height;
//lay out position button
RelativeLayout.LayoutParams positionParams = new RelativeLayout.LayoutParams(positionWidth,positionHeight);
int margin = positionWidth/5;
positionParams.setMargins(margin, 0, 0, margin);
positionParams.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
positionParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
position.setLayoutParams(positionParams);
}
Antes, podías eliminar la antigua regla de botón:
@Override
public void onMapReady(final GoogleMap googleMap) {
this.map = googleMap;
// Show location button
View locationButton = ((View) mapView.findViewById(Integer.parseInt("1")).getParent()).findViewById(Integer.parseInt("2"));
RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) locationButton.getLayoutParams();
// position on right bottom
Log.l(Arrays.toString(rlp.getRules()), L.getLogInfo());
int[] ruleList = rlp.getRules();
for (int i = 0; i < ruleList.length; i ++) {
rlp.removeRule(i);
}
Log.l(Arrays.toString(rlp.getRules()), L.getLogInfo());
//Do what you want to move this location button:
rlp.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
rlp.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
}