Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

Commit

Permalink
[android] #5214 - remove requirement adapter for MarkerView, allow us…
Browse files Browse the repository at this point in the history
…ing Icon instead
  • Loading branch information
tobrun committed Jun 3, 2016
1 parent fe40127 commit 087cad0
Show file tree
Hide file tree
Showing 6 changed files with 127 additions and 67 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.mapbox.mapboxsdk.annotations;

import android.graphics.Bitmap;
import android.support.annotation.Nullable;

import com.mapbox.mapboxsdk.maps.MapboxMap;

/**
Expand Down Expand Up @@ -35,6 +38,8 @@ public class MarkerView extends Marker {
private float rotation;
private float alpha = 1;

private Icon markerViewIcon;

/**
* Publicly hidden default constructor
*/
Expand Down Expand Up @@ -315,6 +320,34 @@ public void setAlpha(float alpha) {
}
}

/**
* Set the icon of the MarkerView.
*
* @param icon the icon to be used as Marker image
*/
@Override
public void setIcon(@Nullable Icon icon) {
if (icon != null) {
markerViewIcon = IconFactory.recreate("icon", icon.getBitmap());
}
Bitmap bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
Icon transparentIcon = IconFactory.recreate("markerViewSettings", bitmap);
if (markerViewManager != null) {
markerViewManager.updateIcon(this);
}
super.setIcon(transparentIcon);
}

/**
* Get the icon of the MarkerView.
*
* @return the icon use as Marker image
*/
@Override
public Icon getIcon() {
return markerViewIcon;
}

/**
* Set the MapboxMap associated tot the MapView containing the MarkerView.
* <p>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
package com.mapbox.mapboxsdk.annotations;

import android.content.Context;
import android.graphics.PointF;
import android.os.SystemClock;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.util.Pools;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.mapbox.mapboxsdk.R;
import com.mapbox.mapboxsdk.maps.MapView;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import com.mapbox.mapboxsdk.maps.Projection;
Expand All @@ -26,12 +31,13 @@
*/
public class MarkerViewManager {

private Map<MarkerView, View> mMarkerViewMap;
private Map<MarkerView, View> markerViewMap;
private MapboxMap mapboxMap;
private MapView mapView;
private List<MapboxMap.MarkerViewAdapter> markerViewAdapters;
private long mViewMarkerBoundsUpdateTime;
private long viewMarkerBoundsUpdateTime;
private MapboxMap.OnMarkerViewClickListener onMarkerViewClickListener;
private ImageMarkerViewAdapter defaultMarkerViewAdapter;

/**
* Creates an instance of MarkerViewManager.
Expand All @@ -43,7 +49,10 @@ public MarkerViewManager(@NonNull MapboxMap mapboxMap, @NonNull MapView mapView)
this.mapboxMap = mapboxMap;
this.markerViewAdapters = new ArrayList<>();
this.mapView = mapView;
mMarkerViewMap = new HashMap<>();
this.markerViewMap = new HashMap<>();
this.defaultMarkerViewAdapter = new ImageMarkerViewAdapter(mapView.getContext());
// FIXME only add this if a MarkerView instance is added to MapboxMap
this.markerViewAdapters.add(defaultMarkerViewAdapter);
}

/**
Expand All @@ -56,7 +65,7 @@ public MarkerViewManager(@NonNull MapboxMap mapboxMap, @NonNull MapView mapView)
* @param rotation the rotation value
*/
public void animateRotation(@NonNull MarkerView marker, float rotation) {
View convertView = mMarkerViewMap.get(marker);
View convertView = markerViewMap.get(marker);
if (convertView != null) {
AnimatorUtils.rotate(convertView, rotation);
}
Expand All @@ -72,7 +81,7 @@ public void animateRotation(@NonNull MarkerView marker, float rotation) {
* @param alpha the alpha value
*/
public void animateAlpha(@NonNull MarkerView marker, float alpha) {
View convertView = mMarkerViewMap.get(marker);
View convertView = markerViewMap.get(marker);
if (convertView != null) {
AnimatorUtils.alpha(convertView, alpha);
}
Expand All @@ -88,7 +97,7 @@ public void animateAlpha(@NonNull MarkerView marker, float alpha) {
* @param visible the flag indicating if MarkerView is visible
*/
public void animateVisible(@NonNull MarkerView marker, boolean visible) {
View convertView = mMarkerViewMap.get(marker);
View convertView = markerViewMap.get(marker);
if (convertView != null) {
convertView.setVisibility(visible ? View.VISIBLE : View.GONE);
}
Expand All @@ -104,8 +113,8 @@ public void animateVisible(@NonNull MarkerView marker, boolean visible) {
*/
public void update() {
View convertView;
for (MarkerView marker : mMarkerViewMap.keySet()) {
convertView = mMarkerViewMap.get(marker);
for (MarkerView marker : markerViewMap.keySet()) {
convertView = markerViewMap.get(marker);
if (convertView != null) {
PointF point = mapboxMap.getProjection().toScreenLocation(marker.getPosition());
int x = (int) (marker.getAnchorU() * convertView.getMeasuredWidth());
Expand Down Expand Up @@ -133,9 +142,9 @@ public void update() {
*/
public void setTilt(float tilt) {
View convertView;
for (MarkerView markerView : mMarkerViewMap.keySet()) {
for (MarkerView markerView : markerViewMap.keySet()) {
if (markerView.isFlat()) {
convertView = mMarkerViewMap.get(markerView);
convertView = markerViewMap.get(markerView);
if (convertView != null) {
markerView.setTilt(tilt);
convertView.setRotationX(tilt);
Expand All @@ -144,6 +153,16 @@ public void setTilt(float tilt) {
}
}

/**
*
*/
public void updateIcon(@NonNull MarkerView markerView) {
View convertView = markerViewMap.get(markerView);
if (convertView != null && convertView instanceof ImageView) {
((ImageView) convertView).setImageBitmap(markerView.getIcon().getBitmap());
}
}

/**
* Animate a MarkerView to a deselected state.
* <p>
Expand All @@ -154,7 +173,7 @@ public void setTilt(float tilt) {
* @param marker the MarkerView to deselect
*/
public void deselect(@NonNull MarkerView marker) {
final View convertView = mMarkerViewMap.get(marker);
final View convertView = markerViewMap.get(marker);
if (convertView != null) {
int deselectAnimatorRes = marker.getDeselectAnimRes();
if (deselectAnimatorRes != 0) {
Expand All @@ -176,7 +195,7 @@ public void deselect(@NonNull MarkerView marker) {
* @param removeFromMap flag indicating if a MarkerView will be removed from the collection.
*/
public void removeMarkerView(MarkerView marker, boolean removeFromMap) {
final View viewHolder = mMarkerViewMap.get(marker);
final View viewHolder = markerViewMap.get(marker);
if (viewHolder != null && marker != null) {
for (final MapboxMap.MarkerViewAdapter<?> adapter : markerViewAdapters) {
if (adapter.getMarkerClass() == marker.getClass()) {
Expand All @@ -198,7 +217,7 @@ public void onAnimationEnd() {
}
}
if (removeFromMap) {
mMarkerViewMap.remove(marker);
markerViewMap.remove(marker);
}
}

Expand All @@ -223,7 +242,6 @@ public List<MapboxMap.MarkerViewAdapter> getMarkerViewAdapters() {
return markerViewAdapters;
}


/**
* Register a callback to be invoked when this view is clicked.
*
Expand All @@ -243,11 +261,11 @@ public void setOnMarkerViewClickListener(@Nullable MapboxMap.OnMarkerViewClickLi
public void scheduleViewMarkerInvalidation() {
if (!markerViewAdapters.isEmpty()) {
long currentTime = SystemClock.elapsedRealtime();
if (currentTime < mViewMarkerBoundsUpdateTime) {
if (currentTime < viewMarkerBoundsUpdateTime) {
return;
}
invalidateViewMarkersInBounds();
mViewMarkerBoundsUpdateTime = currentTime + 250;
viewMarkerBoundsUpdateTime = currentTime + 250;
}
}

Expand All @@ -264,12 +282,12 @@ public void invalidateViewMarkersInBounds() {
View convertView;

// remove old markers
Iterator<MarkerView> iterator = mMarkerViewMap.keySet().iterator();
Iterator<MarkerView> iterator = markerViewMap.keySet().iterator();
while (iterator.hasNext()) {
MarkerView m = iterator.next();
if (!markers.contains(m)) {
// remove marker
convertView = mMarkerViewMap.get(m);
convertView = markerViewMap.get(m);
int deselectAnimRes = m.getDeselectAnimRes();
if (deselectAnimRes != 0) {
AnimatorUtils.animate(convertView, deselectAnimRes, 0);
Expand All @@ -281,7 +299,7 @@ public void invalidateViewMarkersInBounds() {

// introduce new markers
for (final MarkerView marker : markers) {
if (!mMarkerViewMap.containsKey(marker)) {
if (!markerViewMap.containsKey(marker)) {
for (final MapboxMap.MarkerViewAdapter adapter : markerViewAdapters) {
if (adapter.getMarkerClass() == marker.getClass()) {
convertView = (View) adapter.getViewReusePool().acquire();
Expand Down Expand Up @@ -339,7 +357,7 @@ public void onAnimationEnd() {
}
});

mMarkerViewMap.put(marker, adaptedView);
markerViewMap.put(marker, adaptedView);
if (convertView == null) {
mapView.addView(adaptedView);
}
Expand All @@ -349,4 +367,34 @@ public void onAnimationEnd() {
}
}
}

public static class ImageMarkerViewAdapter extends MapboxMap.MarkerViewAdapter<MarkerView> {

private LayoutInflater inflater;

public ImageMarkerViewAdapter(Context context) {
super(context);
inflater = LayoutInflater.from(context);
}

@Nullable
@Override
public View getView(@NonNull MarkerView marker, @Nullable View convertView, @NonNull ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = inflater.inflate(R.layout.view_image_marker, parent, false);
viewHolder.imageView = (ImageView) convertView.findViewById(R.id.image);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.imageView.setImageBitmap(marker.getIcon().getBitmap());
return convertView;
}

private static class ViewHolder {
ImageView imageView;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,6 @@ public class MapboxMap {

private List<InfoWindow> mInfoWindows;
private MapboxMap.InfoWindowAdapter mInfoWindowAdapter;
private Bitmap mViewMarkerBitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);

private boolean mMyLocationEnabled;
private boolean mAllowConcurrentMultipleInfoWindows;
Expand Down Expand Up @@ -703,8 +702,8 @@ public Marker addMarker(@NonNull BaseMarkerOptions markerOptions) {
@NonNull
public MarkerView addMarker(@NonNull BaseMarkerViewOptions markerOptions) {
MarkerView marker = prepareViewMarker(markerOptions);
long id = mMapView.addMarker(marker);
marker.setMapboxMap(this);
long id = mMapView.addMarker(marker);
marker.setId(id);
mAnnotations.put(id, marker);
return marker;
Expand Down Expand Up @@ -1209,8 +1208,7 @@ private Marker prepareMarker(BaseMarkerOptions markerOptions) {

private MarkerView prepareViewMarker(BaseMarkerViewOptions markerViewOptions) {
MarkerView marker = markerViewOptions.getMarker();
Icon icon = IconFactory.recreate("markerViewSettings", mViewMarkerBitmap);
marker.setIcon(icon);
marker.setIcon(markerViewOptions.getIcon());
return marker;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
Loading

0 comments on commit 087cad0

Please sign in to comment.