资讯专栏INFORMATION COLUMN

百度地图的使用-定位—逆地理编码(即坐标转地址)

tylin / 3032人阅读

摘要:先上效果定位拖动定位定位动画动画结束显示地址实现思路中心点不变,在百度地图图层上覆盖自定义的定位布局拖动地图时,隐藏地址显示,定位标示落下来后显示地址拿到百度地图的拖动监听拿到中心点经纬度,逆地理编码即坐标转地址具体实现布局在主界面布局上覆

先上效果:

定位+拖动定位

定位动画

动画结束显示地址

实现思路

中心点不变,在百度地图图层上覆盖自定义的定位布局
(TextView+ImageView+ImageView)

拖动地图时,隐藏地址显示,定位标示落下来后显示地址

拿到百度地图的拖动监听 setOnMapStatusChangeListener

拿到中心点经纬度,逆地理编码(即坐标转地址)mapStatus.target

具体实现: 布局:

在主界面布局上覆盖自己定位用的布局location_marker




    
    

location_marker布局:三个控件



    

    

    


拖动监听

创建地理编码检索实例;

创建地理编码检索监听者;

开始向上的动画

停止拖动后,发起地理编码检索

mBaiduMap.setOnMapStatusChangeListener(new BaiduMap.OnMapStatusChangeListener() {
            @Override
            public void onMapStatusChangeStart(MapStatus mapStatus) {
                mSearch = GeoCoder.newInstance();
                mSearch.setOnGetGeoCodeResultListener(listener);
                startUpAnimation(new Animation.AnimationListener() {
                    @Override
                    public void onAnimationStart(Animation animation) {
                        //动画开始时,隐藏地址显示
                        tv_describe.setVisibility(View.INVISIBLE);
                    }

                    @Override
                    public void onAnimationEnd(Animation animation) {

                    }

                    @Override
                    public void onAnimationRepeat(Animation animation) {

                    }
                });

            }

            @Override
            public void onMapStatusChangeStart(MapStatus mapStatus, int i) {

            }

            @Override
            public void onMapStatusChange(MapStatus mapStatus) {

            }

            @Override
            public void onMapStatusChangeFinish(MapStatus mapStatus) {

                mSearch.reverseGeoCode(new ReverseGeoCodeOption()
                        .location(mapStatus.target));



            }
        });

地理位置编码检索监听实现:

OnGetGeoCoderResultListener listener = new OnGetGeoCoderResultListener() {

        public void onGetGeoCodeResult(GeoCodeResult result) {

            if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
                //没有检索到结果
            }

            //获取地理编码结果
        }

        @Override

        public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {

            if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
                //没有找到检索结果
                Toast.makeText(MainActivity.this,"没有找到检索结果",Toast.LENGTH_SHORT).show();
            }

            //获取反向地理编码结果
            String address = result.getAddress();
            System.out.println(address+"---------");
            tv_describe.setText(address);
            startDownAnimation(new Animation.AnimationListener() {
                @Override
                public void onAnimationStart(Animation animation) {

                }

                @Override
                public void onAnimationEnd(Animation animation) {
                    tv_describe.setVisibility(View.VISIBLE);
                    bounce();
                }

                @Override
                public void onAnimationRepeat(Animation animation) {

                }
            });

        }
    };
三种动画的具体实现:
需要一个变量纪录是否向上
    private boolean isUp = false;

    /**
     * 向上移动动画
     */
    public void startUpAnimation(Animation.AnimationListener listener){
        if (isUp){
            return;
        }
        Animation animation = new TranslateAnimation(
                0,
                0,
                0  ,
                - 80);
        animation.setDuration(500);
        animation.setFillAfter(true);//设置为true,动画转化结束后被应用
        animation.setInterpolator(new AccelerateDecelerateInterpolator());
        iv_location.startAnimation(animation);//开始动画
        if(listener != null){
            animation.setAnimationListener(listener);
        }

        isUp = true;
    }

    /**
     * 向下移动动画
     */
    public void startDownAnimation(Animation.AnimationListener listener){
        if(isUp){
            Animation animation = new TranslateAnimation(
                    0,
                    0,
                    -80,
                    0);
            animation.setDuration(500);
            animation.setFillAfter(true);//设置为true,动画转化结束后被应用
            animation.setInterpolator(new AccelerateInterpolator(15));
            if(listener != null){
                animation.setAnimationListener(listener);
            }
            iv_location.startAnimation(animation);//开始动画
            isUp = false;
        }
    }

    /**
     * 弹跳动画
     */
    public  void bounce() {
        if (iv_location.getVisibility() == View.VISIBLE) {
            ObjectAnimator animator = ObjectAnimator.ofFloat(iv_location, "translationY", 0, -30, 0);
            animator.setInterpolator(new EasingInterpolator(EasingInterpolator.Ease.ELASTIC_IN_OUT));

            animator.setDuration(1000);
            animator.setRepeatMode(ValueAnimator.REVERSE);
            animator.start();
        }
    }
定位方面参考之前文章,更新一下之前写的MyLocationListener
新添加一个变量纪录是否第一次定位
private boolean isFirst = true;
    class MyLocationListener extends BDAbstractLocationListener {


        @Override
        public void onReceiveLocation(BDLocation bdLocation) {

            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(bdLocation.getRadius())
                    // 此处设置开发者获取到的方向信息,顺时针0-360
                    .direction(bdLocation.getDirection()).latitude(bdLocation.getLatitude())
                    .longitude(bdLocation.getLongitude()).build();
            mBaiduMap.setMyLocationData(locData);

            String addr = bdLocation.getAddrStr();    //获取详细地址信息
            String country = bdLocation.getCountry();    //获取国家
            String province = bdLocation.getProvince();    //获取省份
            String city = bdLocation.getCity();    //获取城市
            String district = bdLocation.getDistrict();    //获取区县
            String street = bdLocation.getStreet();    //获取街道信息
//            showMyLocate(locData);

            if(isFirst){
                // 开始移动百度地图的定位地点到中心位置
                LatLng ll = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
                MapStatusUpdate u = MapStatusUpdateFactory.newLatLngZoom(ll,16);
                mBaiduMap.animateMapStatus(u);
                isFirst = false;
            }

        }
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71419.html

相关文章

  • 如何用Python完成百度与高德地图

      众所周知,Python的一个使用场景还是比较多的,在工作当中,也会涉及到多方面的一些事情。那么,今天小编写这篇文章的一个主要目的,给大家来介绍关于如何用Python完成百度与搞得地图转换,下面就给大家详细介绍下。  一、地理编码与逆编码  地理编码与逆编码表示的是地名地址与地理坐标(经纬度)互相转换的过程。其中,将地址信息映射为地理坐标的过程称之为地理编码;将地理坐标转换为地址信息的过程称之为...

    89542767 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<