Commit 83f4f3b8 authored by Qiu Xiang's avatar Qiu Xiang
Browse files

实现 Marker 的基本功能

parent c78da8a7
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@ public class AMap3DPackage implements ReactPackage {

    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
        return Arrays.<ViewManager>asList(new AMapViewManager());
        return Arrays.<ViewManager>asList(
                new AMapViewManager(),
                new AMapMarkerManager());
    }
}
+121 −0
Original line number Diff line number Diff line
package cn.qiuxiang.react.amap3d;

import android.content.Context;

import com.amap.api.maps.AMap;
import com.amap.api.maps.model.BitmapDescriptor;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
import com.facebook.common.executors.CallerThreadExecutor;
import com.facebook.common.references.CloseableReference;
import com.facebook.datasource.BaseDataSubscriber;
import com.facebook.datasource.DataSource;
import com.facebook.datasource.DataSubscriber;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.imagepipeline.image.CloseableImage;
import com.facebook.imagepipeline.image.CloseableStaticBitmap;
import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.views.view.ReactViewGroup;

public class AMapMarker extends ReactViewGroup {
    private Marker marker;
    private LatLng position;
    private String title = "";
    private String snippet = "";
    private boolean flat = false;
    private float opacity = 1;
    private boolean draggable = false;
    private BitmapDescriptor iconBitmapDescriptor;
    private DataSubscriber<CloseableReference<CloseableImage>> dataSubscriber =
            new BaseDataSubscriber<CloseableReference<CloseableImage>>() {
                @Override
                protected void onNewResultImpl(DataSource<CloseableReference<CloseableImage>> dataSource) {
                    CloseableReference<CloseableImage> ref = dataSource.getResult();
                    if (ref != null) {
                        try {
                            iconBitmapDescriptor = BitmapDescriptorFactory.fromBitmap(
                                    ((CloseableStaticBitmap) ref.get()).getUnderlyingBitmap());
                            if (marker != null) {
                                marker.setIcon(iconBitmapDescriptor);
                            }
                        } finally {
                            CloseableReference.closeSafely(ref);
                        }
                    }
                }

                @Override
                protected void onFailureImpl(DataSource<CloseableReference<CloseableImage>> dataSource) {
                }
            };

    public AMapMarker(Context context) {
        super(context);
    }

    public void addToMap(AMap map) {
        marker = map.addMarker(getMarkerOptions());
    }

    private MarkerOptions getMarkerOptions() {
        return new MarkerOptions()
                .setFlat(flat)
                .icon(iconBitmapDescriptor)
                .alpha(opacity)
                .draggable(draggable)
                .position(position)
                .title(title)
                .snippet(snippet);
    }

    public void setTitle(String title) {
        this.title = title;
        if (marker != null) {
            marker.setTitle(title);
        }
    }

    public void setSnippet(String snippet) {
        this.snippet = snippet;
        if (marker != null) {
            marker.setSnippet(snippet);
        }
    }

    public void setCoordinate(ReadableMap coordinate) {
        position = new LatLng(coordinate.getDouble("latitude"), coordinate.getDouble("longitude"));
        if (marker != null) {
            marker.setPosition(position);
        }
    }

    public void setFlat(boolean flat) {
        this.flat = flat;
        if (marker != null) {
            marker.setFlat(flat);
        }
    }

    public void setOpacity(float opacity) {
        this.opacity = opacity;
        if (marker != null) {
            marker.setAlpha(opacity);
        }
    }

    public void setDraggable(boolean draggable) {
        this.draggable = draggable;
        if (marker != null) {
            marker.setDraggable(draggable);
        }
    }

    public void setImage(String uri) {
        DataSource<CloseableReference<CloseableImage>> dataSource = Fresco
                .getImagePipeline().fetchDecodedImage(ImageRequest.fromUri(uri), this);
        dataSource.subscribe(dataSubscriber, CallerThreadExecutor.getInstance());
    }
}
+55 −0
Original line number Diff line number Diff line
package cn.qiuxiang.react.amap3d;

import android.view.View;

import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.uimanager.SimpleViewManager;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.annotations.ReactProp;

class AMapMarkerManager extends SimpleViewManager<View> {
    @Override
    public String getName() {
        return "AMapMarker";
    }

    @Override
    protected View createViewInstance(ThemedReactContext reactContext) {
        return new AMapMarker(reactContext);
    }

    @ReactProp(name = "title")
    public void setTitle(AMapMarker marker, String title) {
        marker.setTitle(title);
    }

    @ReactProp(name = "description")
    public void setSnippet(AMapMarker marker, String description) {
        marker.setSnippet(description);
    }

    @ReactProp(name = "coordinate")
    public void setCoordinate(AMapMarker view, ReadableMap coordinate) {
        view.setCoordinate(coordinate);
    }

    @ReactProp(name = "flat")
    public void setFlat(AMapMarker marker, boolean flat) {
        marker.setFlat(flat);
    }

    @ReactProp(name = "opacity")
    public void setOpacity(AMapMarker marker, float opacity) {
        marker.setOpacity(opacity);
    }

    @ReactProp(name = "draggable")
    public void setDraggable(AMapMarker marker, boolean draggable) {
        marker.setDraggable(draggable);
    }

    @ReactProp(name = "image")
    public void setImage(AMapMarker marker, String image) {
        marker.setImage(image);
    }
}
+12 −3
Original line number Diff line number Diff line
package cn.qiuxiang.react.amap3d;

import android.view.View;

import com.amap.api.maps.AMap;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.model.LatLng;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.common.MapBuilder;
import com.facebook.react.module.annotations.ReactModule;
import com.facebook.react.uimanager.SimpleViewManager;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.ViewGroupManager;
import com.facebook.react.uimanager.annotations.ReactProp;

import java.util.Map;

class AMapViewManager extends SimpleViewManager<AMapView> {
class AMapViewManager extends ViewGroupManager<AMapView> {
    private final Map<String, Integer> MAP_TYPES = MapBuilder.of(
            "standard", AMap.MAP_TYPE_NORMAL,
            "satellite", AMap.MAP_TYPE_SATELLITE,
@@ -25,6 +26,14 @@ class AMapViewManager extends SimpleViewManager<AMapView> {
        return "AMapView";
    }

    @Override
    public void addView(AMapView mapView, View child, int index) {
        if (child instanceof AMapMarker) {
            AMapMarker marker = (AMapMarker) child;
            marker.addToMap(mapView.map);
        }
    }

    @Override
    protected AMapView createViewInstance(ThemedReactContext reactContext) {
        return new AMapView(reactContext);
+6 −4
Original line number Diff line number Diff line
import React, {PropTypes, Component} from 'react'
import {requireNativeComponent, View} from 'react-native'
import Marker from './Marker'

const CoordinateProType = PropTypes.shape({
const CoordinatePropType = PropTypes.shape({
  latitude: PropTypes.number.isRequired,
  longitude: PropTypes.number.isRequired,
})
@@ -88,7 +89,7 @@ class MapView extends Component {
    /**
     * 设置中心坐标
     */
    coordinate: CoordinateProType,
    coordinate: CoordinatePropType,

    /**
     * 设置倾斜角度,取值范围 [0, 60]
@@ -119,10 +120,11 @@ class MapView extends Component {
  render() {
    return <AMapView {...this.props}/>
  }

  static Marker = Marker
}

AMapView = requireNativeComponent('AMapView', MapView)

export default MapView
export {MapView}
export {MapView, Marker}
Loading