`

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的用法和populate()的作用。

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

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

    ACTIVITY跳转

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

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

    使用ItemizedOverlay在mapview上创建浮动按钮,可以为坐标创建一个单击事件。

    android百度api2.1

     修复ItemizedOverlay onTap(GeoPoint p, MapView mapView)错误  修复2.2系统pop图片在hdpi文件夹下显示错误问题  修复多mapView切换,路线overlay相互影响  修复省级离线数据大小错误 更多详细信息,请...

    Baidu_map(百度地图)Android平台开发指南

    o 4.1 覆盖物的抽象基类:Overlay o 4.2 当前位置:MyLocationOverlay o 4.3 分条目覆盖物:ItemizedOverlay o 4.4 本地搜索覆盖物:PoiOverlay o 4.5 驾车路线覆盖物:RouteOverlay o 4.6 换乘路线覆盖物:...

    一本android的好书beginning android 2 和 源码

    Drawing the ItemizedOverlay Handling Screen Taps My, Myself, and MyLocationOverlay The Key to It All ■Chapter 34: Handling Telephone Calls Report to the Manager You Make the Call! ■Chapter 35: ...

    gmap气球源码

    gmap上的一个气球开发的实例,使用ItemizedOverlay类开发,效果不错。

    百度地图信息推送报告

    (五)自定义图层ItemizedOverlay和在地图上增加标注 10 (六)增加点击标注弹出气泡(显示标注信息)的功能 12 (七)增加POI搜索功能 15 三、百度地图的信息推送 19 (一)PC服务端 19 (二) Android手机客户端 22 四...

    Android高级编程--源代码

    7.7.8 ItemizedOverlay和OverlayItem简介 239 7.7.9 将View固定到地图和地图的某个位置上 240 7.8 对Earthquake示例添加地图功能 241 7.9 小结 247 第8章 后台工作 249 8.1 服务简介 250 8.1.1 创建和控制服务...

    android-mapviewballoons

    当使用android地图外部库(com.google.android.maps)时,android-mapviewballoons会提供一个简单的方式来对地图覆盖进行标注,就是一个简单的信息气泡,它由...BalloonItemizedOverlay是ItemizedOverlay的一个抽象扩展

    android 地图扩展类

    android-mapviewballoons ... mapviewballoons会提供一个简单的方式来对地图覆盖进行标注,就是一个简单的信息气泡。 它由 ...BalloonOverlayView组成,是一...BalloonItemizedOverlay是ItemizedOverlay的一个抽象扩展。

    Android高级编程.pdf

    7.7.8 ItemizedOverlay和Overlayltem简介 7.7.9 将View固定到地图和地图的某个位置上 7.8 对Earthquake示例添加地图功能 7.9 小结 第8章 后台工作 8.1 服务简介 8.1.1 创建和控制服务 8.1.2 将活动和服务绑定 8.2 ...

    《Android高级编程》

    7.7.8 ItemizedOverlay和Overlayltem简介 7.7.9 将View固定到地图和地图的某个位置上 7.8 对Earthquake示例添加地图功能 7.9 小结 第8章 后台工作 8.1 服务简介 8.1.1 创建和控制服务 8.1.2 将活动和服务绑定 8.2 ...

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

    我们使用百度地图的时候,点击地图上的Marker,会弹出一个该地点详细信息的窗口,如下左图所示,有时候,我们希望自己定义这个弹出窗口的内容,或者,干脆用自己...基本原理就是用ItemizedOverlay来添加附加物,在OnTa

    地图气泡效果

    地图气泡效果源码,当使用Android地图外部库时,android-...它由BalloonOverlayView组成,是一个代表显示你的MapView及BalloonItemizedOverlay的气泡的视图,BalloonItemizedOverlay是ItemizedOverlay的一个抽象扩展。

    Google!Android手機應用程式設計入門

    跟隨擁有Android Market單一應用程式下載超過20萬人次經驗的開發者,用最短的時間踏實...第四十一章 為地圖標上地標(ItemizedOverlay) 附錄A 後記 附錄B如何取得範例原始碼 这个是他BLOG的电子版,如喜欢请支持Z版。

Global site tag (gtag.js) - Google Analytics