`
jayghost
  • 浏览: 441785 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

如何在Android中点击overlay弹出带尾巴的气泡

阅读更多

1.在res/layout目录下建立pop view的xml文件:overlay_pop.xml

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:background="@drawable/bubble_background"
	android:layout_width="wrap_content" android:layout_height="wrap_content"
	android:paddingLeft="5px" android:paddingTop="5px"
	android:paddingRight="5px" android:paddingBottom="20px">
	<TextView android:id="@+id/map_bubbleTitle" android:ellipsize="marquee"
		style="@style/map_BubblePrimary" android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:gravity="center_horizontal"
		android:singleLine="true" />
	<TextView android:id="@+id/map_bubbleText" style="@style/map_BubbleSecondary"
		android:layout_width="fill_parent" android:layout_height="wrap_content"
		android:singleLine="false" />
</LinearLayout>

 

 其中用到的style是放在res/values中的style.xml

 

<?xml version="1.0" encoding="utf-8"?>
<resources>
	<style name="map_BubblePrimary">
		<item name="android:textStyle">bold</item>
		<item name="android:typeface">monospace</item>
		<item name="android:textColor">#000</item>
	</style>
	<style name="map_BubbleSecondary">
		<item name="android:textStyle">italic</item>
		<item name="android:textColor">#000</item>
	</style>
</resources>

 

 另外,作为背景的bubble_background图片是采用采用9.png的格式:

在onCreate中:

MapView是继承自ViewGroup 的,因此,MapView有addView()方法,同时还有MapView.LayoutParams
MapView.LayoutParams 可以根据GeoPoint来定位,我就是利用这个特性来定位弹出的popView的.

 

View popView = View.inflate(this, R.layout.overlay_pop, null);
mapView.addView(popView, new MapView.LayoutParams(MapView.LayoutParams.WRAP_CONTENT,
		MapView.LayoutParams.WRAP_CONTENT, null, MapView.LayoutParams.BOTTOM_CENTER));
popView.setVisibility(View.GONE);

 

 2.实现点击某个Overlay弹出popView。

overlay有onTap()方法,你可以实现自己的overlay onTap()方法,弹出popView,
也可以使用setOnFocusChangeListener(),在listener中实现弹出popView,.
我是用的listener,因为setOnFocusChangeListener在失去焦点也会触发,我可以再失去焦点的时候隐藏popView.

 

/**
	 * 气泡窗口监听器
	 */
	private final ItemizedOverlay.OnFocusChangeListener onFocusChangeListener = new ItemizedOverlay.OnFocusChangeListener() {
		@Override
		public void onFocusChanged(ItemizedOverlay overlay, OverlayItem newFocus) {
			// 创建气泡窗口
			if (popView != null) {
				popView.setVisibility(View.GONE);
			}
			if (newFocus != null) {
				MapView.LayoutParams geoLP = (MapView.LayoutParams) popView.getLayoutParams();
				geoLP.point = newFocus.getPoint();// 这行用于popView的定位
				TextView title = (TextView) popView.findViewById(R.id.map_bubbleTitle);
				title.setText(newFocus.getTitle());
				TextView desc = (TextView) popView.findViewById(R.id.map_bubbleText);
				if (newFocus.getSnippet() == null || newFocus.getSnippet().length() == 0) {
					desc.setVisibility(View.GONE);
				} else {
					desc.setVisibility(View.VISIBLE);
					desc.setText(newFocus.getSnippet());
				}
				mapView.updateViewLayout(popView, geoLP);
				popView.setVisibility(View.VISIBLE);
			}
		}
	};

 3.自己实现一个继承自ItemizedOverlay的Overlay,

Overlay中有一个

 

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> overlayItems = new ArrayList<OverlayItem>();

 

 和用于向overlayItems中添加OverlayItem的方法

 

public void addOverlay(OverlayItem overlay) {
	overlayItems.add(overlay);
	populate();
}

在override的draw方法中

@Override
	public void draw(Canvas canvas, MapView mapView, boolean shadow) {
		if (!shadow) {
			canvas.save(LAYER_FLAGS);

			Projection projection = mapView.getProjection();
			int size = overlayItems.size();
			Point point = new Point();
			Paint paint = new Paint();
			paint.setAntiAlias(true);
			OverlayItem overLayItem;

			for (int i = 0; i < size; i++) {
				overLayItem = overlayItems.get(i);

				Drawable marker = overLayItem.getMarker(0);
				// marker.getBounds()
				/* 象素点取得转换 */
				projection.toPixels(overLayItem.getPoint(), point);

				if (marker != null) {
					boundCenterBottom(marker);
				}

				/* 圆圈 */
				paint.setColor(Color.RED);
				canvas.drawCircle(point.x, point.y, 5, paint);

				/* 标题 */
				String title = overLayItem.getTitle();

				if (title != null && title.length() > 0) {
					paint.setColor(Color.BLACK);
					paint.setTextSize(15);
					canvas.drawText(title, point.x, point.y, paint);
				}
			}

			canvas.restore();
		}
		super.draw(canvas, mapView, shadow);
	}

 

在onCreate中初始化

 

overlay.addOverlay(new OverlayItem(pointQSH, "清水河", "清水河校区"));
overlay.addOverlay(new OverlayItem(pointSH, "沙河", "沙河校区"));
overlay.setOnFocusChangeListener(onFocusChangeListener);
mapView.getOverlays().add(overlay);

 OK,实现效果:

 

 

 

 

注:本文参加第二届 Google 暑期大学生博客分享大赛 - 2011 Android 成长篇 

  • 大小: 1.3 KB
  • 大小: 4.3 KB
分享到:
评论
2 楼 清爽无比 2011-10-19  
不错的文章!
1 楼 一岁打过熊 2011-07-11  
感谢楼主分享。

相关推荐

    ANDROID中点中OVERLAY弹出带尾巴的气泡的实现

    在Android开发中,创建带有尾巴的气泡...通过以上步骤,你可以实现在Android的MapVeiw中,当用户点击OVERLAY时,弹出一个带有尾巴的气泡View,显示相关的文字信息。这个功能在地图应用中非常实用,能有效提升用户体验。

    Android 高德地图自定义点聚合marker图片及Overlay点击选中功能

    - 记得在`onClusterClick()`方法中处理点击事件,通常会弹出一个信息窗口或者进行其他操作。 2. **Overlay点击选中功能**: - 首先,创建一个自定义的`MapView`,继承自`com.amap.api.maps.MapView`,并在其中...

    百度地图android sdk拖拽overlay item

    在百度地图Android SDK中,Overlay Item通常表示地图上的一个特定标记或图标,例如用户的位置、兴趣点等。拖拽功能允许用户通过手指操作移动这些标记,这在需要动态调整位置或进行交互式操作的场景下非常有用。 ...

    android 百度地图ItemsOverlay的使用

    总之,ItemsOverlay是Android中实现百度地图自定义覆盖物的重要工具,通过它我们可以实现各种丰富的地图交互功能,如点击overlay弹出带尾巴的气泡。通过不断学习和实践,你可以更好地掌握这一技术,为用户提供更加...

    android地图使用overlay添加标记

    `Overlay`是Android SDK中用于在地图上绘制图形或文本的对象,它允许我们在地图上添加自定义的图标或标注。 首先,我们需要在项目中引入Google Maps API。在`build.gradle`文件中添加依赖: ```groovy ...

    android从底部弹出qq样式窗体

    1. **`WindowManager`服务**:在Android中,`WindowManager`是一个系统服务,它允许应用程序添加、移除或更新视图到窗口管理器的层次结构中。通过`Context.getSystemService(Context.WINDOW_SERVICE)`可以获取到`...

    地图气泡框应用

    `Popup`在地图应用中通常指的是临时弹出的窗口,它能以轻量级的形式展示一些额外信息,不会遮挡地图的主要视图。在高德地图API中,`Popup`是用于在地图上添加可交互的信息窗口,它可以包含文字、图片甚至是复杂的...

    安卓Android源码——百度地图点击标注,弹出窗口.rar

    5. **创建弹出窗口**:在Android中,我们可以使用PopupWindow或者自定义对话框来实现弹出窗口。PopupWindow允许在屏幕任意位置显示,而自定义对话框则更加规范化。这里假设我们使用PopupWindow,创建并显示弹出窗口...

    Android代码-仿百度地图气泡程序源码.zip

    在该方法中,你可以检查点击的位置是否与气泡重合,然后执行相应的操作,如弹出信息窗口、导航到特定位置等。 4. **地理坐标与屏幕像素转换**: 在Android地图上处理点击事件时,需要将地图上的地理坐标(经纬度)...

    浅析Android Service中实现弹出对话框的坑

    在 Android 6.0 及更高版本中,popup window 需要使用 TYPE_APPLICATION_OVERLAY 类型,否则将无法正常显示弹出框。在 AndroidManifest.xml 中需要声明对应的权限: `&lt;uses-permission android:name="android....

    详解Android 全局弹出对话框SYSTEM_ALERT_WINDOW权限

    在Android开发中,全局弹出对话框是一种常见需求,特别是在某些特定场景下,如通知用户、请求确认或显示重要信息。然而,为了实现全局对话框,开发者需要掌握一种特殊的权限,即`SYSTEM_ALERT_WINDOW`权限。这个权限...

    Android google Map地图学习

    此资料包含 Android学习笔记 - 地图.doc 通过地名获得经纬度并标识在...点中overlay弹出带尾巴的气泡的实现.doc 传递坐标到Google地图.doc android map.doc Android地图和定位学习总结 .doc 希望对大家有帮助。。。。

    Android代码-voice-overlay-android

    Voice overlay helps you turn your user's voice into text, providing a polished UX while handling for you the necessary permission. Demo You can clone this repo, then run the Demo ...

    Android平台Overlay机制中文最新版本

    Android overlay 机制允许在不修改packages中apk的情况下,来自定义 framework和package中的资源文件,实现资源的定制。来达到显示不同的UI得目的(如MIUI)。 希望本文档会给有需要的朋友带来帮助;感兴趣的朋友...

    Android高级应用源码-百度地图点击标注,弹出窗口.zip

    在描述中提到的“弹出窗口”,在Android中可能指的是对话框(Dialog)或者InfoWindow(信息窗)。对于InfoWindow,它是百度地图API提供的一种轻量级的弹窗,用于展示标注的详细信息。我们可以通过设置`Marker`的`...

    在指定位置出现提示气泡

    一个常见的需求是在地图上的特定位置显示提示信息或者警告,通常通过在指定位置弹出一个带有指向该位置标记的“气泡”来实现这一目的。这种气泡提示不仅能够增强用户体验,还能够让用户更加清晰地了解当前位置的重要...

    android overlay系统 overlay的硬件抽象层 camera系统与上层接口和硬件抽象层

    在Android的视频输出架构中,Overlay系统扮演着至关重要的角色。它提供了一个叠加在主显示层上的额外显示层,主要用于视频输出或摄像头预览。Overlay系统通过`ISurface`接口进行操作,该接口允许创建、注册和管理...

Global site tag (gtag.js) - Google Analytics