Android自定义百度地图缩放图标

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

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

首先是drawable目录下的两个xml配置文件:

zoom_selector_in.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/zoomin_press"/>
    <item android:state_enabled="false" android:drawable="@drawable/zoomin_disable"/>
    <item android:drawable="@drawable/zoomin_normal"/>
</selector>

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"/>
</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
        android:id="@+id/btn_zoom_out"
        android:layout_width="32dp"
        android:layout_height="32dp"
        android:background="@drawable/zoom_selector_out" />

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

}

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

时间: 2024-10-11 04:31:48

Android自定义百度地图缩放图标的相关文章

Android自己定义百度地图缩放图标

自己定义实现Android百度地图的缩放图标,须要自己定义一个缩放控件,实现效果例如以下: 这里的缩放效果,实现了点击button能够对地图的放大缩小,通过手势放大与缩小也控制缩放图标的可用状态.详细实现例如以下: 首先是drawable文件夹下的两个xml配置文件: zoom_selector_in.xml <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="h

android引入百度地图之最简单的例子-HelloBaiDuMap

开发工具 我用的是eclipse,目前这是开发android用的最多的一个工具. 开发准备 首先需要在百度地图开发平台上下载所需要的文档和功能,由于最新版的3.0.0的不是很熟悉,我这里用的是稍旧一点的版本:2.4.1版的:这里是下载地址:http://developer.baidu.com/map/sdkandev-download.htm.我是在这个页面的右下角点击历史版本下载的2.4.1版的: 下载之后它里面有这样一个压缩文件: 解压开之后是这样的三个压缩包: 其中Sample是它的Dem

Android 集成百度地图实现设备定位

Android 集成百度地图实现设备定位步骤1:申请android 端SDK :http://lbsyun.baidu.com/步骤2:下载基础版SDK步骤3:下载示例程序步骤4:开始集成:ak加入libs加入SDKInitializer.setCoordType(CoordType.BD09LL);图标类 /** * 演示覆盖物的用法 */ public class OverlayDemo extends BaseActivity { /** * MapView 是地图主控件 */ priva

Android studio 百度地图开发(5)查询周边服务(加油站)

email:[email protected] 开发环境:win7 64位,Android Studio,请注意是Android Studio,使用的导航SDK版本:3.1.0. 百度地图应用(1):Android studio 百度地图开发(1)配置工程.显示地图 百度地图应用(2):Android studio 百度地图开发(2)地图定位 百度地图应用(3):Android studio 百度地图开发(3)地图导航 百度地图应用(4):Android studio 百度地图开发(4)触摸选点

Android studio 百度地图开发(6)Marker绑定事件、计算两点距离

email:[email protected] 开发环境:win7 64位,Android Studio,请注意是Android Studio,使用的导航SDK版本:3.1.0. 百度地图应用(1):Android studio 百度地图开发(1)配置工程.显示地图 百度地图应用(2):Android studio 百度地图开发(2)地图定位 百度地图应用(3):Android studio 百度地图开发(3)地图导航 百度地图应用(4):Android studio 百度地图开发(4)触摸选点

Android利用百度地图定位

百度地图照着百度的教程做的总是出现报错 请帮我看看错误在那 2013-12-13 15:16168海军 | 分类:百度地图 | 浏览1252次 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.map/com.example.map.MainActivity}: android.view.InflateException: Binary XML file line #11: Error i

Android 关于百度地图Android SDK几处修正使用说明(非官方)

本篇主要是因为最近在学习使用百度地图,发现了一些问题,跟大伙分享一下. 1.根据android sdk开发指南中"Hello World"的例子,构建一个基础的地图页面,如果大家完全按照示例代码中所写的那样,是不会执行成功的,会有以下问题的错误提示"java.lang.RuntimeException: Unable to instantiate activity ComponentInfo" 这个问题出现的原因是 在第二步,配置Activity部分,android

Android studio 百度地图开发(3)地图导航

email:[email protected] 开发环境:win7 64位,Android Studio,请注意是Android Studio,使用的导航SDK版本:3.1.0. 地图显示.工程配置请参考:Android studio 百度地图开发(1)配置工程.显示地图 百度地图定位请参考:Android studio 百度地图开发(2)地图定位 一.我为百度做点事 因为在写定位功能时自己想从头到尾地写,但最后完全是参考了百度官网上的Demo才弄出来,后来发现用Android Studio做导

android 基于百度地图api开发定位以及获取详细地址

一:百度地图开发必须要到百度开发平台android开发api下载相应的库,已经申请百度地图开发key. 二:新建项目baidumaplocation.设计main.xml文件这里注意的是MapView控件必须使用来自百度库封装好的com.baidu.mapapi.MapView .设计代码如下: Xml代码   <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&q