• android 自定义百度地图放大缩小


    自定义实现Android百度地图的缩放图标,需要自定义一个缩放控件,实现效果如下:

    这里的缩放效果,实现了点击按钮可以对地图的放大缩小,通过手势放大与缩小也控制缩放图标的可用状态。具体实现如下:

    zoom_selector_out.xml

    <!--?xml version="1.0" encoding="utf-8"?-->
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_pressed="true" android:drawable="@drawable/zoomout_press">
        <item android:state_enabled="false" android:drawable="@drawable/zoomout_disable">
        <item android:drawable="@drawable/zoomout_normal">
    </item></item></item></selector>

    layout中的zoom_controls_in_out.xml布局文件:

    <!--?xml version="1.0" encoding="utf-8"?-->
    <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
     
        <button android:id="@+id/btn_zoom_in" android:layout_width="32dp" android:layout_height="32dp" android:background="@drawable/zoom_selector_in">
     
        </button><button android:id="@+id/btn_zoom_out" android:layout_width="32dp" android:layout_height="32dp" android:background="@drawable/zoom_selector_out">
     
    </button></linearlayout>


    主配置文件main_activity.xml

    <!--?xml version="1.0" encoding="utf-8"?-->
    <relativelayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
        <com.baidu.mapapi.map.mapview android:id="@+id/mv_map" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true">
        <com.example.map.view.zoomcontrolsview android:id="@+id/zcv_zoom" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparentright="true" android:layout_alignparentbottom="true" android:layout_marginbottom="10dp" android:layout_marginright="10dp">
    </com.example.map.view.zoomcontrolsview></com.baidu.mapapi.map.mapview></relativelayout>

    相关的xml文件都在这里了,下面是具体实现代码:

    自定义缩放控件类ZoomControlsView.java

    package com.example.map.view;
    import com.baidu.mapapi.map.BaiduMap;
    import com.baidu.mapapi.map.MapStatus;
    import com.baidu.mapapi.map.MapStatusUpdateFactory;
    import com.baidu.mapapi.map.MapView;
    import com.example.map.activity.R;
     
    import android.content.Context;
    import android.util.AttributeSet;
    import android.widget.Button;
    import android.widget.LinearLayout;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.View.OnClickListener;;
     
    public class ZoomControlsView extends LinearLayout implements OnClickListener{
        private Button inBtn;//放大按钮
        private Button outBtn;//缩小按钮
        private BaiduMap baiduMap;//百度地图对象控制器
        private MapStatus mapStatus;//百度地图状态
        private float minZoomLevel;//地图最小级别
        private float maxZoomLevel;//地图最大级别
     
        public ZoomControlsView(Context context, AttributeSet attrs) {
            super(context, attrs, 0);
            init();
        }
         
        public ZoomControlsView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
         
        /**
         * 初始化
         */
        private void init(){
            //获取布局视图
            LinearLayout view=(LinearLayout) LayoutInflater.from(getContext()).inflate(R.layout.zoom_controls_in_out, null);
            //获取放大按钮
            inBtn=(Button) view.findViewById(R.id.btn_zoom_in);
            //获取缩小按钮
            outBtn=(Button) view.findViewById(R.id.btn_zoom_out);
            //设置点击事件
            inBtn.setOnClickListener(this);
            outBtn.setOnClickListener(this);
            //添加View
            addView(view);
        }
     
        @Override
        public void onClick(View v) {
            this.mapStatus=this.baiduMap.getMapStatus();//获取地图状态
            switch (v.getId()) {
            case R.id.btn_zoom_in:
                //改变地图状态
                this.baiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(mapStatus.zoom+1));
                controlZoomShow();//改变缩放按钮
                break;
            case R.id.btn_zoom_out:
                //改变地图状态
                this.baiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(mapStatus.zoom-1));
                controlZoomShow();//改变缩放按钮
                break;
            default:
                break;
            }
            //重新获取状态
            mapStatus=this.baiduMap.getMapStatus();
        }
         
        /**
         * 设置Map视图
         * @param mapView
         */
        public void setMapView(MapView mapView){
            //获取百度地图控制器
            this.baiduMap=mapView.getMap();
            //设置地图手势事件
            this.baiduMap.setOnMapStatusChangeListener(onMapStatusChangeListener);
            //获取百度地图最大最小级别
            maxZoomLevel=baiduMap.getMaxZoomLevel();
            minZoomLevel=baiduMap.getMinZoomLevel();
            controlZoomShow();//改变缩放按钮
        }
         
        /**
         * 控制缩放图标显示
         */
        private void controlZoomShow(){
            //获取当前地图状态
            float zoom=this.baiduMap.getMapStatus().zoom;
            //如果当前状态大于等于地图的最大状态,则放大按钮则失效
            if(zoom>=maxZoomLevel){
                inBtn.setBackgroundResource(R.drawable.zoomin_press);
                inBtn.setEnabled(false);
            }else{
                inBtn.setBackgroundResource(R.drawable.zoom_selector_in);
                inBtn.setEnabled(true);
            }
             
            //如果当前状态小于等于地图的最小状态,则缩小按钮失效
            if(zoom<=minZoomLevel){
                outBtn.setBackgroundResource(R.drawable.zoomout_press);
                outBtn.setEnabled(false);
            }else{
                outBtn.setBackgroundResource(R.drawable.zoom_selector_out);
                outBtn.setEnabled(true);
            }
        }
        /**
         * 地图状态改变相关接口实现
         */
        BaiduMap.OnMapStatusChangeListener onMapStatusChangeListener=new BaiduMap.OnMapStatusChangeListener() {
             
            /**
             * 手势操作地图,设置地图状态等操作导致地图状态开始改变。 
             * @param status 地图状态改变开始时的地图状态 
             */
            @Override
            public void onMapStatusChangeStart(MapStatus arg0) {
                 
            }
             
            /**
             * 地图状态变化结束
             * @param status 地图状态改变结束时的地图状态 
             */
            @Override
            public void onMapStatusChangeFinish(MapStatus arg0) {
                 
            }
             
            /**
             * 地图状态变化中
             * @param status 当前地图状态
             */
            @Override
            public void onMapStatusChange(MapStatus arg0) {
                controlZoomShow();
            }
        };
     
    }

    MainActivity.java:

    package com.example.map.activity;
    import com.baidu.mapapi.SDKInitializer;
    import com.baidu.mapapi.map.BaiduMap;
    import com.baidu.mapapi.map.MapView;
    import com.example.map.view.ZoomControlsView;
     
    import android.app.Activity;
    import android.os.Bundle;
     
    public class MainActivity extends Activity{
        private MapView mvMap;//百度地图控件
        private BaiduMap baiduMap;//地图对象控制器
        private ZoomControlsView zcvZomm;//缩放控件
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //必须在setContentView前
            SDKInitializer.initialize(getApplicationContext());
            setContentView(R.layout.main_activity);
            initMap();//初始化
        }
         
        /**
         * 初始化地图
         */
        private void initMap(){
            //获取地图控件
            mvMap=(MapView) findViewById(R.id.mv_map);
            mvMap.showZoomControls(false);//隐藏缩放控件
            //获取地图对象控制器
            baiduMap=mvMap.getMap();
            baiduMap.setBuildingsEnabled(true);//设置显示楼体
            baiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(19f));//设置地图状态
             
            //获取缩放控件
            zcvZomm=(ZoomControlsView) findViewById(R.id.zcv_zoom);
            zcvZomm.setMapView(mvMap);//设置百度地图控件
             
        }
         
         
         
        @Override
        protected void onPause() {
            super.onPause();
            mvMap.onPause();
        }
         
        @Override
        protected void onResume() {
            super.onResume();
            mvMap.onResume();
        }
        @Override
        protected void onDestroy() {
            super.onDestroy();
            mvMap.onDestroy();//销毁地图
        }
         
    }

    这样就实现了自定义的缩放图标了

  • 相关阅读:
    [语言基础] 我只想导入目标包中的一个模块,没想到目标包的其他非模块代码也被执行了。。
    [vscode] os.getcwd(),调试和命令行运行的结果不一致
    234. 回文链表
    不生成新数组的迭代器方法:forEach()&every()&some()&reduce()&reduceRight()
    合并数组并对数组排序
    为数组排序:sort()&reverse()
    从数组中间位置添加元素:unshift()方法的有一种运用
    从数组中删除元素:pop()&unshift()方法
    为数组添加元素:push()&unshift()方法
    由已有数组创建新数组:concat()&splice()方法
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/4825387.html
Copyright © 2020-2023  润新知