Размещение элементов управления масштабированием в MapView - PullRequest
18 голосов
/ 05 ноября 2008

Я пытаюсь заставить элементы управления масштабированием отображаться в mapview, следующий код почти работает, но элементы управления масштабированием отображаются в верхнем левом углу mapview, а не в нижнем центре, как я указав через setGravity(). Может ли кто-нибудь просветить меня о том, что мне не хватает?

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);

Все эти виды / макеты построены программно, нет файла макета для настройки.

Ответы [ 8 ]

23 голосов
/ 23 марта 2010

Добавьте следующую строку в метод OnCreate() вашего MapView класса:

view.setBuiltInZoomControls(true);

19 голосов
/ 11 ноября 2008

Хитрость здесь в том, чтобы поместить другой контейнер Layout, в который вы хотите поместить ZoomControls, а затем вставить ZoomControls в него.

Настоящий трюк заключается в использовании RelativeLayout вместо LinearLayout для позиционирования элементов, как показано в этом примере 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> 

Элемент layout_zoom LinearLayout располагается в нижней центральной части экрана, располагая его над серединой / нижней частью MapView.

Затем в onCreate вашей Деятельности получите ссылку на элемент layout_zoom и вставьте в него элемент ZoomControl, как вы уже сделали:

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);

ZoomControls теперь должен появляться при длинном щелчке, без кражи событий касания карты.

7 голосов
/ 13 мая 2011

Вышеописанное не сработало для меня, но это работает (чтобы поместить элемент управления справа внизу):

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;
    } 
}
4 голосов
/ 28 ноября 2008

Reto: спасибо за ваш ответ, но идея состояла в том, чтобы сделать это без с использованием XML-макетов.

Я в конце концов решил проблему. Поскольку MapView является подклассом ViewGroup, вы можете легко добавлять дочерние представления (например, элементы управления масштабированием). Все, что вам нужно, это экземпляр MapView.LayoutParams, и вы готовы к работе. Я сделал что-то вроде этого (поместил элементы управления масштабированием в нижний центр карты).

  // 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);
2 голосов
/ 25 сентября 2018

Вы можете попробовать это:

MapView map = (MapView)findViewById(R.id.mapview);
map.setBuiltInZoomControls(true);
2 голосов
/ 27 февраля 2009

из цепочки групп Google я нашел это:

ZoomControls без 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);

 } 

на 100% работал на меня с SDK1.1

2 голосов
/ 23 января 2009

К сожалению, я не могу добавить комментарий к одобренному Jason Hudgins решению от 28 ноября в 6:32, но я получил небольшую ошибку с его кодом:

В этой строке:

MapView.LayoutParams params = MapView.LayoutParams(

Ошибка, которую дал мне Затмение, была

"Метод LayoutParams (int, int, int, int, int) не определены для Тип MapView "

Вместо этого, создание нового объекта MapView.LayoutParams исправило это, например:

MapView.LayoutParams params = **new** MapView.LayoutParams(

Мне потребовалось некоторое время, чтобы выяснить, так как я n00b: D

0 голосов
/ 08 ноября 2008

Reto - проблема с использованием FILL_PARENT состоит в том, что управление масштабированием затем «крадет» все сенсорные события; так что вы не можете панорамировать карту, пока видны элементы управления масштабированием. Вы знаете, как это предотвратить?

...