public class BalloonOverlayView<Item extends OverlayItem> extends FrameLayout {
protected LinearLayout layout;
protected TextView title;
protected TextView snippet;
protected LayoutInflater layoutinflater;
protected View balloonview;
protected ImageView imgclose;
protected int getIdView(){return R.layout.window_balloon_overlay;}
public BalloonOverlayView(final Context context, int balloonBottomOffset) {
super(context);
setPadding(10, 0, 10, balloonBottomOffset);
layout = new LinearLayout(context);
layout.setVisibility(VISIBLE);
layoutinflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
balloonview = layoutinflater.inflate(getIdView(), layout);
title = (TextView) balloonview.findViewById(R.id.balloon_item_title);
snippet = (TextView) balloonview.findViewById(R.id.balloon_item_snippet);
title.setVisibility(GONE);
snippet.setVisibility(GONE);
imgclose = (ImageView) balloonview.findViewById(R.id.close_img_button);
imgclose.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);
}
public void setData(Item item, Context mContext) {
layout.setVisibility(VISIBLE);
if (item.getTitle() != null && item.getTitle().length() > 0) {
title.setVisibility(VISIBLE);
title.setText(item.getTitle());
} else {
title.setVisibility(GONE);
}
if (item.getSnippet() != null && item.getSnippet().length() > 0) {
snippet.setVisibility(VISIBLE);
snippet.setText(item.getSnippet());
} else {
snippet.setVisibility(GONE);
}
}
}
public abstract class BalloonItemizedOverlay<Item extends OverlayItem> extends ItemizedOverlay<Item> {
private MapView mapView;
private BalloonOverlayView<Item> balloonView;
private View clickRegion;
private int viewOffset;
final MapController mc;
private Item currentFocussedItem;
private int currentFocussedIndex;
private Context mContext;
public BalloonItemizedOverlay(Drawable defaultMarker, MapView mapView) {
super(defaultMarker);
mContext = mapView.getContext();
this.mapView = mapView;
viewOffset = 0;
mc = mapView.getController();
}
public void setBalloonBottomOffset(int pixels) {
viewOffset = pixels;
}
public int getBalloonBottomOffset() {
return viewOffset;
}
protected boolean onBalloonTap(int index, Item item) {
return false;
}
@Override
protected final boolean onTap(int index) {
currentFocussedIndex = index;
currentFocussedItem = createItem(index);
boolean isRecycled;
if (balloonView == null) {
balloonView = createBalloonOverlayView();
clickRegion = (View) balloonView.findViewById(R.id.balloon_inner_layout);
clickRegion.setOnTouchListener(createBalloonTouchListener());
isRecycled = false;
} else {
isRecycled = true;
}
balloonView.setVisibility(View.GONE);
List<Overlay> mapOverlays = mapView.getOverlays();
if (mapOverlays.size() > 1) {
hideOtherBalloons(mapOverlays);
}
balloonView.setData(currentFocussedItem, mContext);
GeoPoint point = currentFocussedItem.getPoint();
MapView.LayoutParams params = new MapView.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, point,
MapView.LayoutParams.BOTTOM_CENTER);
params.mode = MapView.LayoutParams.MODE_MAP;
balloonView.setVisibility(View.VISIBLE);
if (isRecycled) {
balloonView.setLayoutParams(params);
} else {
mapView.addView(balloonView, params);
}
mc.animateTo(point);
return true;
}
protected BalloonOverlayView<Item> createBalloonOverlayView() {
return new BalloonOverlayView<Item>(getMapView().getContext(), getBalloonBottomOffset());
}
protected MapView getMapView() {
return mapView;
}
protected void hideBalloon() {
if (balloonView != null) {
balloonView.setVisibility(View.GONE);
}
}
private void hideOtherBalloons(List<Overlay> overlays) {
for (Overlay overlay : overlays) {
if (overlay instanceof BalloonItemizedOverlay<?> && overlay != this) {
((BalloonItemizedOverlay<?>) overlay).hideBalloon();
}
}
}
private OnTouchListener createBalloonTouchListener() {
return 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();
}
onBalloonTap(currentFocussedIndex, currentFocussedItem);
return true;
} else {
return false;
}
}
};
}
}
public class MapItemizedOverlay extends BalloonItemizedOverlay<OverlayItem> {
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
public MapItemizedOverlay(Drawable defaultMarker, Context context, MapView mapview) {
super(boundCenter(defaultMarker),mapview);
}
public void addOverlay(OverlayItem overlay) {
mOverlays.add(overlay);
populate();
}
@Override
protected OverlayItem createItem(int i) {
return mOverlays.get(i);
}
@Override
protected boolean onBalloonTap(int index, OverlayItem item) {
return true;
}
@Override
public int size() {
return mOverlays.size();
}
}
Una vez listas las imágenes vamos a crear el layout de nuestro balloon al cual llamaremos window_balloon_overlay.xml y va a tener los siguientes elementos. Fijaros que he puesto los estilos en el mismo layout pero es recomendable que os hagáis unos estilos en el archivo styles.xml, de esta forma conseguireis simplificar el layout y verlo más claro y os será más fácil adaptarlo para diferentes tamaños de pantalla:
<?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:paddingLeft="35dip" android:paddingRight="35dip">
<RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content">
<LinearLayout android:id="@+id/balloon_main_layout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:paddingBottom="35dip" android:paddingLeft="10dip" android:minWidth="200dip" android:background="@drawable/balloon_overlay_bg" android:paddingTop="0dip" android:paddingRight""0dip" android:layout_marginTop="3dip" android:layout_marginRight="3dip">
<LinearLayout android:id="@+id/balloon_inner_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_weight="1" android:paddingTop="10dip">
<TextView android:id="@+id/balloon_item_title" android:layout_width="fill_parent" android:layout_height="wrap_content"></TextView>
<TextView android:id="@+id/balloon_item_snippet" android:layout_width="fill_parent" android:layout_height="wrap_content"></TextView>
</LinearLayout>
</LinearLayout>
<ImageView android:id="@+id/close_img_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/close_img_button" android:layout_alignParentRight="true" android:layout_alignParentTop="true" />
</RelativeLayout>
</LinearLayout>
protected List<Overlay> mapOverlays;
mapOverlays = mapView.getOverlays();
Drawable drawable = getResources().getDrawable(R.drawable.marker);
OverlayItem overlayItem = new OverlayItem(new GeoPoint(0,0), "titulo", "descripcion");
MapItemizedOverlay itemizedoverlay = new MapItemizedOverlay(drawable, mapView.getContext(), mapView);
itemizedoverlay.addOverlay(overlayItem);
mapOverlays.add(itemizedoverlay);
Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información. ACEPTAR