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();//销毁地图
    }
     
}

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

原文地址:https://www.cnblogs.com/zhujiabin/p/4825387.html