Android自定義百度地圖縮放圖標

自定義實現Android百度地圖的縮放圖標,需要自定義一個縮放控件,實現效果如下:

這裡的縮放效果,實現瞭點擊按鈕可以對地圖的放大縮小,通過手勢放大與縮小也控制縮放圖標的可用狀態。具體實現如下:vcD4KPHA+ytfPyMrHZHJhd2FibGXEv8K8z8K1xMG9uPZ4bWzF5NbDzsS8/qO6PC9wPgo8cD56b29tX3NlbGVjdG9yX2luLnhtbDwvcD4KPHA+PHByZSBjbGFzcz0=”brush:java;”>

zoom_selector_out.xml


    
    
    

layout中的zoom_controls_in_out.xml佈局文件:



    

主配置文件main_activity.xml


    
    

相關的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();//銷毀地圖
	}
	
}

這樣就實現瞭自定義的縮放圖標瞭

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *