zoukankan      html  css  js  c++  java
  • 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();//销毁地图
        }
         
    }

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

  • 相关阅读:
    poj 1088 滑雪
    位运算与bitset
    hdu 4607 Park Visit
    树的直径
    codeforces 495D Sonya and Matrix
    German Collegiate Programming Contest 2015(第三场)
    BAPC 2014 Preliminary(第一场)
    Benelux Algorithm Programming Contest 2014 Final(第二场)
    E. Reachability from the Capital(tarjan+dfs)
    poj2104 K-th Number(划分树)
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/4825387.html
Copyright © 2011-2022 走看看