com.mapbox.mapboxsdk.views.InfoWindow Maven / Gradle / Ivy
package com.mapbox.mapboxsdk.views;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.overlay.Marker;
/**
* A tooltip view
*/
public class InfoWindow {
private Marker boundMarker;
/**
* @param layoutResId the id of the view resource.
* @param mapView the mapview on which is hooked the view
*/
private MapView mMapView;
private boolean mIsVisible;
private View mView;
static int mTitleId = 0;
static int mDescriptionId = 0;
static int mSubDescriptionId = 0;
static int mImageId = 0;
public InfoWindow(int layoutResId, MapView mapView) {
mMapView = mapView;
mIsVisible = false;
ViewGroup parent = (ViewGroup) mapView.getParent();
Context context = mapView.getContext();
LayoutInflater inflater =
(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mView = inflater.inflate(layoutResId, parent, false);
if (mTitleId == 0) {
setResIds(mapView.getContext());
}
// default behavior: close it when clicking on the tooltip:
mView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent e) {
if (e.getAction() == MotionEvent.ACTION_UP) {
close();
}
return true;
}
});
}
public InfoWindow(View view, MapView mapView) {
mMapView = mapView;
mIsVisible = false;
ViewGroup parent = (ViewGroup) mapView.getParent();
Context context = mapView.getContext();
LayoutInflater inflater =
(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mView = view;
// default behavior: close it when clicking on the tooltip:
mView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent e) {
if (e.getAction() == MotionEvent.ACTION_UP) {
close();
}
return true;
}
});
}
/**
* open the window at the specified position.
*
* @param object the graphical object on which is hooked the view
* @param position to place the window on the map
* @param offsetX (&offsetY) the offset of the view to the position, in pixels.
* This allows to offset the view from the object position.
* @return this infowindow
*/
public InfoWindow open(Marker object, LatLng position, int offsetX, int offsetY) {
onOpen(object);
MapView.LayoutParams lp = new MapView.LayoutParams(MapView.LayoutParams.WRAP_CONTENT,
MapView.LayoutParams.WRAP_CONTENT, position, MapView.LayoutParams.BOTTOM_CENTER,
offsetX, offsetY);
close(); //if it was already opened
mMapView.addView(mView, lp);
mIsVisible = true;
return this;
}
/**
* Close this InfoWindow if it is visible, otherwise don't do anything.
* @return this info window
*/
public InfoWindow close() {
if (mIsVisible) {
mIsVisible = false;
((ViewGroup) mView.getParent()).removeView(mView);
this.boundMarker.blur();
setBoundMarker(null);
onClose();
}
return this;
}
/**
* Returns the Android view. This allows to set its content.
*
* @return the Android view
*/
public View getView() {
return mView;
}
/**
* Returns the mapView this InfoWindow is bound to
*
* @return the mapView
*/
public MapView getMapView() {
return mMapView;
}
/**
* Constructs the view that is displayed when the InfoWindow opens.
* This retrieves data from overlayItem and shows it in the tooltip.
*
* @param overlayItem the tapped overlay item
*/
public void onOpen(Marker overlayItem) {
String title = overlayItem.getTitle();
((TextView) mView.findViewById(mTitleId /*R.id.title*/)).setText(title);
String snippet = overlayItem.getDescription();
((TextView) mView.findViewById(mDescriptionId /*R.id.description*/)).setText(snippet);
//handle sub-description, hiding or showing the text view:
TextView subDescText = (TextView) mView.findViewById(mSubDescriptionId);
String subDesc = overlayItem.getSubDescription();
if ("".equals(subDesc)) {
subDescText.setVisibility(View.GONE);
} else {
subDescText.setText(subDesc);
subDescText.setVisibility(View.VISIBLE);
}
}
public void onClose() {
//by default, do nothing
}
public InfoWindow setBoundMarker(Marker aBoundMarker) {
this.boundMarker = aBoundMarker;
return this;
}
public Marker getBoundMarker() {
return boundMarker;
}
/**
* Given a context, set the resource ids for the layout
* of the InfoWindow.
* @param context
*/
private static void setResIds(Context context) {
String packageName = context.getPackageName(); //get application package name
mTitleId = context.getResources().getIdentifier("id/tooltip_title", null, packageName);
mDescriptionId =
context.getResources().getIdentifier("id/tooltip_description", null, packageName);
mSubDescriptionId = context.getResources()
.getIdentifier("id/tooltip_subdescription", null, packageName);
mImageId = context.getResources().getIdentifier("id/tooltip_image", null, packageName);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy