当前位置: 首页 > news >正文

延安做网站电话四川成都最新消息

延安做网站电话,四川成都最新消息,现在网站开发用什么环境,建筑工程网登背景 本文的背景,是因为我在开发高德地图时,需要自定义高德比例尺位置和样式;但结果查看了AMap Flutter插件和AMap SDK源码后,发现AMap无法添加自定义MyMethodCallHandler的实现类! why? 源码 在Flutte…

背景

本文的背景,是因为我在开发高德地图时,需要自定义高德比例尺位置和样式;但结果查看了AMap Flutter插件和AMap SDK源码后,发现AMap无法添加自定义MyMethodCallHandler的实现类!

why?

源码

在Flutter中,高德地图的每个地图视图都是通过AMapPlatformView类生成且管理的,源码如下

package com.amap.flutter.map;import android.content.Context;
import android.os.Bundle;
import android.view.View;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner;import com.amap.api.maps.AMap;
import com.amap.api.maps.AMapOptions;
import com.amap.api.maps.TextureMapView;
import com.amap.flutter.map.core.MapController;
import com.amap.flutter.map.overlays.marker.MarkersController;
import com.amap.flutter.map.overlays.polygon.PolygonsController;
import com.amap.flutter.map.overlays.polyline.PolylinesController;
import com.amap.flutter.map.utils.LogUtil;import java.util.HashMap;
import java.util.Map;import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
import io.flutter.plugin.common.BinaryMessenger;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.platform.PlatformView;/*** @author whm* @date 2020/10/27 5:49 PM* @mail hongming.whm@alibaba-inc.com* @since*/
public class AMapPlatformViewimplementsDefaultLifecycleObserver,ActivityPluginBinding.OnSaveInstanceStateListener,MethodChannel.MethodCallHandler,PlatformView {private static final String CLASS_NAME = "AMapPlatformView";private final MethodChannel methodChannel;private MapController mapController;private MarkersController markersController;private PolylinesController polylinesController;private PolygonsController polygonsController;private TextureMapView mapView;private boolean disposed = false;private final Map<String, MyMethodCallHandler> myMethodCallHandlerMap;AMapPlatformView(int id,Context context,BinaryMessenger binaryMessenger,LifecycleProvider lifecycleProvider,AMapOptions options) {methodChannel = new MethodChannel(binaryMessenger, "amap_flutter_map_" + id);methodChannel.setMethodCallHandler(this);myMethodCallHandlerMap = new HashMap<String, MyMethodCallHandler>(8);try {mapView = new TextureMapView(context, options);AMap amap = mapView.getMap();mapController = new MapController(methodChannel, mapView);markersController = new MarkersController(methodChannel, amap);polylinesController = new PolylinesController(methodChannel, amap);polygonsController = new PolygonsController(methodChannel, amap);initMyMethodCallHandlerMap();lifecycleProvider.getLifecycle().addObserver(this);} catch (Throwable e) {LogUtil.e(CLASS_NAME, "<init>", e);}}private void initMyMethodCallHandlerMap() {String[] methodIdArray = mapController.getRegisterMethodIdArray();if (null != methodIdArray && methodIdArray.length > 0) {for (String methodId : methodIdArray) {myMethodCallHandlerMap.put(methodId, mapController);}}methodIdArray = markersController.getRegisterMethodIdArray();if (null != methodIdArray && methodIdArray.length > 0) {for (String methodId : methodIdArray) {myMethodCallHandlerMap.put(methodId, markersController);}}methodIdArray = polylinesController.getRegisterMethodIdArray();if (null != methodIdArray && methodIdArray.length > 0) {for (String methodId : methodIdArray) {myMethodCallHandlerMap.put(methodId, polylinesController);}}methodIdArray = polygonsController.getRegisterMethodIdArray();if (null != methodIdArray && methodIdArray.length > 0) {for (String methodId : methodIdArray) {myMethodCallHandlerMap.put(methodId, polygonsController);}}}public MapController getMapController() {return mapController;}public MarkersController getMarkersController() {return markersController;}public PolylinesController getPolylinesController() {return polylinesController;}public PolygonsController getPolygonsController() {return polygonsController;}@Overridepublic void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {LogUtil.i(CLASS_NAME, "onMethodCall==>" + call.method + ", arguments==> " + call.arguments);String methodId = call.method;if (myMethodCallHandlerMap.containsKey(methodId)) {myMethodCallHandlerMap.get(methodId).doMethodCall(call, result);} else {LogUtil.w(CLASS_NAME, "onMethodCall, the methodId: " + call.method + ", not implemented");result.notImplemented();}}@Overridepublic void onCreate(@NonNull LifecycleOwner owner) {LogUtil.i(CLASS_NAME, "onCreate==>");try {if (disposed) {return;}if (null != mapView) {mapView.onCreate(null);}} catch (Throwable e) {LogUtil.e(CLASS_NAME, "onCreate", e);}}@Overridepublic void onStart(@NonNull LifecycleOwner owner) {LogUtil.i(CLASS_NAME, "onStart==>");}@Overridepublic void onResume(@NonNull LifecycleOwner owner) {LogUtil.i(CLASS_NAME, "onResume==>");try {if (disposed) {return;}if (null != mapView) {mapView.onResume();}} catch (Throwable e) {LogUtil.e(CLASS_NAME, "onResume", e);}}@Overridepublic void onPause(@NonNull LifecycleOwner owner) {LogUtil.i(CLASS_NAME, "onPause==>");try {if (disposed) {return;}mapView.onPause();} catch (Throwable e) {LogUtil.e(CLASS_NAME, "onPause", e);}}@Overridepublic void onStop(@NonNull LifecycleOwner owner) {LogUtil.i(CLASS_NAME, "onStop==>");}@Overridepublic void onDestroy(@NonNull LifecycleOwner owner) {LogUtil.i(CLASS_NAME, "onDestroy==>");try {if (disposed) {return;}destroyMapViewIfNecessary();} catch (Throwable e) {LogUtil.e(CLASS_NAME, "onDestroy", e);}}@Overridepublic void onSaveInstanceState(@NonNull Bundle bundle) {LogUtil.i(CLASS_NAME, "onDestroy==>");try {if (disposed) {return;}mapView.onSaveInstanceState(bundle);} catch (Throwable e) {LogUtil.e(CLASS_NAME, "onSaveInstanceState", e);}}@Overridepublic void onRestoreInstanceState(@Nullable Bundle bundle) {LogUtil.i(CLASS_NAME, "onDestroy==>");try {if (disposed) {return;}mapView.onCreate(bundle);} catch (Throwable e) {LogUtil.e(CLASS_NAME, "onRestoreInstanceState", e);}}@Overridepublic View getView() {LogUtil.i(CLASS_NAME, "getView==>");return mapView;}@Overridepublic void dispose() {LogUtil.i(CLASS_NAME, "dispose==>");try {if (disposed) {return;}methodChannel.setMethodCallHandler(null);destroyMapViewIfNecessary();disposed = true;} catch (Throwable e) {LogUtil.e(CLASS_NAME, "dispose", e);}}private void destroyMapViewIfNecessary() {if (mapView == null) {return;}mapView.onDestroy();}}

分析

通过上面的源码可以发现如下几点:

  1. 在它onMethodCall回调方法中,判断了方法名是否在myMethodCallHandlerMap中存在
@Overridepublic void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {LogUtil.i(CLASS_NAME, "onMethodCall==>" + call.method + ", arguments==> " + call.arguments);String methodId = call.method;if (myMethodCallHandlerMap.containsKey(methodId)) {myMethodCallHandlerMap.get(methodId).doMethodCall(call, result);} else {LogUtil.w(CLASS_NAME, "onMethodCall, the methodId: " + call.method + ", not implemented");result.notImplemented();}}
  1. myMethodCallHandlerMap 是一个final属性,这也就意味着,它在构造函数中已经实例化了,且不能更改值,只能修改内容,它通过initMyMethodCallHandlerMap注册所有的Hnadler
private final Map<String, MyMethodCallHandler> myMethodCallHandlerMap;AMapPlatformView(int id,Context context,BinaryMessenger binaryMessenger,LifecycleProvider lifecycleProvider,AMapOptions options) {methodChannel = new MethodChannel(binaryMessenger, "amap_flutter_map_" + id);methodChannel.setMethodCallHandler(this);myMethodCallHandlerMap = new HashMap<String, MyMethodCallHandler>(8);try {mapView = new TextureMapView(context, options);AMap amap = mapView.getMap();mapController = new MapController(methodChannel, mapView);markersController = new MarkersController(methodChannel, amap);polylinesController = new PolylinesController(methodChannel, amap);polygonsController = new PolygonsController(methodChannel, amap);initMyMethodCallHandlerMap();lifecycleProvider.getLifecycle().addObserver(this);} catch (Throwable e) {LogUtil.e(CLASS_NAME, "<init>", e);}
}
  1. 通过initMyMethodCallHandlerMap方法可以看出,它只注册了mapControllermarkersControllerpolylinesControllerpolygonsController四类Handler,且没有提供可以自定义注册的方法,所以我也无能为力了
private void initMyMethodCallHandlerMap() {String[] methodIdArray = mapController.getRegisterMethodIdArray();if (null != methodIdArray && methodIdArray.length > 0) {for (String methodId : methodIdArray) {myMethodCallHandlerMap.put(methodId, mapController);}}methodIdArray = markersController.getRegisterMethodIdArray();if (null != methodIdArray && methodIdArray.length > 0) {for (String methodId : methodIdArray) {myMethodCallHandlerMap.put(methodId, markersController);}}methodIdArray = polylinesController.getRegisterMethodIdArray();if (null != methodIdArray && methodIdArray.length > 0) {for (String methodId : methodIdArray) {myMethodCallHandlerMap.put(methodId, polylinesController);}}methodIdArray = polygonsController.getRegisterMethodIdArray();if (null != methodIdArray && methodIdArray.length > 0) {for (String methodId : methodIdArray) {myMethodCallHandlerMap.put(methodId, polygonsController);}}}

解决思路

1. 通过修改initMyMethodCallHandlerMap属性值(不推荐

通过上面分析可以想到,通过修改initMyMethodCallHandlerMap属性值,自定义handler,但前提时需要拿到对应的AMapPlatformView实例,通常的方法可以通过ServiceLoader来获取,但在Android中ServiceLoader是不用生效的,Android环境中必须通过PathClassLoaderDexClassLoader来加载类,具体加载方法,可以参考其他大神的博客,我这里不做过多追述,因为我不推荐

2. 通过PlatformViewsController来获取视图(推荐

推荐这个方法是因为它可以i通过mapId直接获取,且不用过多介入到内存和进程中的交互中

  1. 创建一个自定义MethodChannel
var methodChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "method_channel_id")methodChannel.setMethodCallHandler { call, result ->run {//....}}
  1. AMapPlatformView继承PlatformView,所以可以通过FlutterEngine.getPlatformViewsController().getPlatformViewById(viewId)方式获取,获取到的是TextureMapView视图,TextureMapView.getMap()可以获取AMap类,从而实现对当前地图视图进行任何操作,
class MainActivity : FlutterActivity() {var handerControllerMap = HashMap<String, IMyMethodCallHander>();override fun configureFlutterEngine(flutterEngine: FlutterEngine) {super.configureFlutterEngine(flutterEngine)IFlutterFactory.engine=flutterEngine;}
}

/*** 当前缩放级别下,地图上1像素点对应的长度,单位米。* @param call* @param result*/public void getScalePerPixel(MethodCall call, MethodChannel.Result result) {Object mapId = call.argument("mapId");if (null == call || null == mapId) {return;}try {View view = IFlutterFactory.engine.getPlatformViewsController().getPlatformViewById(Integer.parseInt(mapId.toString()));if (view != null) {result.success(((TextureMapView) view).getMap().getScalePerPixel());} else {result.error("ScaleControllerExecption", "获取比例尺数据失败!", "");}} catch (Exception e) {result.error("ScaleControllerExecption", e.getMessage(), e.getLocalizedMessage());}}
  1. viewId 其实就是mapId,可以通过AMapController.mapId获取,而AMapController可以通过AMapWidgetonMapCreated的回调方法获取
void onMapCreated(AMapController controller) {//连接自定义的MethodChannelMethodChannel _channel=MethodChannel("method_channel_id");//将mapId传给android端double? scale=await _channel.invokeMethod<double>("scale#get",<String,dynamic>{"mapId":_mapController.mapId});print('-----scale---$scale');
}
http://www.khdw.cn/news/53341.html

相关文章:

  • 西安南郊做网站网站如何推广运营
  • 风铃网站代做怎么做外链
  • 网站后台怎么做qq群自动加百度信息流广告位置
  • 东莞商城网站建设成都专门做网站的公司
  • 钓鱼网站的域名怎么不稳定百度收录工具
  • lol做视频那个网站好电商是做什么的
  • 阿里云服务器 多个网站seo快速收录快速排名
  • 做电商网站搭建晋升泰安网站seo
  • 为什么做免费视频网站网络营销和网络销售的关系
  • 做网站的流程方法百度app官网
  • 电子商务网站设计步骤saascrm国内免费pdf
  • 天津高端网站建设企业站长之家seo工具包
  • wordpress公益seo外链代发
  • 国产99做视频网站百度发视频步骤
  • 做网站上的在线支付怎么做山东seo推广
  • qq开发人肇庆seo排名
  • 加强门户网站建设提升建立一个企业网站需要多少钱
  • web前端开发证书网站优化什么意思
  • wordpress数据库信息关键词优化话术
  • 高端网站设计元素图片东莞市优速网络科技有限公司
  • 郑州市网站建设营销案例分析报告模板
  • 婚介网站建设最新seo新手教程
  • 优酷的网站头怎么做的seo研究协会
  • 软件设计师中级广东的seo产品推广服务公司
  • 溧阳网站建设公司湘潭seo公司
  • 成都网站建设 常凡云小蝌蚪幸福宝入口导航
  • 企业官方网站建设如何成都最新动态
  • 做网站汉狮网络网络营销和推广的方法
  • 物流公司做网站注重什么网站优化seo方案
  • c2c网站内容及功能开始网络销售员每天做什么