Android MapBox使用之自定义Marker(二)

上一篇提到了可以通过MapBox的api实现对添加到地图上的marker进行放大缩小,本篇就来说下如何具体实现。

继承MarkerView自定义MyMarkerView

public class MyMarkerView extends MarkerView{
    /**
     *使用MarkerView的构建器创建MarkerView的实例
     *
     * @param baseMarkerView选项用于构建MarkerView的构建器
     */
    public MyMarkerView (BaseMarkerViewOptions baseMarkerViewOptions) {
        super(baseMarkerViewOptions);
    }
}

继承BaseMarkerViewOptions 自定义MyMarkerViewOptions
public class MyMarkerViewOptions extends BaseMarkerViewOptions<MyMarkerView, MyMarkerViewOptions> {
    public MyMarkerViewOptions() {
    }

    private MyMarkerViewOptions(Parcel in) {
        position((LatLng) in.readParcelable(LatLng.class.getClassLoader()));
        snippet(in.readString());
        title(in.readString());
        flat(in.readByte() != 0);
        anchor(in.readFloat(), in.readFloat());
        selected = in.readByte() != 0;
        rotation(in.readFloat());
        if (in.readByte() != 0) {
            // this means we have an icon
            String iconId = in.readString();
            Bitmap iconBitmap = in.readParcelable(Bitmap.class.getClassLoader());
            Icon icon = IconFactory.recreate(iconId, iconBitmap);
            icon(icon);
        }
    }

    @Override
    public MyMarkerViewOptions getThis() {
        return this;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeParcelable(getPosition(), flags);
        out.writeString(getSnippet());
        out.writeString(getTitle());
        out.writeByte((byte) (isFlat() ? 1 : 0));
        out.writeFloat(getAnchorU());
        out.writeFloat(getAnchorV());
        out.writeFloat(getInfoWindowAnchorU());
        out.writeFloat(getInfoWindowAnchorV());
        out.writeByte((byte) (selected ? 1 : 0));
        out.writeFloat(getRotation());
        Icon icon = getIcon();
        out.writeByte((byte) (icon != null ? 1 : 0));
        if (icon != null) {
            out.writeString(getIcon().getId());
            out.writeParcelable(getIcon().getBitmap(), flags);
        }
    }

    @Override
    public MyMarkerView getMarker() {
        return new MyMarkerView(this);
    }

    public static final Parcelable.Creator< MyMarkerViewOptions > CREATOR=
                new Parcelable.Creator<MyMarkerViewOptions>() {
                public MyMarkerViewOptions createFromParcel(Parcel in) {
                    return new MyMarkerViewOptions(in);
                }

                public MyMarkerViewOptions[] newArray(int size) {
                    return new MyMarkerViewOptions[size];
                }
            };
}


继承 MapBoxMap.MarkerViewAdapter自定义MyMarkerViewAdapter

 
public class MyMarkerViewAdapter extends MapboxMap.MarkerViewAdapter<MyMarkerView>{
    private LayoutInflater inflater;
    /**
     * Create an instance of MarkerViewAdapter.
     *
     * @param context the context associated to a MapView
     */
    public MyMarkerViewAdapter(Context context) {
        super(context);
        this.inflater = LayoutInflater.from(context);
    }

    @Nullable
    @Override
    public View getView(@NonNull MyMarkerView marker, @Nullable View convertView, @NonNull ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            convertView = inflater.inflate(R.layout.layout_marker_view, parent, false);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        return convertView;
    }
    @Override
    public boolean onSelect(@NonNull MyMarkerView marker, @NonNull View convertView, boolean reselectionFromRecycling) {
        Log.d("MarkerViewAdapter onSelect");
        //设置大小
        ImageView iconImageView = (ImageView) convertView.findViewById(R.id.marker_icon);
        iconImageView.setImageResource(R.drawable.a_big);
        return super.onSelect(marker, convertView, reselectionFromRecycling);
    }

    @Override
    public void onDeselect(@NonNull MyMarkerView marker, @NonNull View convertView) {
        LogUtils.d("MarkerViewAdapter onDeselect");
        //设置大小
        ImageView iconImageView = (ImageView) convertView.findViewById(R.id.marker_icon);
        iconImageView.setImageResource(R.drawable.a_normal);
    }


    private static class ViewHolder {
        ImageView iconImageView;
    }

准备工作都定义好了如何使用?

1.获取mapboxmap设置adapter

com.mapbox.mapboxsdk.maps.MapView)mapview.getMapAsync(new OnMapReadyCallback() {
           @Override
           public void onMapReady(MapboxMap mapboxMap) {
           // Customize map with markers, polylines, etc.   
       	  //设置管理MarkerView
       		MarkerViewManager markerViewManager = mapboxMap.getMarkerViewManager();
       		MyMarkerViewAdapter markerViewAdapter=new MyMarkerViewAdapter(MyApplication.getInstance();            	m                markerViewManager.addMarkerViewAdapter(markerViewAdapter);                            
    	  }       
	});
2.向地图添加MyMarkerView

   	MyMarkerViewOptions overlayOptions = new MyMarkerViewOptions();
   	double nLatitude = 39.99;
   	double nLongitude = 111.11;
    	overlayOptions.position(new LatLng(nLatitude, nLongitude));
    	MyMarkerView testMarker=(MyMarkerView)mapboxMap.addMarker(overlayOptions);

3.设置marker选中状态

        mapBoxMap.selectMarker(testMarker);//设置marker被选中状态放大
	mapBoxMap.deselectMarker(testMarker);//设置marker非选中状态缩小




ok,现在就可以实现marker放大缩小的需求了,与任何需求修改,只需要修改MyMarkerViewAdapter就可以了。
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值