Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

first commit

  • Loading branch information...
commit 5ebc6de3c2e37f06c59af195fe11aa796304983e 0 parents
Jeff Gilfelt authored
7 .classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="src" path="gen"/>
+ <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
3  .gitignore
@@ -0,0 +1,3 @@
+local.properties
+bin/
+gen/
33 .project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>android-mapviewballoons</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.android.ide.eclipse.adt.ApkBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>com.android.ide.eclipse.adt.AndroidNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
20 AndroidManifest.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ android:versionCode="1"
+ android:versionName="1.0" package="mapviewballoons.example">
+ <application android:icon="@drawable/icon" android:label="@string/app_name">
+ <activity android:name=".MyMap"
+ android:label="@string/app_name">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+
+
+ <uses-library android:name="com.google.android.maps" />
+</application>
+ <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="6"/>
+
+<uses-permission android:name="android.permission.INTERNET"></uses-permission>
+</manifest>
203 LICENSE
@@ -0,0 +1,203 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
4 README.markdown
@@ -0,0 +1,4 @@
+Android MapView Balloons
+========================
+
+tbc...
13 default.properties
@@ -0,0 +1,13 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system use,
+# "build.properties", and override values to adapt the script to your
+# project structure.
+
+# Indicates whether an apk should be generated for each density.
+split.density=false
+# Project target.
+target=Google Inc.:Google APIs:4
BIN  res/drawable-hdpi/balloon_overlay_close.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  res/drawable-hdpi/balloon_overlay_focused.9.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  res/drawable-hdpi/balloon_overlay_unfocused.9.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  res/drawable-hdpi/icon.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  res/drawable-hdpi/marker.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  res/drawable-mdpi/balloon_overlay_close.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  res/drawable-mdpi/balloon_overlay_focused.9.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  res/drawable-mdpi/balloon_overlay_unfocused.9.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  res/drawable-mdpi/icon.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  res/drawable-mdpi/marker.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 res/drawable/balloon_overlay_bg_selector.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:state_pressed="true"
+ android:drawable="@drawable/balloon_overlay_focused" />
+ <item
+ android:state_pressed="false"
+ android:drawable="@drawable/balloon_overlay_unfocused" />
+</selector>
43 res/layout/balloon_map_overlay.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:paddingBottom="35dip"
+ android:paddingLeft="10dip"
+ android:minWidth="200dip"
+ android:id="@+id/balloon_main_layout"
+ android:background="@drawable/balloon_overlay_bg_selector"
+ android:paddingTop="0dip"
+ android:paddingRight="0dip">
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:layout_weight="1"
+ android:paddingTop="10dip"
+ android:id="@+id/balloon_inner_layout">
+ <TextView android:layout_height="wrap_content"
+ android:layout_width="fill_parent"
+ android:id="@+id/balloon_item_title"
+ android:text="balloon_item_title"
+ android:textSize="16dip"
+ android:textColor="#FF000000"></TextView>
+ <TextView android:layout_height="wrap_content"
+ android:layout_width="fill_parent"
+ android:id="@+id/balloon_item_snippet"
+ android:text="balloon_item_snippet"
+ android:textSize="12dip"></TextView>
+ </LinearLayout>
+
+ <ImageView android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/balloon_overlay_close"
+ android:id="@+id/close_img_button"
+ android:paddingLeft="10dip"
+ android:paddingBottom="10dip"
+ android:paddingRight="8dip"
+ android:paddingTop="8dip"></ImageView>
+
+</LinearLayout>
11 res/layout/main.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/mainlayout" android:orientation="vertical"
+ android:layout_width="fill_parent" android:layout_height="fill_parent">
+
+ <com.google.android.maps.MapView
+ android:id="@+id/mapview" android:layout_width="fill_parent"
+ android:layout_height="fill_parent" android:clickable="true"
+ android:apiKey="YOUR_API_KEY" />
+
+</RelativeLayout>
4 res/values/strings.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="app_name">MapView Balloons Example</string>
+</resources>
180 src/com/readystatesoftware/mapviewballoons/BalloonItemizedOverlay.java
@@ -0,0 +1,180 @@
+/***
+ * Copyright (c) 2010 readyState Software Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License. You may obtain
+ * a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.readystatesoftware.mapviewballoons;
+
+import mapviewballoons.example.R;
+
+import java.lang.reflect.Method;
+
+import android.graphics.drawable.Drawable;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.View.OnTouchListener;
+import android.view.ViewGroup.LayoutParams;
+
+import com.google.android.maps.GeoPoint;
+import com.google.android.maps.ItemizedOverlay;
+import com.google.android.maps.MapController;
+import com.google.android.maps.MapView;
+import com.google.android.maps.OverlayItem;
+
+/**
+ * An abstract extension of ItemizedOverlay for displaying an information balloon
+ * upon screen-tap of each marker overlay.
+ *
+ * @author Jeff Gilfelt
+ */
+public abstract class BalloonItemizedOverlay<Item> extends ItemizedOverlay<OverlayItem> {
+
+ private MapView mapView;
+ private BalloonOverlayView balloonView;
+ private View clickRegion;
+ private int viewOffset;
+ final MapController mc;
+
+ /**
+ * Create a new BalloonItemizedOverlay
+ *
+ * @param defaultMarker - A bounded Drawable to be drawn on the map for each item in the overlay.
+ * @param mapView - The view upon which the overlay items are to be drawn.
+ */
+ public BalloonItemizedOverlay(Drawable defaultMarker, MapView mapView) {
+ super(defaultMarker);
+ this.mapView = mapView;
+ viewOffset = 0;
+ mc = mapView.getController();
+ }
+
+ /**
+ * Set the horizontal distance between the marker and the bottom of the information
+ * balloon. The default is 0 which works well for center bounded markers. If your
+ * marker is center-bottom bounded, call this before adding overlay items to ensure
+ * the balloon hovers exactly above the marker.
+ *
+ * @param pixels - The padding between the center point and the bottom of the
+ * information balloon.
+ */
+ public void setBalloonBottomOffset(int pixels) {
+ viewOffset = pixels;
+ }
+
+ /**
+ * Override this method to handle a "tap" on a balloon. By default, does nothing
+ * and returns false.
+ *
+ * @param index - The index of the item whose balloon is tapped.
+ * @return true if you handled the tap, otherwise false.
+ */
+ protected boolean onBalloonTap(int index) {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see com.google.android.maps.ItemizedOverlay#onTap(int)
+ */
+ @Override
+ protected final boolean onTap(int index) {
+
+ boolean isRecycled;
+ final int thisIndex;
+ GeoPoint point;
+
+ thisIndex = index;
+ point = createItem(index).getPoint();
+
+ if (balloonView == null) {
+ balloonView = new BalloonOverlayView(mapView.getContext(), viewOffset);
+ clickRegion = (View) balloonView.findViewById(R.id.balloon_inner_layout);
+ isRecycled = false;
+ } else {
+ isRecycled = true;
+ }
+
+ balloonView.setVisibility(View.GONE);
+
+ balloonView.setData(createItem(index));
+
+ MapView.LayoutParams params = new MapView.LayoutParams(
+ LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, point,
+ MapView.LayoutParams.BOTTOM_CENTER);
+ params.mode = MapView.LayoutParams.MODE_MAP;
+
+ setBalloonTouchListener(thisIndex);
+
+ balloonView.setVisibility(View.VISIBLE);
+
+ if (isRecycled) {
+ balloonView.setLayoutParams(params);
+ } else {
+ mapView.addView(balloonView, params);
+ }
+
+ mc.animateTo(point);
+
+ return true;
+ }
+
+ /**
+ * Sets the onTouchListener for the balloon being displayed, calling the
+ * overridden onBalloonTap if implemented.
+ *
+ * @param thisIndex - The index of the item whose balloon is tapped.
+ */
+ private void setBalloonTouchListener(final int thisIndex) {
+
+ try {
+ @SuppressWarnings("unused")
+ Method m = this.getClass().getDeclaredMethod("onBalloonTap", int.class);
+
+ clickRegion.setOnTouchListener(new OnTouchListener() {
+ public boolean onTouch(View v, MotionEvent event) {
+
+ View l = ((View) v.getParent()).findViewById(R.id.balloon_main_layout);
+ Drawable d = l.getBackground();
+
+ if (event.getAction() == MotionEvent.ACTION_DOWN) {
+ int[] states = {android.R.attr.state_pressed};
+ if (d.setState(states)) {
+ d.invalidateSelf();
+ }
+ return true;
+ } else if (event.getAction() == MotionEvent.ACTION_UP) {
+ int newStates[] = {};
+ if (d.setState(newStates)) {
+ d.invalidateSelf();
+ }
+ // call overridden method
+ onBalloonTap(thisIndex);
+ return true;
+ } else {
+ return false;
+ }
+
+ }
+ });
+
+ } catch (SecurityException e) {
+ Log.e("BalloonItemizedOverlay", "setBalloonTouchListener reflection SecurityException");
+ return;
+ } catch (NoSuchMethodException e) {
+ // method not overridden - do nothing
+ return;
+ }
+
+ }
+
+}
113 src/com/readystatesoftware/mapviewballoons/BalloonOverlayView.java
@@ -0,0 +1,113 @@
+/***
+ * Copyright (c) 2010 readyState Software Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License. You may obtain
+ * a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.readystatesoftware.mapviewballoons;
+
+import mapviewballoons.example.R;
+
+import android.content.Context;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.google.android.maps.OverlayItem;
+
+/**
+ * A view representing a MapView marker information balloon.
+ * <p>
+ * This class has a number of Android resource dependencies:
+ * <ul>
+ * <li>drawable/balloon_overlay_bg_selector.xml</li>
+ * <li>drawable/balloon_overlay_close.png</li>
+ * <li>drawable/balloon_overlay_focused.9.png</li>
+ * <li>drawable/balloon_overlay_unfocused.9.png</li>
+ * <li>layout/balloon_map_overlay.xml</li>
+ * </ul>
+ * </p>
+ *
+ * @author Jeff Gilfelt
+ *
+ */
+public class BalloonOverlayView extends FrameLayout {
+
+ private LinearLayout layout;
+ private TextView title;
+ private TextView snippet;
+
+ /**
+ * Create a new BalloonOverlayView.
+ *
+ * @param context - The activity context.
+ * @param balloonBottomOffset - The bottom padding (in pixels) to be applied
+ * when rendering this view.
+ */
+ public BalloonOverlayView(Context context, int balloonBottomOffset) {
+
+ super(context);
+
+ setPadding(10, 0, 10, balloonBottomOffset);
+ layout = new LinearLayout(context);
+ layout.setVisibility(VISIBLE);
+
+ LayoutInflater inflater = (LayoutInflater) context
+ .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ View v = inflater.inflate(R.layout.balloon_map_overlay, layout);
+ title = (TextView) v.findViewById(R.id.balloon_item_title);
+ snippet = (TextView) v.findViewById(R.id.balloon_item_snippet);
+
+ ImageView close = (ImageView) v.findViewById(R.id.close_img_button);
+ close.setOnClickListener(new OnClickListener() {
+ public void onClick(View v) {
+ layout.setVisibility(GONE);
+ }
+ });
+
+ FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
+ LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+ params.gravity = Gravity.NO_GRAVITY;
+
+ addView(layout, params);
+
+ }
+
+ /**
+ * Sets the view data from a given overlay item.
+ *
+ * @param item - The overlay item containing the relevant view data
+ * (title and snippet).
+ */
+ public void setData(OverlayItem item) {
+
+ layout.setVisibility(VISIBLE);
+ if (item.getTitle() != null) {
+ title.setVisibility(VISIBLE);
+ title.setText(item.getTitle());
+ } else {
+ title.setVisibility(GONE);
+ }
+ if (item.getSnippet() != null) {
+ snippet.setVisibility(VISIBLE);
+ snippet.setText(item.getSnippet());
+ } else {
+ snippet.setVisibility(GONE);
+ }
+
+ }
+
+}
61 src/mapviewballoons/example/MyItemizedOverlay.java
@@ -0,0 +1,61 @@
+/***
+ * Copyright (c) 2010 readyState Software Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License. You may obtain
+ * a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package mapviewballoons.example;
+
+import java.util.ArrayList;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.widget.Toast;
+
+import com.google.android.maps.MapView;
+import com.google.android.maps.OverlayItem;
+
+import com.readystatesoftware.mapviewballoons.BalloonItemizedOverlay;
+
+public class MyItemizedOverlay extends BalloonItemizedOverlay<OverlayItem> {
+
+ private ArrayList<OverlayItem> m_overlays = new ArrayList<OverlayItem>();
+ private Context c;
+
+ public MyItemizedOverlay(Drawable defaultMarker, MapView mapView) {
+ super(boundCenter(defaultMarker), mapView);
+ c = mapView.getContext();
+ }
+
+ public void addOverlay(OverlayItem overlay) {
+ m_overlays.add(overlay);
+ populate();
+ }
+
+ @Override
+ protected OverlayItem createItem(int i) {
+ return m_overlays.get(i);
+ }
+
+ @Override
+ public int size() {
+ return m_overlays.size();
+ }
+
+ @Override
+ protected boolean onBalloonTap(int index) {
+ Toast.makeText(c, "onBalloonTap for overlay index " + index,
+ Toast.LENGTH_LONG).show();
+ return true;
+ }
+
+}
78 src/mapviewballoons/example/MyMap.java
@@ -0,0 +1,78 @@
+/***
+ * Copyright (c) 2010 readyState Software Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License. You may obtain
+ * a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package mapviewballoons.example;
+
+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.MapController;
+import com.google.android.maps.MapView;
+import com.google.android.maps.Overlay;
+import com.google.android.maps.OverlayItem;
+
+public class MyMap extends MapActivity {
+
+ MapView mapView;
+ List<Overlay> mapOverlays;
+ Drawable drawable;
+ MyItemizedOverlay itemizedOverlay;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
+
+ mapView = (MapView) findViewById(R.id.mapview);
+ mapView.setBuiltInZoomControls(true);
+
+ mapOverlays = mapView.getOverlays();
+ drawable = getResources().getDrawable(R.drawable.marker);
+ itemizedOverlay = new MyItemizedOverlay(drawable, mapView);
+
+ GeoPoint point = new GeoPoint((int)(51.5174723*1E6),(int)(-0.0899537*1E6));
+ OverlayItem overlayItem = new OverlayItem(point, "Tomorrow Never Dies (1997)",
+ "(M gives Bond his mission in Daimler car)");
+ itemizedOverlay.addOverlay(overlayItem);
+
+ GeoPoint point2 = new GeoPoint((int)(51.515259*1E6),(int)(-0.086623*1E6));
+ OverlayItem overlayItem2 = new OverlayItem(point2, "GoldenEye (1995)",
+ "(Interiors Russian defence ministry council chambers in St Petersburg)");
+ itemizedOverlay.addOverlay(overlayItem2);
+
+ GeoPoint point3 = new GeoPoint((int)(51.51738*1E6),(int)(-0.08186*1E6));
+ OverlayItem overlayItem3 = new OverlayItem(point3, "Mission: Impossible (1996)",
+ "(Ethan & Jim cafe meeting)");
+ itemizedOverlay.addOverlay(overlayItem3);
+
+ mapOverlays.add(itemizedOverlay);
+
+ final MapController mc = mapView.getController();
+ mc.animateTo(point2);
+ mc.setZoom(16);
+
+ }
+
+ @Override
+ protected boolean isRouteDisplayed() {
+ return false;
+ }
+
+}
Please sign in to comment.
Something went wrong with that request. Please try again.