6

腾讯位置服务打车乘客端小车平滑移动-安卓篇

 3 years ago
source link: https://my.oschina.net/u/4209404/blog/5082083
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

腾讯位置服务打车乘客端小车平滑移动-安卓篇 - 腾讯位置服务的个人空间 - OSCHINA - 中文开源技术交流社区

当使用打车软件打车时,我们会好奇司机在送乘客的时候,乘客的手机并没有在导航,那到底是如何做到的呢?今天我们来揭开它神秘的面纱

实现此功能还是需要腾讯位置服务全家桶:腾讯导航SDK、腾讯地图SDK、腾讯定位SDK、腾讯司乘同显SDK,具体权限的开通需要去lbs.qq.com的官网控制台,去操作另外具体SDK的权限可以联系小助手咨询(如下图所示),这里就不多做探讨 !

16222560693250.jpg

使用核心地图工具依赖库

//module 依赖
dependencies {
    // 地图库
    implementation 'com.tencent.map:tencent-map-vector-sdk:4.4.2'
    // 地图组件库,包括小车平移、点聚合等组件功能,详见开发指南。必须!!!
    implementation 'com.tencent.map:sdk-utilities:1.0.6' 
    // 定位sdk,可以从腾讯位置服务中心官网 联系小助手获取
    implementation files('libs/TencentLocationSDK_v8.4.14_ra0311232_20200103_125837_release.aar')
    // 司乘同显乘客端sdk,可以从腾讯位置服务中心官网 联系小助手获取
    implementation files('libs/lspassenger_v2.0.1_04.03.aar')
    implementation files('libs/lssupport_v2.0.1_04.03.aar')
    // 基础库。可以从腾讯位置服务中心官网 联系小助手获取
    implementation 'com.tencent.map:tencent-map-nav-surport:1.0.2.3'   
}

流程图展示

16228857347642.jpg

根据上述流程图的展示,我们知道要实现小车的平滑移动,需要不断的获取司机的最近几秒内点和当前路线。具体过程是当司机开始司乘同显时,会通过司乘同显SDK同步路线和最近几秒的GPS点,不断的轮训这样我们就可以展示小车在地图上的平滑移动了。当然这是在实际生产中,如果卡发者想要来实现看下效果,笔者这里可以提供一个思路,可以构建一个ArrayList来包含整条线路的电串信息,然后不断的每个3秒进行读取3个点来传入地图组件库SDK,以此往复,这样就可以看见效果了。

/**
     * 平滑移动
     * @param points
     */
    private void translateAnima(LatLng[] points) {
        if(points == null || points.length <= 0)
            return;
        // 当司机没有新数据上传,防止拉取回上个点串的最后一个点
        if(points.length == 2 && SHelper.equalOfLatlng(points[0], points[1]))
            return;
        if(carMarker != null)
            carMarker.remove();
        carMarker = mapView.getMap().addMarker(
                new MarkerOptions(points[0])
                        .anchor(0.5f, 0.5f)
                        .icon(BitmapDescriptorFactory.fromResource(R.mipmap.map_icon_driver))
                        //设置此属性 marker 会跟随地图旋转
                        .flat(true)
                        //marker 逆时针方向旋转
                        .clockwise(false));
        Log.e("tag1234", ">>>>>startAnimation()");
        // 小车平滑移动核心组件类,通过com.tencent.map:sdk-utilities:1.0.6获取
        MarkerTranslateAnimator mTranslateAnimator = new MarkerTranslateAnimator(
                //执行此平移动画的 marker
                carMarker,
                //动画持续时间
                animaTime,
                //平移动画点串
                points,
                //marker 是否会根据传入的点串计算并执行旋转动画, marker 方向将与移动方向保持一致
                true);
        mTranslateAnimator.startAnimation();
        mTranslateAnimator.setFloatValuesListener(new MarkerTranslateAnimator.IAnimaFloatValuesListener() {
            @Override
            public void floatValues(LatLng latLng) {
                // 小车走过的路线进行擦除
                eraseRoute(latLng);
            }
        });
    }
    
    // 路线擦除代码
    private void eraseRoute(LatLng latLng) {
        if(eraseThread == null) {
            eraseThread = new HandlerThread("car_erase_line");
            eraseThread.start();
        }
        if(eraseHandler == null ) {
            eraseHandler = new EraseHandler(eraseThread.getLooper());
        }

        Message message = Message.obtain();
        message.obj = latLng;
        message.what = ERASE_MSG;
        eraseHandler.sendMessage(message);
    }

    class EraseHandler extends Handler {

        public EraseHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            try{
                switch (msg.what){
                    case ERASE_MSG:
                        LatLng latLng = (LatLng) (msg.obj);
                        if(latLng != null && polyline != null)
                            polyline.eraseTo(curEraseLatlng != null ? curEraseLatlng.getPointIndex() : 0, latLng);
                        eraseHandler.removeMessages(ERASE_MSG);
                        break;
                }
            }catch (Exception e){
                Log.e(LOG_TAG, "erase handler handle message error:" + e.getMessage());
            }
        }
    }

如果感兴趣的朋友,可以看下这里的完整实现demo:https://github.com/tencentmap-mobility/mapmobilitydemo-passenger-Android/blob/master/app/src/main/java/com/map/mobility/passenger/synchro_v2/psg/PsgActivity.java

最终的效果展示

AnnotationAnimation.gif


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK