Ответ 1
Добавьте следующую строку в метод OnCreate()
вашего MapView
класса:
view.setBuiltInZoomControls(true);
Я пытаюсь получить элементы управления масштабированием для отображения в 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);
Эти представления/макеты все построены программно, нет файла макета для настройки.
Добавьте следующую строку в метод OnCreate()
вашего MapView
класса:
view.setBuiltInZoomControls(true);
Трюк здесь заключается в размещении другого контейнера 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 теперь должен появляться на длинном клике, не крадя события касания карты.
Вышеуказанное не работает для меня, но это делает (чтобы поместить элемент управления в нижнем правом углу):
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;
}
}
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);
К сожалению, я не могу добавить комментарий к одобренному Джейсону Хадгинсу решению от 28 ноября в 6:32, но у меня была небольшая ошибка с его кодом:
В этой строке:
MapView.LayoutParams params = MapView.LayoutParams(
Ошибка Eclipse дала мне
"Метод LayoutParams (int, int, int, int, int) undefined для тип MapView"
вместо этого, создав новый объект MapView.LayoutParams, он зафиксировал это:
MapView.LayoutParams params = **new** MapView.LayoutParams(
Мне потребовалось некоторое время, чтобы узнать, как я n00b: D
из поток групп 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
Reto - проблема с использованием FILL_PARENT заключается в том, что управление зумом затем "крадет" все события касания; так что вы не можете панорамировать карту, пока элементы управления увеличением видны. Вы знаете, как предотвратить это?