【Android】3.9 覆盖物功能
分类:C#、Android、VS2015、百度地图应用; 创建日期:2016-02-04
一、简介
百度地图SDK所提供的地图等级为3-19级(3.7.1版本中有些部分已经提供到了21级),所包含的信息有建筑物、道路、河流、学校、公园等内容。百度将所有叠加或覆盖到地图的内容统称为地图覆盖物。如标注、矢量图形元素(包括:折线、多边形和圆等)、定位图标等。覆盖物拥有自己的地理坐标,当拖动或缩放地图时,它们会相应的移动。
百度地图SDK 3.7.1支持多种地图覆盖物。该版本所支持的地图覆盖物有:定位图层、地图标注(Marker)、几何图形(点、折线、弧线、多边形等)、地形图图层、POI检索结果覆盖物、线路规划结果覆盖物、热力图图层、瓦片图层以及自定义标注等。
1、标注覆盖物
(1)标注
开发者可根据自己实际的业务需求,利用标注覆盖物,在地图指定的位置上添加标注信息。
(2)底图标注
自v3.6.0版本起,SDK在BaiduMap提供了控制底图标注的ShowMapPoi方法,默认显示底图标注。利用此方法可得到仅显示道路信息的地图。
2、几何图形覆盖物
地图SDK提供多种结合图形覆盖物,利用这些图形,可帮助您构建更加丰富多彩的地图应用。目前提供的几何图形有:点(Dot)、折线(Polyline)、弧线(Arc)、圆(Circle)、多边形(Polygon)。
3、文字覆盖物
文字,在地图中也是一种覆盖物,开发者可利用相关的接口,快速实现在地图上书写文字的需求。
4、弹出窗覆盖物
利用弹出窗覆盖物可构建具有更强交互性的地图页面。
5、地形图图层
地形图图层(GroundOverlay),又可叫做图片图层,即开发者可在地图的指定位置上添加图片。该图片可随地图的平移、缩放、旋转等操作做相应的变换。该图层是一种特殊的Overlay, 它位于底图和底图标注层之间(即该图层不会遮挡地图标注信息)。
6、检索结果覆盖物
针对检索功能模块(POI检索、线路规划等),地图SDK还对外提供相应的覆盖物来快速展示结果信息。这些方法都是开源的,开发者可根据自己的实际去求来做个性化的定制。
二、运行截图
简介:介绍添加覆盖物并响应点击功能和弹出pop功能
详述:
(1)在popup中添加弹出自定义View的示例;
(2)点击周围4个Marker,弹出popup,可更新marker位置和更新marker图标;
(3)中间显示的为图片图层,该图层可随地图的移动、缩放等做出相应的操作;
(4)支持Maker设置透明度的方法,利用滑动条可以展示maker透明度变化;
(5)支持Marker设置动画的能力,包含两种方式:从地上生长和从天上落下。
本示例运行截图如下:

三、设计步骤
1、添加demo09_overlay.xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <Button
android:id="@+id/clear"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginBottom="2dip"
android:layout_marginLeft="2dip"
android:layout_marginRight="2dip"
android:layout_marginTop="2dip"
android:layout_weight="1"
android:padding="10dip"
android:text="清除(clear)" /> <Button
android:id="@+id/resert"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginBottom="2dip"
android:layout_marginLeft="2dip"
android:layout_marginRight="2dip"
android:layout_marginTop="2dip"
android:layout_weight="1"
android:text="重置(reset)" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <SeekBar
android:id="@+id/alphaBar"
android:layout_marginBottom="2dip"
android:layout_marginLeft="2dip"
android:layout_marginRight="2dip"
android:layout_marginTop="2dip"
android:layout_weight="1"
android:layout_width="155dp"
android:max="10"
android:progress="10"
android:layout_height="wrap_content" /> <CheckBox
android:id="@+id/animation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="2dip"
android:layout_marginLeft="2dip"
android:layout_marginRight="2dip"
android:layout_marginTop="2dip"
android:layout_weight="1"
android:checked="true"
android:text="Marker添加动画" />
</LinearLayout> <com.baidu.mapapi.map.TextureMapView
android:id="@+id/bmapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent" /> </LinearLayout>
2、添加Demo09Overlay.cs文件
在SrcSdkDemos文件夹下添加该文件,然后将其内容改为下面的代码:
using Android.App;
using Android.Content.PM;
using Android.Graphics;
using Android.OS;
using Android.Widget;
using Com.Baidu.Mapapi.Map;
using Com.Baidu.Mapapi.Model;
using System.Collections.Generic; namespace BdMapV371Demos.SrcSdkDemos
{
/// <summary>
/// 演示覆盖物的用法
/// </summary>
[Activity(Label = "@string/demo_name_overlay",
ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.KeyboardHidden,
ScreenOrientation = ScreenOrientation.Sensor)]
public class Demo09Overlay : Activity
{
private TextureMapView mMapView;
private BaiduMap mBaiduMap;
private Marker mMarkerA;
private Marker mMarkerB;
private Marker mMarkerC;
private Marker mMarkerD;
private CheckBox animationBox = null; // 初始化全局 bitmap 信息,不用时及时 Recycle
BitmapDescriptor bdA = BitmapDescriptorFactory.FromResource(Resource.Drawable.icon_marka);
BitmapDescriptor bdB = BitmapDescriptorFactory.FromResource(Resource.Drawable.icon_markb);
BitmapDescriptor bdC = BitmapDescriptorFactory.FromResource(Resource.Drawable.icon_markc);
BitmapDescriptor bdD = BitmapDescriptorFactory.FromResource(Resource.Drawable.icon_markd);
BitmapDescriptor bd = BitmapDescriptorFactory.FromResource(Resource.Drawable.icon_gcoding);
BitmapDescriptor bdGround = BitmapDescriptorFactory.FromResource(Resource.Drawable.ground_overlay); protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.demo09_overlay); var clear = FindViewById<Button>(Resource.Id.clear);
clear.Click += delegate
{
ClearOverlay();
}; var resert = FindViewById<Button>(Resource.Id.resert);
resert.Click += delegate
{
ClearOverlay();
InitOverlay();
}; var alphaSeekBar = FindViewById<SeekBar>(Resource.Id.alphaBar);
alphaSeekBar.ProgressChanged += (s, e) =>
{
float alpha = e.Progress / 10.0f;
if (mMarkerA != null) mMarkerA.Alpha = alpha;
if (mMarkerB != null) mMarkerB.Alpha = alpha;
if (mMarkerC != null) mMarkerC.Alpha = alpha;
if (mMarkerD != null) mMarkerD.Alpha = alpha;
}; animationBox = FindViewById<CheckBox>(Resource.Id.animation);
mMapView = FindViewById<TextureMapView>(Resource.Id.bmapView);
mBaiduMap = mMapView.Map;
mBaiduMap.SetMapStatus(MapStatusUpdateFactory.ZoomTo(14.0f));
InitOverlay();
mBaiduMap.MarkerClick += (sender, args) =>
{
Marker marker = args.P0;
Button button = new Button(ApplicationContext);
button.SetTextColor(Color.Black);
button.SetBackgroundResource(Resource.Drawable.popup);
if (marker == mMarkerA || marker == mMarkerD)
{
button.Text = "更改位置";
button.Click += (s, e) =>
{
LatLng latLng = args.P0.Position;
LatLng latLngNew = new LatLng(latLng.Latitude + 0.005,
latLng.Longitude + 0.005);
mBaiduMap.HideInfoWindow();
};
var mInfoWindow = new InfoWindow(button, marker.Position, -);
mBaiduMap.ShowInfoWindow(mInfoWindow);
}
else if (marker == mMarkerB)
{
button.Text = "更改图标";
button.Click += delegate
{
marker.Icon = bd;
mBaiduMap.HideInfoWindow();
};
var mInfoWindow = new InfoWindow(button, marker.Position, -);
mBaiduMap.ShowInfoWindow(mInfoWindow);
}
else if (marker == mMarkerC)
{
button.Text = "删除";
button.Click += delegate
{
marker.Remove();
mBaiduMap.HideInfoWindow();
};
var mInfoWindow = new InfoWindow(button, marker.Position, -);
mBaiduMap.ShowInfoWindow(mInfoWindow);
}
};
} public void InitOverlay()
{
// add marker overlay
LatLng latLngA = new LatLng(39.963175, 116.400244);
LatLng latLngB = new LatLng(39.942821, 116.369199);
LatLng latLngC = new LatLng(39.939723, 116.425541);
LatLng latLngD = new LatLng(39.906965, 116.401394); OverlayOptions ooA = new MarkerOptions()
.InvokePosition(latLngA)
.InvokeIcon(bdA)
.InvokeZIndex()
.Draggable(true);
if (animationBox.Checked)
{
//掉下动画
((MarkerOptions)ooA).InvokeAnimateType(MarkerOptions.MarkerAnimateType.Drop);
}
mMarkerA = (Marker)(mBaiduMap.AddOverlay(ooA)); OverlayOptions ooB = new MarkerOptions()
.InvokePosition(latLngB)
.InvokeIcon(bdB)
.InvokeZIndex();
if (animationBox.Checked)
{
//掉下动画
((MarkerOptions)ooB).InvokeAnimateType(MarkerOptions.MarkerAnimateType.Drop);
}
mMarkerB = (Marker)(mBaiduMap.AddOverlay(ooB)); OverlayOptions ooC = new MarkerOptions()
.InvokePosition(latLngC)
.InvokeIcon(bdC)
.Perspective(false)
.Anchor(0.5f, 0.5f)
.InvokeRotate()
.InvokeZIndex();
if (animationBox.Checked)
{
//生长动画
((MarkerOptions)ooC).InvokeAnimateType(MarkerOptions.MarkerAnimateType.Grow);
}
mMarkerC = (Marker)(mBaiduMap.AddOverlay(ooC)); IList<BitmapDescriptor> giflist = new List<BitmapDescriptor>();
giflist.Add(bdA);
giflist.Add(bdB);
giflist.Add(bdC);
OverlayOptions ooD = new MarkerOptions()
.InvokePosition(latLngD)
.InvokeIcons(giflist)
.InvokeZIndex()
.InvokePeriod();
if (animationBox.Checked)
{
//生长动画
((MarkerOptions)ooD).InvokeAnimateType(MarkerOptions.MarkerAnimateType.Grow);
}
mMarkerD = (Marker)(mBaiduMap.AddOverlay(ooD)); // add ground overlay
LatLng southwest = new LatLng(39.92235, 116.380338);
LatLng northeast = new LatLng(39.947246, 116.414977);
LatLngBounds bounds = new LatLngBounds.Builder()
.Include(northeast)
.Include(southwest).Build();
OverlayOptions ooGround = new GroundOverlayOptions()
.PositionFromBounds(bounds)
.InvokeImage(bdGround)
.InvokeTransparency(0.8f);
mBaiduMap.AddOverlay(ooGround); MapStatusUpdate u = MapStatusUpdateFactory.NewLatLng(bounds.Center);
mBaiduMap.SetMapStatus(u);
mBaiduMap.MarkerDrag += (s, e) => { };
mBaiduMap.MarkerDragStart += (s, e) => { };
mBaiduMap.MarkerDragEnd += (s, e) =>
{
Marker marker = e.P0;
Toast.MakeText(this,
"拖拽结束,新位置:"
+ marker.Position.Latitude + ", "
+ marker.Position.Longitude,
ToastLength.Long).Show();
};
} /// <summary>
/// 清除所有Overlay
/// </summary>
public void ClearOverlay()
{
mBaiduMap.Clear();
mMarkerA = null;
mMarkerB = null;
mMarkerC = null;
mMarkerD = null;
} protected override void OnPause()
{
mMapView.OnPause();
base.OnPause();
} protected override void OnResume()
{
mMapView.OnResume();
base.OnResume();
} protected override void OnDestroy()
{
mMapView.OnDestroy();
base.OnDestroy();
// 回收 bitmap 资源
bdA.Recycle();
bdB.Recycle();
bdC.Recycle();
bdD.Recycle();
bd.Recycle();
bdGround.Recycle();
}
}
}
3、修改MainActivity.cs
在MainActivity.cs文件的demos字段定义中,去掉【示例9】下面的注释。
运行观察结果。
【Android】3.9 覆盖物功能的更多相关文章
- Android Webview实现文件下载功能
在做美图欣赏Android应用的时候,其中有涉及到Android应用下载的功能,这个应用本身其实也比较简单,就是通过WebView控制调用相应的WEB页面进行展示.刚开始以为和普通的文件下载实 ...
- I.MX6 android 移除shutdown功能
/************************************************************************ * I.MX6 android 移除shutdown ...
- 你真的有必要退出吗——再说Android程序的退出功能
转自你真的有必要退出吗--再说Android程序的退出功能 搞Android开发有一段时间了,相信很多从Windows开发过来的Android程序员都习惯性地会跟我一样遇到过同一个问题:如何彻底退出程 ...
- 调用Android自带日历功能(日历列表单、添加一个日历事件)
调用Android自带日历功能 觉得这篇文章不错,转载过来. 转载:http://blog.csdn.net/djy1992/article/details/9948393 Android手机配备有 ...
- Android使得手机拍照功能的发展(源共享)
Android系统调用手机拍照功能有两种方法来直接调用手机自带摄像头还有一个就是要当心自己的节拍. 例Camera360 强大的一个在每个操作系统都有一个手机摄影软件:您可以捕捉不同风格,不同特效的照 ...
- Android实现自动更新功能
Android实现自动更新功能 Android自动更新的功能可以使用第三方的SDK来实现,但是类似友盟,就不支持x86手机的自动更新,科大讯飞,弹窗是全局的,小米手机就会默认把弹窗权限关掉不允许弹出提 ...
- Android Camera2 预览功能实现
1. 概述 最近在做一些关于人脸识别的项目,需要用到 Android 相机的预览功能.网上查阅相关资料后,发现 Android 5.0 及以后的版本中,原有的 Camera API 已经被 Camer ...
- [转]Android 代码自动提示功能
源地址http://blog.sina.com.cn/s/blog_7dbac12501019mbh.html 或者http://blog.csdn.net/longvslove/article/de ...
- Android 代码自动提示功能
Eclipse for android 实现代码自动提示智能提示功能,介绍 Eclipse for android 编辑器中实现两种主要文件 java 与 xml 代码自动提示功能,解决 eclips ...
- Android Toast的多功能封装——Android开发之路1
Android封装实现各种功能的Toast GitHub地址:https://github.com/SibreiaDante/ToastUtils 效果图: 方法封装如下: showSingleton ...
随机推荐
- Silverlight 之 新建项目解析
新建一个silverlight项目(项目名称为SilverlightTest)后,若在" 新建Silverlight应用程序窗口 " 勾选 " 在新网站中承载Silver ...
- PHP表单-PHP $_POST 变量
PHP $_POST 变量 在 PHP 中,预定义的 $_POST 变量用于收集来自 method="post" 的表单中的值. $_POST 变量 预定义的 $_POST 变量用 ...
- java面试第八天
异常: 异常的分类 Java会将所有的异常封装成对象,其根本父类为Throwable. Throwable有两个子类:Error 和Exception. Error:一个Error对象表示一个程序错误 ...
- Linux下Tar压缩使用
具体的可以在linux环境下 用tar --help查看详细说明格式:tar [option] file -c create create a new archive -x extract extra ...
- java之Math
一.Math类 java.lang.Math提供了一系列静态方法用于科学计算:其方法的參数和返回值类型一般为double型. abs 绝对值 acos,asin,atan,cos,sin,ta ...
- newInstance() 的参数版本与无参数版本
通过反射创建新的类示例,有两种方式: Class.newInstance() Constructor.newInstance() 以下对两种调用方式给以比较说明: Class.newInstance ...
- linux 使用wc命令统计文件行数、字数及大小
语法:wc [选项] 文件… 说明:该命令统计给定文件中的字节数.字数.行数.如果没有给出文件名,则从标准输入读取.wc同时也给出所有指定文件的总统计数.字是由空格字符区分开的最大字符串. 该命令各选 ...
- NYOJ-------三角形
Problem A 三角形 时间限制:1000 ms | 内存限制:65535 KB 描述 在数学中,如果知道了三个点的坐标,我们就可以判断这三个点能否组成一个三角形:如果可以组成三角形,那么 ...
- JavaScript 中定义变量时有无var声明的区别
关于JavaScript中定义变量时有无var声明的区别 var a=5; //正确 a=5; //正确 在javascript中,以上两种方法都是定义变量的正确方法.微软的Script56.CHM中 ...
- iOS archive(归档)
归档是一种很常用的文件储存方法,几乎任何类型的对象都能够被归档储存(实际上是一种文件保存的形式),浏览网上的一些资料后,并结合自己的一些经验,总结成此文. 一.使用archiveRootObject进 ...