精华内容
下载资源
问答
  • android 地图
    千次阅读
    2021-05-28 09:41:46

    地图 SDK 提供了多种手势供 App 端用户与地图之间进行交互,如缩放、旋转、滑动、倾斜。这些手势默认开启,如果想要关闭某些手势,可以通过 UiSetting 类提供的接口来控制手势的开关。

    手势方法说明

    以下是控制手势生效与否的方法:

    名称调用方法

    缩放手势UiSettings.setZoomGesturesEnabled(boolean)

    滑动手势UiSettings.setScrollGesturesEnabled(boolean)

    旋转手势UiSettings.setRotateGesturesEnabled(boolean)

    倾斜手势UiSettings.setTiltGesturesEnabled(boolean)

    所有手势UiSettings.setAllGesturesEnabled (boolean)

    以下是检测手势是否生效的方法:

    名称调用方法

    缩放手势UiSettings.isZoomGesturesEnabled()

    滑动手势UiSettings.isScrollGesturesEnabled()

    旋转手势UiSettings.isRotateGesturesEnabled()

    倾斜手势UiSettings.isTiltGesturesEnabled()

    缩放手势

    缩放手势可改变地图的缩放级别,地图响应的手势如下:双击地图可以使缩放级别增加1 (放大)

    两个手指捏/拉伸

    也可以禁用或启用缩放手势。禁用缩放手势不会影响用户使用地图上的缩放控制按钮。以下是控制缩放手势开启关闭的代码:

    UiSettings.setZoomGesturesEnabled(boolean);

    滑动手势

    您可以用手指拖动地图四处滚动(平移)或用手指滑动地图(动画效果),也可以禁用或开启平移(滑动)手势。

    以下介绍控制缩放手势开启关闭的方法,示例代码如下:

    UiSettings.setScrollGesturesEnabled(boolean);

    旋转手势

    您可以用两个手指在地图上转动,可以旋转3D矢量地图,也可以禁用旋转手势。

    以下介绍控制旋转手势开启关闭的方法,示例代码如下:

    UiSettings.setRotateGesturesEnabled(boolean);

    倾斜手势

    用户可以在地图上放置两个手指,移动它们一起向下或向上去增加或减小倾斜角,也可以禁用倾斜手势。

    以下是控制倾斜手势开启关闭的代码:

    UiSettings.setTiltGesturesEnabled(boolean);

    指定屏幕中心点的手势操作

    在对地图进行手势操作时(滑动手势除外),可以指定屏幕中心点后执行相应手势。

    指定屏幕中心点的方法如下,在AMap类中:

    setPointToCenter(int x, int y);//x、y均为屏幕坐标,屏幕左上角为坐标原点,即(0,0)点。

    开启以中心点进行手势操作的方法:

    aMap.getUiSettings().setGestureScaleByMapCenter(true);

    更多相关内容
  • Android地图—— Mapbox 10.3.0 接入与基础使用

    千次阅读 热门讨论 2022-04-16 21:05:01
    Mapbox10.3.0 Android接入与基础使用

    Mapbox初始配置:依赖添加

    官网教程指引: https://docs.mapbox.com/android/maps/guides/install/
    我使用的android studio版本是旧版,依赖添加方式如下:

    1. 编辑 项目目录/build.gradle (设置maven库的访问);

    Android Studio less than Arctic Fox (2020.3.1) and Gradle less than v6.0:
    注意,是在 allprojects 内设置!

    buildscript {
    	...
    }
    allprojects {
        repositories {
            google()
            mavenCentral()
            maven {
                url 'https://api.mapbox.com/downloads/v2/releases/maven'
                authentication {
                    basic(BasicAuthentication)
                }
                credentials {
                    username = "mapbox"
                    // Use the secret token you stored in gradle.properties as the password
                    password = project.properties['MAPBOX_DOWNLOADS_TOKEN']
                }
            }
        }
    }
    

    2. 前往mapbox官网 创建账号 并 申请密钥;

    Token申请地址: https://account.mapbox.com/
    申请token时记得勾选 Downloads:Read 以获取从maven库下载mapbox依赖文件的许可。

    创建完成之后在Token页面会有两个Token:
    其中一个为初始就有的公钥;一个为你刚刚申请好的带有Downloads:Read权限的私钥。
    (注意:私钥申请完成后要直接复制保存,刷新页面后会被隐藏)。

    在这里插入图片描述

    3. 在项目中配置公钥、私钥;

    在 项目目录下的 gradle.properites 中添加以下代码,用于从maven库下载mapbox相关依赖的身份验证。

    MAPBOX_DOWNLOADS_TOKEN=自己申请的私钥
    

    res/valuses/strings.xml 文件中添加以下代码。mapbox默认你 将token放置在 strings.xml 中,在调用相关api时会 自动 在此文件夹下面获取token。

    <string name="mapbox_access_token">公钥</string>
    

    4. 在 模块目录 /build.gradle 中添加依赖;

    // mapbox地图组件
    implementation 'com.mapbox.maps:android:10.3.0'
    

    5. 配置获取用户定位权限;(可选)

    AndroidManifest.xml 文件中添加以下代码*(当你需要在地图上显示用户位置时才需要配置)*
    注意: 还需要在代码中动态请求该权限,Mapbox也提供了PermissionsManager(可参考官网示例)工具用于动态请求权限,这里不展开)

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    

    可能遇到的问题:
    ① sync gradle文件时报warnning:
    问题: Failed to resolve: com.mapbox.maps:android:10.0.3
    解决: 检查自己申请的token是否带有 Downloads:Read,在创建token时记得勾选上,系统默认提供的token是不带这个scope的,需要自行申请。
    ————————————————————————————————————————————

    MapBox部分功能的Android实现:

    这部分对MapBox的主要用例的Android实现和原理进行相关解释(示例版本10.3.0)。
    由于官网有kotlin代码的例子,以下功能展示均使用 java代码 进行举例。

    以下介绍的功能代码我都封装到了MapBoxUtil.java文件中,可以在这个项目里面自行获取。(结合这个示例项目的代码阅读更佳哦)

    效果图先行:
    在这里插入图片描述

    · 地图MapView的添加

    layout文件中添加MapView视图:

    <com.mapbox.maps.MapView
        android:id="@+id/mapview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    

    Java文件:

    MapView mMapView = findViewById(R.id.mapview);
    MapboxMap mMapboxMap = mapView.getMapboxMap();
    

    · MapBox初始化以及地图显示:

    1. 相机设置:

    相机部分参数初始变量定义:

    private static final double DEFAULT_LOCATION_LATITUDE = 22.55;    // 初始地图显示坐标(深圳)
    private static final double DEFAULT_LOCATION_LONGITUDE = 114.06;
    private static final double DEFAULT_ZOOM_VALUE = 8.0;   // 初始地图缩放大小
    

    相机设置:

    mMapboxMap.setCamera(  // 设置地图相机初始位置
            new CameraOptions.Builder()
                    .center(Point.fromLngLat(DEFAULT_LOCATION_LONGITUDE, DEFAULT_LOCATION_LATITUDE))
                    .zoom(DEFAULT_ZOOM_VALUE)
                    .build());
    

    相机更多参数设置:
    https://docs.mapbox.com/android/maps/guides/camera-and-animation/camera/

    2. 地图加载:

    地图类型变量定义:

    private static final String DEFAULT_MAP_STYLE = Style.MAPBOX_STREETS;   // 地图显示样式
    

    加载地图:

    mMapboxMap.loadStyleUri(   // 加载地图
            DEFAULT_MAP_STYLE, style -> {
                // style 加载完成回调
            });
    

    更多地图类型:
    https://docs.mapbox.com/android/maps/guides/styles/set-a-style/

    · MapBox各种功能插件获取:

    mMapView .getPlugin(Plugin.MAPBOX_XXX_PLUGIN_ID);		//XXX因插件而异
    

    在这里插入图片描述

    1. 地图 Logo 插件

    LogoPlugin logoPlugin =  mMapView .getPlugin(Plugin.MAPBOX_LOGO_PLUGIN_ID);
    // 隐藏 Logo
    if (logoPlugin != null) {
        logoPlugin.setEnabled(false);
    }
    

    2. 地图Logo旁属性按钮插件

    AttributionPlugin attributionPlugin = mMapView .getPlugin(Plugin.MAPBOX_ATTRIBUTION_PLUGIN_ID);
    // 隐藏 属性按钮
    if (attributionPlugin != null) {
        attributionPlugin.setEnabled(false);
    }
    

    3. 比例尺Scalebar插件

    ScaleBarPlugin scaleBarPlugin = mMapView .getPlugin(Plugin.MAPBOX_SCALEBAR_PLUGIN_ID);
    // 隐藏 比例尺
    if (scaleBarPlugin != null) {
        scaleBarPlugin.setEnabled(false);
    }
    

    4. 指南针插件

    CompassPlugin compassPlugin = mMapView .getPlugin(Plugin.MAPBOX_COMPASS_PLUGIN_ID);
    if (compassPlugin == null) {
        return;
    }
    compassPlugin.setEnabled(isEnable);	// 隐藏指南针
    compassPlugin.setImage(drawable);	// 更换指南针icon
    

    以上UI相关的插件均可以通过相关api设置显示位置和大小,这里不举例说明。

    5. 相机动画插件

    相机位置改变:
    若只是简单的直接改变相机位置的话,使用上述相机初始化中的mMapboxMap.setCamera方法即可。
    若想要添加移动的动画,如从当前显示位置缓慢变换到目的位置,则需要相机动画插件CameraAnimationsPlugin

    CameraAnimationsPlugin cameraAnimationsPlugin = mMapView.getPlugin(Plugin.MAPBOX_CAMERA_PLUGIN_ID);
    

    相机移动方法举例:

    /**
     * 将摄像头移动到指定位置
     * @param point 目标坐标
     * @param zoom  目标缩放比例
     * @param duration 滑动总时间 0为无动画
     */
    public void moveCameraTo(Point point, double zoom, int duration) {
        if (mMapView == null) {
            return;
        }
        if (duration != 0 && cameraAnimationsPlugin != null) {
            cameraAnimationsPlugin .flyTo(new CameraOptions.Builder()
                            .center(point)
                            .zoom(zoom)
                            .build(),
                    new MapAnimationOptions.Builder().duration(duration).build());
        } else {
            mMapboxMap.setCamera(new CameraOptions.Builder()
                    .center(point)
                    .zoom(zoom)
                    .build());
        }
    }
    

    更多相机动画:
    https://docs.mapbox.com/android/maps/guides/camera-and-animation/animations

    6. 地图手势监听插件

    可以监听地图相关运行中状态,Mapbox提供了手势插件供我们监听各种地图状态:

    GesturesPlugin gesturesPlugin = mMapView.getPlugin(Plugin.MAPBOX_GESTURES_PLUGIN_ID);
    

    下面以监听地图移动为例:

    if (gesturesPlugin != null) {
        gesturesPlugin .addOnMoveListener(onMoveListener);	// 注意onDestroy时要remove掉Listener
    }
    // 地图移动监听
    private final OnMoveListener onMoveListener = new OnMoveListener() {
        @Override
        public void onMoveBegin(@NotNull MoveGestureDetector moveGestureDetector) {
            // 地图开始移动
        }
    
        @Override
        public boolean onMove(@NotNull MoveGestureDetector moveGestureDetector) {
            return false;
        }
    
        @Override
        public void onMoveEnd(@NotNull MoveGestureDetector moveGestureDetector) {
            // 地图移动结束
        }
    };
    

    更多用户交互监听:
    https://docs.mapbox.com/android/maps/guides/user-interaction

    7. 用户地理位置获取插件

    效果图先行:
    在这里插入图片描述

    MapBox获取用户位置主要通过 LocationComponentPlugin 插件获取:

    LocationComponentPlugin locationPlugin = mMapView.getPlugin(Plugin.MAPBOX_LOCATION_COMPONENT_PLUGIN_ID);
    

    ① 设置用户位置点显示UI样式:

    设置脉冲显示效果:

    locationPlugin.updateSettings(locationComponentSettings -> {
        locationComponentSettings.setEnabled(true);
        locationComponentSettings.setPulsingEnabled(true);  // 脉冲效果
        return null;
    });
    

    设置位置点样式:
    通过插件的 setLocationPuck() 方法进行设置,方法接受四个参数。前三个为上\中\下层图标样式设置,最后一个接受 Expression表达式 用于配置 位置点图标的缩放scale数值规则。
    (Expression表达式的本质是Json语句,是Mapbox自定义的一种描述性变量,具体Expression所涵盖的运算符可参考官网,我们可以在使用的过程中逐渐了解各运算符具体含义)
    这里我们选择 生成一个随地图缩放变化规则的Expression:
    我们使用 InterpolatorBuilder 来生成一个插值表达式。
    下面例子的插值表达式表示当地图zoom为0时,图标scale为1;当zoom为20时,图标scale为1.5;其间值线性插值获得。

    • linear运算符用于对一队stop值间的数据做线性插值运算;
    • zoom表达式添加上了图标大小随地图缩放大小的羁绊。

    从结果上来看即生成了如下json表达式:(清楚Expression编写规则后,直接编写json表达式也可以实现同样的效果)

    ["interpolate",["linear"],["zoom"],0.0,1.0,20.0,1.5]
    

    代码如下所示:

    // 设置图标随地图缩放比例变化
    Expression.InterpolatorBuilder interpolatorBuilder = new Expression.InterpolatorBuilder("interpolate");
    interpolatorBuilder.linear();
    interpolatorBuilder.zoom();
    interpolatorBuilder.stop(expressionBuilder -> {
        expressionBuilder.literal(0.0);
        expressionBuilder.literal(1.0);
        return null;
    });
    interpolatorBuilder.stop(expressionBuilder -> {
        expressionBuilder.literal(20.0);
        expressionBuilder.literal(1.5);
        return null;
    });
    // 设置用户位置图标样式
    locationPlugin.setLocationPuck(new LocationPuck2D(null,
            AppCompatResources.getDrawable(mContext, R.drawable.mapbox_user_icon),
            AppCompatResources.getDrawable(mContext, R.drawable.mapbox_user_stroke_icon),
            interpolatorBuilder.build().toJson()));
    

    官网例子:
    https://docs.mapbox.com/help/tutorials/mapbox-gl-js-expressions/#add-a-zoom-expression

    ② 添加用户位置监听器

    // 添加用户位置监听器
    // 注意onDestroy时要remove掉Listener
    locationPlugin.addOnIndicatorPositionChangedListener(onIndicatorPositionChangedListener);
    // 用户位置改变监听
    private final OnIndicatorPositionChangedListener onIndicatorPositionChangedListener =
            new OnIndicatorPositionChangedListener() {
                @Override
                public void onIndicatorPositionChanged(@NotNull Point point) {
                    // point即为用户位置
                }
    };
    

    ③ 移动相机到用户的位置:
    移动相机方法参见 5.相机动画插件 部分,在onIndicatorPositionChanged回调中根据point参数进行移动即可。
    需要注意的是,onIndicatorPositionChanged监听器在remove前会持续回调,需编写相关移动相机的条件,否则地图移动手势将会失效。
    官网教程:
    https://docs.mapbox.com/android/maps/guides/user-location/

    8. 地图标记插件

    Mapbox提供了annotationPlugin 插件供用户在地图上快捷添加标记。添加标记的方法如下所示
    注意:以下标记的添加需要在地图初始化加载完成后进行,即style加载完后进行。

    AnnotationPlugin annotationPlugin = mMapView.getPlugin(Plugin.MAPBOX_ANNOTATION_PLUGIN_ID);
    

    [举例] 向地图添加点标记(可以显示icon + text)

    // 注册点标记管理器
    PointAnnotationManager pointAnnotationManager = (PointAnnotationManager)
                    annotationPlugin .createAnnotationManager(AnnotationType.PointAnnotation, null);
    
    /**
     * 在地图中添加Point类型标记
     * @param longitude 添加坐标X
     * @param latitude  添加坐标Y
     */
    public void addPointAnnotationInMap(int drawable, double longitude, double latitude) {
        if(annotationPlugin == null){
            return;
        }
        if (pointAnnotationManager == null) {
            pointAnnotationManager = (PointAnnotationManager)
                    annotationPlugin .createAnnotationManager(AnnotationType.PointAnnotation, null);
        }
        // Set options for the resulting symbol layer.
        PointAnnotationOptions pointAnnotationOptions = new PointAnnotationOptions()
                .withPoint(Point.fromLngLat(longitude, latitude))
                .withIconImage(BitmapUtil.getBitmapFromDrawable(mContext, drawable));
        // Add the pointAnnotation to the map.
        pointAnnotationManager .create(pointAnnotationOptions);
    }
    

    pointAnnotationOptions中还有很多方法可以设置,这里不再举例。
    更多标记类型:
    https://docs.mapbox.com/android/maps/guides/annotations/annotations/

    除次之外Mapbox还提供了ViewAnnotation,用户可以利用此添加自定义样式的标记,添加方法如下所示:

    ViewAnnotationManager viewAnnotationManager = mMapView.getViewAnnotationManager();
    

    以下方法举例了如何在ViewAnnotationManager添加自定义的View标记:

        /**
         * 在地图中添加View标记 [需补充代码后使用]
         * @param longitude 添加坐标
         * @param latitude  添加坐标
         * @param onClickListener   view点击回调
         */
        public void addViewAnnotationInMap(double longitude, double latitude, View.OnClickListener onClickListener) {
            if (viewAnnotationManager == null) {
                viewAnnotationManager = mMapView.getViewAnnotationManager();
            }
    //        View markView = viewAnnotationManager.addViewAnnotation(R.layout.item_map_image_view,    // view的layout id
    //                new ViewAnnotationOptions.Builder()
    //                        .geometry(Point.fromLngLat(longitude, latitude))
    //                        .allowOverlap(true)   // 允许markView重叠
    //                        .build());
            // 初始化 layout中的组件 markView.findViewById(R.id.xxx)
            // ...
        }
    

    上述两种添加方式在 少量(<200) 标记时不会造成地图组件卡顿(应设备而异),若要添加大量标记,上述方法性能问题不容乐观。
    mapbox对此提供了 style layer 的解决方案,用于添加 大量图标 时的性能保证。

    style layer 添加地图标记,并实现聚类的方法见下一篇文章:Android地图—— Mapbox 10.3.0 聚类标签实现

    展开全文
  • 几行代码稿定 Android 地图选择,地址选择,坐标选择

    效果图

     

    准备工作

    在腾讯地图控制台里注册一个app,替换下面的参数

    主要代码

    布局

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".activity.MapSelectionActivity">
        <include layout="@layout/nav_bar" />
        <WebView
            android:id="@+id/web_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </LinearLayout>

    逻辑

    切记别忘了申请定位权

    String mUrl = "https://mapapi.qq.com/web/mapComponents/locationPicker/v/index.html?search=1&type=0&backurl=http://callback&key=你注册的app的key&referer=你注册的app的名字";
    WebSettings webSettings = mWebView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    mWebView.setWebChromeClient(new WebChromeClient() {
        public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
            callback.invoke(origin, true, false);
        }
    });
    mWebView.getSettings().setGeolocationDatabasePath( MapSelectionActivity.this.getFilesDir().getPath() );
    mWebView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (!url.startsWith("http://callback")) {
                view.loadUrl(url);
            } else {
                try {
                    //转utf-8编码
                    String decode = URLDecoder.decode(url, "UTF-8");
                    //转uri,然后根据key取值
                    Uri uri = Uri.parse(decode);
    
                    String[] latng=uri.getQueryParameter("latng").split(",");
                    String address = uri.getQueryParameter("name");//地址
                    if (address.equals("我的位置")){
                        address = uri.getQueryParameter("addr");
                    }
                    Intent intent = new Intent();//把数据返回到上个页面
                    intent.putExtra("address", address);
                    intent.putExtra("latitude",latng[0]);
                    intent.putExtra("longitude",latng[1]);
                    setResult(RESULT_OK, intent);
                    finish();
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }
            return true;
        }
    });
    mWebView.loadUrl(mUrl);
    展开全文
  • android地图定位到指定坐标

    热门讨论 2014-08-05 19:48:13
    实现了百度地图的显示,而且可以手动定位到指定坐标
  • Android地图轨迹抽稀、动态绘制

    千次阅读 2017-09-27 00:00:00
    今日科技快讯 9月26日,阿里巴巴集团宣布,为进一步推进新零售战略,将增持旗下菜鸟网络的...本篇来自 莫比乌丝环丶 的投稿,详细地讲解了Android地图轨迹抽稀、动态绘制,希望大家喜欢 莫比乌丝环丶 的博客地址:

    今日科技快讯

    9月26日,阿里巴巴集团宣布,为进一步推进新零售战略,将增持旗下菜鸟网络的股份,未来五年继续投入1000亿元,加快建设全球领先的物流网络,实现中国24小时、全球72小时必达,为全球消费者提供最好的物流体验,并进一步推动中国社会物流总成本的降低。

    作者简介

    本篇来自 莫比乌丝环丶 的投稿,详细地讲解了Android地图轨迹抽稀、动态绘制,希望大家喜欢

    莫比乌丝环丶 的博客地址:

    http://www.jianshu.com/u/f914004db506

    前言

    因公司业务调整降低运动门槛,产品部要求引入地图,记录用户的运动轨迹上传至服务器,用户进入记录页面可查看运动轨迹。而且绘制轨迹的时候要求有一个绘制动画(参照咕咚)。听到这心中万只草泥马 ~~~ 可是需求下来了,还是得硬着头皮做啊。

    动态绘制效果体验

    本文用到的一切地图相关的东西都来源高德地图。至于地图展示不是本文重点,所以不做赘述。文中提及的距离的计算,根据自己引用的地图类型做替换即可。文中是地图API所有,会有标注。效果如如下:

    那该怎么实现呢?往下看。

    实现方式

    定位点的抽稀-道格拉斯算法

    • 道格拉斯简介

    Douglas一Peukcer 算法由 D.Douglas 和 T.Peueker 于1973年提出,简称D一P算法,是眼下公认的线状要素化简经典算法。现有的线化简算法中,有相当一部分都是在该算法基础上进行改进产生的。它的长处是具有平移和旋转不变性,给定曲线与阂值后,抽样结果一定。

    算法的基本思路是:对每一条曲线的首末点虚连一条直线,求所有点与直线的距离,并找出最大距离值 dmax ,用 dmax 与限差 D 相比:若 dmax < D ,这条曲线上的中间点所有舍去;若dmax ≥D ,保留 dmax 相应的坐标点,并以该点为界,把曲线分为两部分,对这两部分反复使用该方法。

    算法的具体过程如下:

    • 在曲线首尾两点间虚连一条直线,求出其余各点到该直线的距离,如图3(1)。

    • 选其最大者与阈值相比較,若大于阈值,则离该直线距离最大的点保留,否则将直线两端点间各点所有舍去,如图3(2),第4点保留。

    • 根据所保留的点,将已知曲线分成两部分处理,反复第1、2步操作,迭代操作,即仍选距离最大者与阈值比較,依次取舍,直到无点可舍去,最后得到满足给定精度限差的曲线点坐标,如图3(3)、(4)依次保留第6点、第7点,舍去其它点,即完成线的化简。

    • 算法代码实现

    存储经纬度坐标的实体 LatLngPoint

    使用三角形面积(使用海伦公式求得)相等方法计算点 pX 到点 pA 和 pB 所确定的直线的距离, AMapUtils.calculateLineDistance(start.latLng, end.latLng) 计算两点之间的距离,此公式高德API

    Douglas 工具类具体代码:

    • 结果

    上图中展示的轨迹是定位得到的4417个点,经过抽稀之后绘制在地图上的样式。算法中传入的阙值是10,4417个点处理之后只136个点。而且这136个点绘制的轨迹和4417个点绘制的轨迹几乎没有什么差别。

    不知道你们有没有被震撼到,反正我是彻彻底底被震到了。作为算法小白的我,感觉整个世界都被颠覆了。

    轨迹绘制-自定义运动轨迹View

    最开始得时候认为直接在地图上绘制动态轨迹的,根据高德提供绘制轨迹的 API,结果直接卡死。当时一脸懵逼的找高德客服,一提高德的客服更让人窝火。算了不提了。后面自己试了好多遍之后放弃直接在地图上绘制,不知道哪一刻,就突然想到在地图上覆盖一个自定义的 View。当时有一瞬间觉得自己是这个世界上智商最接近250的┐(‘~`;)┌地图API提供了经纬度转换成手机上的坐标,所以可以拿到地图上点对应的屏幕的位置,也就自然可以自定义一个 View 动态的绘制轨迹,当自定义 View 的动画结束之后,隐藏自定义 View 然后在地图上绘制轨迹。这就是我的整体思路,下面袖子撸起,上代码:

    • 初始化变量、画笔、path

    • 轨迹 View 绘制

    • 设置数据

    来来来,小板凳,划重点!!!

    本文重点:算法、算法、算法、PathMeasure、Path

    说到底写这篇文章的初衷还是想让大多数和我一样的朋友能意识到算法的重要性,之前因为不是计算机专业毕业,所以只听别人说算法如何如何重要,但在自己的内心里却并没有多重视。但是当你程序中真正用到的时候,你会发现算法之美。强大的算法会让你在千千万万的数据中找寻真正的美(也就是去除噪声,原谅我毫无征兆的文艺一下)。作为一个叛变的工科生,曾经怀疑过为什么要学数学,平常工作生活中完全用不到当年所学的夹逼定理啊,让人有种报国无门的感觉,可是经过这次算法的洗礼之后,让我想起了阔别多年的数学,而且让我第一次真正的意识到数学真的贼TM有用。如果你还想在程序这条路上继续下去那你真的应该尽快捡起数学。

    至此,我想说的也完了。希望能帮到有类似需求的猿友们,文中有错误的地方请指出。-.-

    更多

    如果你有好的技术文章想和大家分享,欢迎向我的公众号投稿,投稿具体细节请在公众号主页点击“投稿”菜单查看。

    欢迎长按下图 -> 识别图中二维码或者扫一扫关注我的公众号:

    展开全文
  • /** * 导航工具类:参考... } } 三个地图跳转文档的官方链接 高德(https://lbs.amap.com/api/amap-mobile/guide/android/route) 百度(http://lbsyun.baidu.com/index.php?title=uri/api/ios&qq-pf-to=pcqq.c2c) 腾讯...
  • Android实战开发--三种地图类型的设计

    千次阅读 多人点赞 2022-04-29 23:22:59
    通过添加View控件显示地图,能够显示出地图的默认位置、地图名称等信息。 实现切换地图类型的功能,对于地图SDK提供了3种主要的地图类型,即普通地图、卫星图和空白地图。用户通过点击对应的按钮,能够实现不同类型...
  • Android实现百度地图定位服务

    千次阅读 2021-12-04 17:35:31
    Android 地图SDK->产品下载->自定义下载,勾选百度定位包(至少选择基础定位和基础地图)后下载。 下载并且解压 选择模块视图为Project,复制定位包BaiduLBS_Android.jar至模块example10 _2的libs文件夹里,...
  • Arcgis For Android 地图 要素(点,线,面)点击事件描述代码 描述 这里先要说一下 为什么Arcgis地图要素事件不容易找见,因为我们常规的认识是一个要素,就是一个监听,然而以这种认识对 Arcgis地图来说并不合适!...
  • --地图包、搜索包需要的基础权限--&gt;  &lt;!--允许程序打开网络套接字--&gt;  &lt;uses-permission android:name="android.permission.INTERNET" /&gt;  &lt;!--允许程序...
  • Android 百度地图定位

    千次阅读 2021-12-04 04:16:42
    Android 百度地图定位一.目标二.结果展示三.定位流程1.查看android studio 配置2.注册开发者账号,开发密钥申请3.布局与功能的简单实现四.实现自身定位1.布局2.核心功能五.仓库 一.目标 使用百度地图显示当前定位,...
  • Android 地图SDK的2D和3D地图区别

    千次阅读 2019-09-14 10:44:45
    高德地图SDK中包含2d和3d两种, 3d相对2d对系统性能要求较高,同样的渲染的效果更好。 2D 地图 SDK:采用栅格数据,支持基本地图展示以及点、线、面等覆盖图和图层...https://lbs.amap.com/api/android-sdk/dow...
  • qt for android开发百度地图
  • Android Studio3.0对于百度地图SDK的开发(百度地图实现以及定位实现)
  • 场景: 导航时,车辆图标在地图上顺滑的移动 问题: 如何让车辆图标在地图上实时的顺滑移动 解决方法: 1,车辆实时上传定位的经纬度信息 2,在地图上根据经纬度信息实时绘制车辆图标 ...
  • 刚刚学会了在地图上添加各种图层,无论是在地图上画大头针也好,绘制路线也好,都是使用图层来处理。于是落入了一种思维的定式,那就是误以为在地图上添加任何标记,只能通过图层。其实很简单,MapView也是一
  • 安卓地图开发

    千次阅读 2021-12-04 23:19:14
    地图
  • 地图的导航功能,我们完全可以不必集成三方的sdk, 这样做的好处有几点 1.减少自身开发成本 2.减少项目及app大小 3.功能性自己做不如三方app的全面 但是同时也有弊端 就是一些客户倘若没有安装任何一款三方的地图...
  • Android 监听百度地图缩放事件
  • Android地图开发之Overlay应用(高德)

    千次阅读 2012-11-01 14:08:30
    做过Android地图应用开发的人员都知道,现在流行的地图框架不外乎是Google,百度以及高德地图。 对于Google和百度的地图开发,首先需要获得一个API KEY,然后才能被授权开发应用。而高德地图则不用这么麻烦。因此,本...
  • 在Xamarin android如何调用百度地图呢?...android上使用百度地图的有Android地图SDK,定位SDK,导航SDK,全景SDK......等等虽然平时项目中可能会用到,但是不一定每一个SDK都能熟练掌握,xamarin android中如...
  • 使用百度地图API进行Android地图应用开发(Eclipse)

    万次阅读 热门讨论 2015-07-21 09:14:10
    现在我们研究使用百度地图SDK进行Android项目的开发。本文讨论如何导入百度地图SDK。 (1)首先要有一个百度账号,账号可以去百度官网申请,然后登陆:http://developer.baidu.com/map/index.php?title=%E9%A6%
  • 1.需求 ...谷歌搜索高德SDK,进入官网选择开发支持,点击Android地图SDK 接着就是按着官方的接入流程集成SDK,需要认证开发者(免费的,支付宝认证就可以),申请应用获取key,注意了:申请的时候..
  • Android——高德地图地点搜索框

    千次阅读 2018-09-23 22:01:17
    Android——高德地图地点搜索框效果图首先build.gradleMainActivity然后InputTipsActivity最后 效果图 首先 实现效果如图。由于搜索采用的是 高德地图搜索 SDK 所以需要到 高德地图开发者注册账号 获取到 ...
  • 如果你是刚开始接触谷歌地图的话,推荐你...Android百度地图SDK最新详细使用(包含demo) 目录实现前准备一个小demo接入思路实现过程 废话不多说,先来一波效果图: 实现前准备 要实现到这一步,就需要分别拿到google
  • 实现的就是一个拖动地图,显示地图中心点的位置信息;大部分打车软件的地图选点上车功能; 先上图: 实现的功能: 1、显示地图,以及当前位置的蓝点; 2、获取当前位置信息(定位); 3、获取地图中心点坐标...
  • /** * 将实际地理距离转换为屏幕像素值 * * @param distance * 实际距离,单位为米 ... * 当前地图比例尺 * @param context * @return */ public static double metreToScreenPixel(doubl
  • Android 百度地图开发详解

    千次阅读 2020-01-10 15:02:52
    申请 API Key 首先需要注册百度账号,登陆百度账号,打开网址 http://developer.baidu.com/user/info 填写注册信息并提交,然后去自己的邮箱通过验证,就完成注册了。 接着访问 ... ......
  • android高德地图封装工具类地图定位,绘制路径等等android高德地图封装工具类地图定位,绘制路径等等android高德地图封装工具类地图定位,绘制路径等等android高德地图封装工具类地图定位,绘制路径等等android高德...
  • Android 高德地图API(详细步骤+源码)

    万次阅读 多人点赞 2020-12-25 17:53:45
    为了丰富对地图、定位的了解,在写了百度、腾讯的地图定位之后,终于到了高德地图了。我个人平时日常使用最多的定位软件就是高德地图。所以这篇文章,就带你来初步了解使用。 前言 正文   在此之前呢,默认都没有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 81,622
精华内容 32,648
关键字:

android 地图