使用方法:
LineItemizedOverlay overlay = new LineItemizedOverlay();
overlay.addOverlay(/*起点的OverlayItem*/);
overlay.addOverlay(/*终点的OverlayItem*/);
overlay.addLinePoint(/*要画的轨迹的GeoPoint的List*/);
mapView.getOverlays().add(overlay);
/**
*
*/
package com.xtyon.tuola.truck.map;
import java.util.ArrayList;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.MapView;
import com.google.android.maps.OverlayItem;
import com.google.android.maps.Projection;
/**
* 地图上的线型图层:包括一个起点,一个终点,以及之间的曲线
* @author superwang
*/
public class LineItemizedOverlay extends ItemizedOverlay<OverlayItem> {
private static final int LAYER_FLAGS = Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG
| Canvas.HAS_ALPHA_LAYER_SAVE_FLAG | Canvas.FULL_COLOR_LAYER_SAVE_FLAG | Canvas.CLIP_TO_LAYER_SAVE_FLAG;
/**
* 用于保存起点/终点数据
*/
private final ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
/**
* 用于保存构成曲线的点的数据
*/
private final ArrayList<GeoPoint> linePoints = new ArrayList<GeoPoint>();
/**
* @param defaultMarker
*/
public LineItemizedOverlay() {
super(null);
// TODO Auto-generated constructor stub
}
/* (non-Javadoc)
* @see com.google.android.maps.ItemizedOverlay#createItem(int)
*/
@Override
protected OverlayItem createItem(int i) {
return mOverlays.get(i);
}
/* (non-Javadoc)
* @see com.google.android.maps.ItemizedOverlay#size()
*/
@Override
public int size() {
// TODO Auto-generated method stub
return mOverlays.size();
}
/**
* 调价起点/终点
* description:
* @param overlay
*/
public void addOverlay(OverlayItem overlay) {
mOverlays.add(overlay);
populate();
}
/**
* 添加曲线中的点
* description:
* @param point
*/
public void addLinePoint(GeoPoint point) {
linePoints.add(point);
}
public ArrayList<GeoPoint> getLinePoints() {
return linePoints;
}
/**
* 画起点/终点/轨迹
*/
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
if (!shadow) {
//System.out.println("!!!!!!!!!!!!!!");
canvas.save(LAYER_FLAGS);
//canvas.save();
Projection projection = mapView.getProjection();
int size = mOverlays.size();
Point point = new Point();
Paint paint = new Paint();
paint.setAntiAlias(true);
OverlayItem overLayItem;
//画起点/终点
for (int i = 0; i < size; i++) {
overLayItem = mOverlays.get(i);
Drawable marker = overLayItem.getMarker(0);
//marker.getBounds()
/* 象素点取得转换 */
projection.toPixels(overLayItem.getPoint(), point);
if (marker != null) {
boundCenterBottom(marker);
}
/* 圆圈 */
//Paint paintCircle = new Paint();
//paintCircle.setColor(Color.RED);
paint.setColor(Color.RED);
canvas.drawCircle(point.x, point.y, 5, paint);
/* 文字设置 */
/* 标题 */
String title = overLayItem.getTitle();
/* 简介 */
// String snippet = overLayItem.getSnippet();
//
// StringBuffer txt = new StringBuffer();
// if (title != null && !"".equals(title))
// txt.append(title);
//
// if (snippet != null && !"".equals(snippet)) {
// if (txt.length() > 0) {
// txt.append(":");
// }
// txt.append(snippet);
// }
//Paint paintText = new Paint();
if (title != null && title.length() > 0) {
paint.setColor(Color.BLACK);
paint.setTextSize(15);
canvas.drawText(title, point.x, point.y, paint);
}
}
//画线
boolean prevInBound = false;//前一个点是否在可视区域
Point prev = null;
int mapWidth = mapView.getWidth();
int mapHeight = mapView.getHeight();
//Paint paintLine = new Paint();
paint.setColor(Color.RED);
//paint.setPathEffect(new CornerPathEffect(10));
paint.setStrokeWidth(2);
int count = linePoints.size();
//Path path = new Path();
//path.setFillType(Path.FillType.INVERSE_WINDING);
for (int i = 0; i < count; i++) {
GeoPoint geoPoint = linePoints.get(i);
//projection.toPixels(geoPoint, point); //这一行似乎有问题
point = projection.toPixels(geoPoint, null);
if (prev != null) {
if (point.x >= 0 && point.x <= mapWidth && point.y >= 0 && point.y <= mapHeight) {
if ((Math.abs(prev.x - point.x) > 2 || Math.abs(prev.y - point.y) > 2)) {
//这里判断点是否重合,重合的不画线,可能会导致画线不在路上
canvas.drawLine(prev.x, prev.y, point.x, point.y, paint);
//path.lineTo(point.x, point.y);
prev = point;
prevInBound = true;
}
} else {
//在可视区与之外
if (prevInBound) {//前一个点在可视区域内,也需要划线
//path.lineTo(point.x, point.y);
canvas.drawLine(prev.x, prev.y, point.x, point.y, paint);
}
prev = point;
prevInBound = false;
}
} else {
//path.moveTo(point.x, point.y);
prev = point;
}
}
//canvas.drawPath(path, paint);
canvas.restore();
//DebugUtils.showMemory();
}
super.draw(canvas, mapView, shadow);
}
}
分享到:
相关推荐
综上所述,"Android百度地图画运动轨迹和GPS定位"这个项目涵盖了Android原生开发、百度地图API的使用、GPS定位技术、图形绘制、用户交互设计等多个方面,是一个综合性的实践练习,有助于提升Android开发者在地理位置...
在Android应用中记录轨迹,通常涉及到定位服务。我们可以使用百度地图SDK的LocationClient类获取实时位置。首先,创建LocationClient对象并设置监听器,然后启动服务: ```java LocationClient locationClient = ...
通过以上步骤,我们就实现了在百度地图Android SDK中拖拽overlay item的功能。这不仅可以用于地图标注的移动,还可以扩展到更复杂的应用场景,如自定义信息窗口、轨迹绘制等。在实际项目中,我们可能还需要处理更多...
Android API中的Overlay(com.google.android.maps.Overlay)类可以在MapView上绘制图形或添加图片。本范例实现了继承com.google.Android.maps.Overlay的MyOverlay类,并重写onDraw()方法,已达成在MapView上添加...
在Android开发中,集成百度地图并实现画线功能是一项常用且重要的任务,它可以帮助用户在地图上直观地展示路径或轨迹。本实例将探讨如何在Android应用中利用百度地图API来实现在地图上画线的功能。 首先,我们需要...
在Android开发中,百度地图API是一个强大的工具,它允许开发者集成地图功能到应用程序中,提供定位、导航、路径规划等多种服务。"Android百度地图覆盖层"这个知识点主要涉及如何在地图上显示自定义的图形元素,如...
Android SDKv2.1.0是适用于Android系统移动设备的矢量地图开发包,也是v2.0.0的升级... 修复多mapView切换,路线overlay相互影响 修复省级离线数据大小错误 更多详细信息,请参考官网的开发指南及Demo示例代码。
3. **地图绘制**:在地图上显示轨迹,需要将获取到的位置数据转换为地理坐标,然后利用MapView或MapView的overlay机制,创建自定义标记(Marker)或者线(Polyline)来描绘路径。 4. **实时更新**:为了实现实时...
在Android中,我们可以利用百度地图SDK的Overlay类来实现。每个定位点会被表示为一个Marker,通过动态更新Marker的位置,就可以实时展示用户行走的轨迹。 3. **定位跟踪** 百度地图API提供了定位服务,可以获取...
可以利用`MapView`和`Overlay`类实现地图上的轨迹绘制。 12. **地理围栏(Geofencing)** Android提供了`GeofencingApi`,可以创建虚拟地理边界,当用户进入或离开这些区域时,应用会收到通知。 13. **处理位置...
解析这些步骤,提取出每一段的经纬度,然后在地图上画线(通常使用Overlay类)连接这些点,形成路径。 总的来说,这个项目涵盖了Android开发中的几个关键知识点:SQLite数据库管理,GPS定位,地图集成以及路径规划...
在Android应用中展示地图,需要创建一个MapView对象,并将其添加到布局文件中。在代码中,可以通过MapView的getMap()方法获取到BaiduMap对象,然后调用setMapType()设置地图类型(如普通地图、卫星地图等),调用...
同时,开发者还可以利用Google Maps的覆盖层(Overlay)功能,自定义地图上的图标、标记或轨迹线,以实现丰富的地图交互。 在实际应用中,开发者还应注意处理位置权限,确保用户在需要时授予应用访问位置的权限。...
在地图上显示轨迹可能需要用到`MapView`类,通过它我们可以加载和交互地图,同时使用`Overlay`类或者`Polyline`类来绘制轨迹线。 此外,为了保证用户体验,还需要处理权限问题,例如请求用户授予访问位置的权限。在...
在Android开发中,集成百度地图并实现定位及展示周围人或物的功能是一项常见的需求,尤其在社交、服务类应用中,如本示例提到的E代驾应用首页。要实现这样的功能,开发者需要掌握以下几个核心知识点: 1. **百度...
2. **配置地图视图**:在布局文件中添加 `<com.google.android.gms.maps.MapView>` 组件。 3. **初始化地图**:在 Activity 或 Fragment 中初始化地图对象,并处理地图加载完成后的事件。 ##### 2.2 在 Android Map...
`Overlay`和`MapView`是实现这一功能的关键类,开发者需要创建`MarkerOptions`对象并调用`addOverlay()`方法。 3. **地图覆盖物(Overlay)**:除了标记,还可以添加自定义的覆盖物,如自定义形状、轨迹线等。通过...
Android百度地图API是百度为开发者提供的在Android平台上集成地图功能的SDK,它允许开发者轻松地将地图、定位、路线规划等功能整合到自己的应用程序中。通过这个API,开发者可以实现地图的显示、标注添加、地理编码...
2. **地图展示**:在你的Activity或Fragment中,你可以创建一个MapView对象,并将其添加到布局中。然后通过MapController设置地图的中心点、缩放级别等参数。地图的样式可以通过自定义地图样式文件来调整,以实现...
在实际开发中,自定义覆盖物的用途非常广泛,比如可以用来标记店铺位置、显示公交线路、绘制轨迹等。同时,百度地图还提供了其他高级特性,如动画效果、信息窗口(InfoWindow)、多图层管理等,可以进一步增强地图的...