`

ItemizedOverlay Demo Example OverlayItem Overlay

阅读更多
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,叫他们重新画。


如需源码,站内短信我。





1
0
分享到:
评论
1 楼 csluqiang 2012-04-24  
写的不错啊,帮了我的忙,谢谢哈

相关推荐

    ItemizedOverlay

    首先,你需要继承`ItemizedOverlay&lt;OverlayItem&gt;`,并重写必要的方法,如`draw()`用于在地图上绘制覆盖物,`onTap()`处理点击事件,以及`createItem(int index)`和`size()`来获取覆盖物的数量。 2. **OverlayItem*...

    Android学习笔记之百度地图(分条目覆盖物:ItemizedOverlay)

    首先,`ItemizedOverlay`是`Overlay`的一个子类,它允许我们添加和管理一系列的`OverlayItem`,每个`OverlayItem`都代表地图上的一个标记点。创建`ItemizedOverlay`需要继承它并重写必要的方法,例如`bindToMapView...

    使用ItemizedOverlay在mapview上创建浮动按钮

    `ItemizedOverlay`是一个抽象类,继承自`Overlay`,它用于表示一组地理位置上的覆盖物(overlay items)。每个覆盖物通常代表一个地理坐标,可以通过自定义的`OverlayItem`对象来表示。`OverlayItem`包含三个关键...

    android调用百度地图的覆盖层

    public class CustomItemizedOverlay extends ItemizedOverlay&lt;OverlayItem&gt; { private ArrayList&lt;OverlayItem&gt; mOverlays = new ArrayList(); private MapView mapView; public CustomItemizedOverlay(Drawable...

    android 百度地图demo 在地图上划出轨迹

    - 在`ItemizedOverlay`中重写`onDrawItem(Canvas canvas, OverlayItem item, int index)`方法,定制每个覆盖物的绘制方式。 ### 四、注意事项 - **性能优化**:当轨迹点较多时,直接在`draw(Canvas canvas)`中绘制...

    高德地图自定义点聚合图片

    1. 创建一个自定义的`Overlay`类,继承自`ItemizedOverlay&lt;OverlayItem&gt;`,在这个类中你需要重写`draw()`方法,绘制覆盖物。 2. 在`draw()`方法内,根据每个`OverlayItem`的位置,使用`Canvas`绘制自定义的图标。 3....

    ACTIVITY跳转

    ItemizedOverlay { private ArrayList&lt;OverlayItem&gt; mOverlays = new ArrayList&lt;OverlayItem&gt;(); public MyItemizedOverlay(Drawable defaultMarker) { super ( boundCenterBottom ...

    Android google map自定义图层

    `Overlay`是地图上的基本图层,它可以包含一系列`OverlayItem`。每个`OverlayItem`代表地图上的一个具体点,通常包含地理坐标(latitude, longitude)和附加信息。`CustomItemizedOverlay`是在`Overlay`的基础上进行...

    Android百度地图demo

    在地图上添加标记(Marker)可以指示特定地点,通过OverlayItem和ItemizedOverlay类可以实现。信息窗口(InfoWindow)则可以在标记上展示额外的信息,如地点详情,通过MapView的showInfoWindow方法展示。 7. **...

    高德地图api理解

    - `ItemizedOverlay`类可以用来创建包含多个覆盖物的图层,这些覆盖物通常由`OverlayItem`实例表示。 - 每个`OverlayItem`都包含一个位置(坐标)、一个标题和一个副标题,可以在地图上以不同的形式展示。 - 支持...

    某培训机构 Google Map 培训代码总结

    `MyOverlay`扩展了`ItemizedOverlay&lt;OverlayItem&gt;`,这是一个列表类型的覆盖层,可以包含多个标记。我们创建了一个`GeoPoint`对象,它表示地图上的经纬度坐标,然后创建了一个`OverlayItem`,它包含了`GeoPoint`坐标...

    谷歌地图 android小项目报告.docx

    接下来,我们创建了一个自定义的标注类`MyOverlay`,它继承自`ItemizedOverlay&lt;OverlayItem&gt;`。这个类负责存储和管理地图上的多个标注点。在`MyOverlay`的构造函数中,我们传入了应用的上下文`Context`和一个用于...

    高德地图api2010

    - **`Class ItemizedOverlay&lt;Item extends OverlayItem&gt;`**:用于在地图上添加带有特定图标和标签的标记点,`Item`通常是一个自定义的类,继承自`OverlayItem`。 - **`Class MapActivity`**:这是一个基本活动类,...

    Android地图和定位学习总结.pdf

    `ItemizedOverlay`和`OverlayItem`用于在地图上添加自定义覆盖物,而`Overlay.Snappable`则处理覆盖物的点击事件。`TrackballGestureDetector`处理轨迹球的滚动和旋转手势。 总的来说,Android地图和定位服务的实现...

    Android客户端百度地图的基本功能实现

    - 创建ItemizedOverlay类实例,添加OverlayItem到其中。 - 将ItemizedOverlay添加到MapView的Overlays集合中。 7. **自定义InfoWindow(气泡)**: - 通过覆写MapView的getInfoWindow(Marker)方法,可以自定义...

    gmap气球源码

    ItemizedOverlay是Android SDK中的一个关键类,用于在地图上添加自定义覆盖物(overlay)。它继承自Overlay类,是处理地图上单个标记或点的主要方式。在这个实例中,ItemizedOverlay被扩展以创建气球样式的效果。...

    android百度地图注释版

    3. **覆盖物(Overlay)与标注(BDMap_2_overlay_MKsearch)** 在地图上添加自定义元素,如图标、文字等,称为覆盖物。这在BDMap_2中有所体现,你将学习如何创建ItemizedOverlay类实例,用于管理多个覆盖物,以及...

    android实现百度地图自定义弹出窗口功能

    这通常涉及到对地图覆盖物(Overlay)的处理,特别是自定义ItemizedOverlay子类来控制Marker的行为。以下将详细介绍如何在Android中实现这一功能。 首先,我们需要创建一个自定义的覆盖物类,这里称为`...

    android地图开发

    - 创建自定义Overlay:首先,你需要创建一个继承自`Overlay`的类,然后重写`draw()`方法,该方法会在地图上绘制你的图层。 - 添加Overlay到MapView:使用`MapView`的`getOverlays().add(Overlay)`方法,将自定义的...

Global site tag (gtag.js) - Google Analytics