Differecnes between ItemizedOverlay and Overlay class
Overlay is a general overlay.
ItemizedOverlay is a subclass that makes it easier to create an overlay that is a discrete series of marked points on the map. So,
if you are trying to show a bus route, or shade a region, or something like that, Overlay is the class you want. If you are trying to show a collection of restaurants, or churches, or whatever, ItemizedOverlay works.
Note, though, that ItemizedOverlay is designed for modest numbers of points (e.g., dozens). If you have a large number of points, you may need to create your own Overlay just for performance reasons.
下面给出一个例子介绍ItemizedOverlay如何使用,代码具有自我解释功能。
<?xml version="1.0" encoding="UTF-8" ?>
<RelativeLayout android:background="#ff000000"
android:padding="3.0dip" android:layout_width="wrap_content"
android:layout_height="wrap_content" xmlns:android="http://schemas.android.com/apk/res/android">
<com.google.android.maps.MapView
android:id="@+id/mapView" android:clickable="true"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:layout_alignParentBottom="true"
android:apiKey="0K834befj1r6RIspWAzNY9vUykEaxjEm3He4VGA" /> <!-- 换成自己的apiKey -->
</RelativeLayout>
package com.test;
import java.util.ArrayList;
import java.util.List;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;
public class Main extends MapActivity {
MapView mapView;
GeoPoint nanjing = new GeoPoint((int)(32.04 * 1E6), (int)(118.78 * 1E6));
GeoPoint hangzhou = new GeoPoint((int)(30.26 * 1E6), (int)(120.19 * 1E6));
GeoPoint shanghai = new GeoPoint((int)(31.22 * 1E6), (int)(121.48 * 1E6));
ArrayList<OverlayItem> list;
ShowOverlay sol;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView = (MapView)findViewById(R.id.mapView);
mapView.getController().animateTo(hangzhou);
mapView.setBuiltInZoomControls(true);
mapView.getController().setZoom(8);
//-----------------创建OverlayItem链表----------------
list = new ArrayList<OverlayItem>();
OverlayItem o1 = new OverlayItem(nanjing, "title", "snippet");
OverlayItem o2 = new OverlayItem(hangzhou, "title", "snippet");
OverlayItem o3 = new OverlayItem(shanghai, "title", "snippet");
list.add(o1);
list.add(o2);
list.add(o3);
//-----------------获取图标M-----------------------------
Drawable drawable = getApplicationContext().getResources().getDrawable(R.drawable.icon);
//-----------------new ShowOverlay对象-------------------
sol = new ShowOverlay(drawable, list);
//------------------得到MapView图层Overlays---------------
List<Overlay> overlays = mapView.getOverlays();
//------------------将图层添加到MapView---------------
overlays.add(sol);
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
}
package com.test;
import java.util.ArrayList;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.KeyEvent;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.MapView;
import com.google.android.maps.OverlayItem;
public class ShowOverlay extends ItemizedOverlay<OverlayItem> {
private final static String TAG = "ShowOverlay";
private ArrayList<OverlayItem> l;
public ShowOverlay(Drawable defaultMarker) {
super(defaultMarker);
}
public ShowOverlay(Drawable defaultMarker, ArrayList<OverlayItem> l) {
super(boundCenterBottom(defaultMarker));
//直到使用boundCenterBotton(defaultMarker),我的图标才显示出来
this.l = l;
//populate() 放在这里为什么合理
//populate() 会创建这一层中包含的每一个overlay item
//api: The subclass should call populate as soon as it has data, before
// anything else gets called.
Log.d(TAG, "before populate()");
populate();
//populate() 首先调用size(),根据size大小,决定调用createItem()的次数,创建OverlayItem列表
Log.d(TAG, "after populate()");
}
protected OverlayItem createItem(int i) {
Log.d(TAG, "createItem()" + i);
return l.get(i);
}
public int size() {
Log.d(TAG, "size = " + l.size());
return l.size();
}
protected int getIndexToDraw(int i) {
Log.d(TAG, "getIndexToDraw" + i);
return super.getIndexToDraw(i);
}
// The marker will be drawn twice for each Item in the Overlay--once in the
// shadow phase, skewed and darkened, then again in the non-shadow phase
public void draw(Canvas canvas, MapView mapview, boolean flag) {
Log.d(TAG, "before super draw");
super.draw(canvas, mapview, flag);
//首先取得size,然后使用getIndexToDraw获得画item的顺序
Log.d(TAG, "after super draw");
}
protected boolean onTap(int i) {
Log.d(TAG, "onTap" + i);
return super.onTap(i);
}
// it works just with marker(icon)
public boolean onKeyUp(int i, KeyEvent keyevent, MapView mapview) {
Log.d(TAG, "onkeyup");
return super.onKeyUp(i, keyevent, mapview);
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="7" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<uses-library android:name="com.google.android.maps" /> <!-- 注意 -->
<activity android:name=".Main"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET" /> <!-- 注意 -->
</manifest>
从logcat大致可以看出,ItemizedOverlay中方法的调用关系。其中的draw方法的调用不是很透明,一开始怎么调那么多次draw方法啊???
点击一下界面,会重复调用draw方法,点击不放,调用两次,放开点击,又调用两次。代码中的draw方法也注释了marker会被画两次,一次阴影阶段,一次非阴影阶段。这与点击不放会调用两次可以解释。
还有我猜哈,就是这个点击不放的事件由mapView接收,然后以类似广播的方式通知所有的overlay,叫他们重新画。
如需源码,站内短信我。
分享到:
相关推荐
首先,你需要继承`ItemizedOverlay<OverlayItem>`,并重写必要的方法,如`draw()`用于在地图上绘制覆盖物,`onTap()`处理点击事件,以及`createItem(int index)`和`size()`来获取覆盖物的数量。 2. **OverlayItem*...
首先,`ItemizedOverlay`是`Overlay`的一个子类,它允许我们添加和管理一系列的`OverlayItem`,每个`OverlayItem`都代表地图上的一个标记点。创建`ItemizedOverlay`需要继承它并重写必要的方法,例如`bindToMapView...
`ItemizedOverlay`是一个抽象类,继承自`Overlay`,它用于表示一组地理位置上的覆盖物(overlay items)。每个覆盖物通常代表一个地理坐标,可以通过自定义的`OverlayItem`对象来表示。`OverlayItem`包含三个关键...
public class CustomItemizedOverlay extends ItemizedOverlay<OverlayItem> { private ArrayList<OverlayItem> mOverlays = new ArrayList(); private MapView mapView; public CustomItemizedOverlay(Drawable...
- 在`ItemizedOverlay`中重写`onDrawItem(Canvas canvas, OverlayItem item, int index)`方法,定制每个覆盖物的绘制方式。 ### 四、注意事项 - **性能优化**:当轨迹点较多时,直接在`draw(Canvas canvas)`中绘制...
1. 创建一个自定义的`Overlay`类,继承自`ItemizedOverlay<OverlayItem>`,在这个类中你需要重写`draw()`方法,绘制覆盖物。 2. 在`draw()`方法内,根据每个`OverlayItem`的位置,使用`Canvas`绘制自定义的图标。 3....
ItemizedOverlay { private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); public MyItemizedOverlay(Drawable defaultMarker) { super ( boundCenterBottom ...
`Overlay`是地图上的基本图层,它可以包含一系列`OverlayItem`。每个`OverlayItem`代表地图上的一个具体点,通常包含地理坐标(latitude, longitude)和附加信息。`CustomItemizedOverlay`是在`Overlay`的基础上进行...
在地图上添加标记(Marker)可以指示特定地点,通过OverlayItem和ItemizedOverlay类可以实现。信息窗口(InfoWindow)则可以在标记上展示额外的信息,如地点详情,通过MapView的showInfoWindow方法展示。 7. **...
- `ItemizedOverlay`类可以用来创建包含多个覆盖物的图层,这些覆盖物通常由`OverlayItem`实例表示。 - 每个`OverlayItem`都包含一个位置(坐标)、一个标题和一个副标题,可以在地图上以不同的形式展示。 - 支持...
`MyOverlay`扩展了`ItemizedOverlay<OverlayItem>`,这是一个列表类型的覆盖层,可以包含多个标记。我们创建了一个`GeoPoint`对象,它表示地图上的经纬度坐标,然后创建了一个`OverlayItem`,它包含了`GeoPoint`坐标...
接下来,我们创建了一个自定义的标注类`MyOverlay`,它继承自`ItemizedOverlay<OverlayItem>`。这个类负责存储和管理地图上的多个标注点。在`MyOverlay`的构造函数中,我们传入了应用的上下文`Context`和一个用于...
- **`Class ItemizedOverlay<Item extends OverlayItem>`**:用于在地图上添加带有特定图标和标签的标记点,`Item`通常是一个自定义的类,继承自`OverlayItem`。 - **`Class MapActivity`**:这是一个基本活动类,...
`ItemizedOverlay`和`OverlayItem`用于在地图上添加自定义覆盖物,而`Overlay.Snappable`则处理覆盖物的点击事件。`TrackballGestureDetector`处理轨迹球的滚动和旋转手势。 总的来说,Android地图和定位服务的实现...
- 创建ItemizedOverlay类实例,添加OverlayItem到其中。 - 将ItemizedOverlay添加到MapView的Overlays集合中。 7. **自定义InfoWindow(气泡)**: - 通过覆写MapView的getInfoWindow(Marker)方法,可以自定义...
ItemizedOverlay是Android SDK中的一个关键类,用于在地图上添加自定义覆盖物(overlay)。它继承自Overlay类,是处理地图上单个标记或点的主要方式。在这个实例中,ItemizedOverlay被扩展以创建气球样式的效果。...
3. **覆盖物(Overlay)与标注(BDMap_2_overlay_MKsearch)** 在地图上添加自定义元素,如图标、文字等,称为覆盖物。这在BDMap_2中有所体现,你将学习如何创建ItemizedOverlay类实例,用于管理多个覆盖物,以及...
这通常涉及到对地图覆盖物(Overlay)的处理,特别是自定义ItemizedOverlay子类来控制Marker的行为。以下将详细介绍如何在Android中实现这一功能。 首先,我们需要创建一个自定义的覆盖物类,这里称为`...
- 创建自定义Overlay:首先,你需要创建一个继承自`Overlay`的类,然后重写`draw()`方法,该方法会在地图上绘制你的图层。 - 添加Overlay到MapView:使用`MapView`的`getOverlays().add(Overlay)`方法,将自定义的...