zoukankan      html  css  js  c++  java
  • 百度地图使用之基本功能

    下面将陆续摘录百度地图的使用,本文先介绍百度地图基本功能的使用,代码原型来自百度Demo:

    注意需要到百度地图开放平台申请key和下载相应jar包:http://developer.baidu.com/map/sdkandev-download.htm

    Activity:

    package com.home;
    
    import com.baidu.mapapi.BMapManager;
    import com.baidu.mapapi.map.MKMapViewListener;
    import com.baidu.mapapi.map.MapController;
    import com.baidu.mapapi.map.MapPoi;
    import com.baidu.mapapi.map.MapView;
    import com.baidu.platform.comapi.basestruct.GeoPoint;
    
    import android.os.Bundle;
    import android.widget.Toast;
    import android.app.Activity;
    import android.graphics.Bitmap;
    
    /**
     * 演示MapView的基本用法
     * 
     * @author Administrator
     * 
     */
    public class BaseMapActivity extends Activity {
    	/**
    	 * MapView 是地图主控件
    	 */
    	private MapView mMapView = null;
    	/**
    	 * 用MapController完成地图控制
    	 */
    	private MapController mMapController = null;
    	/**
    	 * MKMapViewListener 用于处理地图事件回调
    	 */
    	MKMapViewListener mMapListener = null;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		/**
    		 * 使用地图sdk前需先初始化BMapManager. BMapManager是全局的,可为多个MapView共用,它需要地图模块创建前创建,
    		 * 并在地图地图模块销毁后销毁,只要还有地图模块在使用,BMapManager就不应该销毁
    		 */
    		DemoApplication app = (DemoApplication) this.getApplication();
    		if (app.mBMapManager == null) {
    			app.mBMapManager = new BMapManager(this);
    			/**
    			 * 如果BMapManager没有初始化则初始化BMapManager
    			 */
    			app.mBMapManager.init(DemoApplication.strKey,
    					new DemoApplication.MyGeneralListener());
    		}
    		setContentView(R.layout.main);
    		/**
    		 * 由于MapView在setContentView()中初始化,所以它需要在BMapManager初始化之后
    		 */
    		setContentView(R.layout.main);
    		mMapView = (MapView) findViewById(R.id.main_bmapView);
    		/**
    		 * 获取地图控制器
    		 */
    		mMapController = mMapView.getController();
    		/**
    		 * 设置地图是否响应点击事件 .
    		 */
    		mMapController.enableClick(true);
    		/**
    		 * 设置地图缩放级别
    		 */
    		mMapController.setZoom(12);
    
    		/**
    		 * 将地图移动至指定点
    		 * 使用百度经纬度坐标,可以通过http://api.map.baidu.com/lbsapi/getpoint/index
    		 * .html查询地理坐标 如果需要在百度地图上显示使用其他坐标系统的位置,请发邮件至mapapi@baidu.com申请坐标转换接口
    		 */
    		double cLat = 30.67;
    		double cLon = 104.10;
    		// 设置中心点为成都市成华区
    		GeoPoint p = new GeoPoint((int) (cLat * 1E6), (int) (cLon * 1E6));
    		mMapController.setCenter(p);
    		// 用于处理地图事件回调
    		mMapListener = new MKMapViewListener() {
    			@Override
    			public void onMapMoveFinish() {
    				/**
    				 * 在此处理地图移动完成回调 缩放,平移等操作完成后,此回调被触发
    				 */
    			}
    
    			@Override
    			public void onClickMapPoi(MapPoi mapPoiInfo) {
    				/**
    				 * 在此处理底图poi点击事件 显示底图poi名称并移动至该点 设置过:
    				 * mMapController.enableClick(true),此回调才能被触发
    				 * 
    				 */
    				String title = "";
    				if (mapPoiInfo != null) {
    					title = mapPoiInfo.strText;
    					Toast.makeText(BaseMapActivity.this, title,
    							Toast.LENGTH_SHORT).show();
    					mMapController.animateTo(mapPoiInfo.geoPt);
    				}
    			}
    
    			@Override
    			public void onGetCurrentMap(Bitmap b) {
    				/**
    				 * 当调用过 mMapView.getCurrentMap()后,此回调会被触发 可在此保存截图至存储设备
    				 */
    			}
    
    			@Override
    			public void onMapAnimationFinish() {
    				/**
    				 * 地图完成带动画的操作(如: animationTo())后,此回调被触发
    				 */
    			}
    
    			/**
    			 * 在此处理地图加载完成事件
    			 */
    			@Override
    			public void onMapLoadFinish() {
    				Toast.makeText(BaseMapActivity.this, "地图加载完成!",
    						Toast.LENGTH_SHORT).show();
    
    			}
    		};
    		mMapView.regMapViewListener(DemoApplication.getInstance().mBMapManager,
    				mMapListener);
    	}
    
    	@Override
    	protected void onPause() {
    		/**
    		 * MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()
    		 */
    		mMapView.onPause();
    		super.onPause();
    	}
    
    	@Override
    	protected void onResume() {
    		/**
    		 * MapView的生命周期与Activity同步,当activity恢复时需调用MapView.onResume()
    		 */
    		mMapView.onResume();
    		super.onResume();
    	}
    
    	@Override
    	protected void onDestroy() {
    		/**
    		 * MapView的生命周期与Activity同步,当activity销毁时需调用MapView.destroy()
    		 */
    		mMapView.destroy();
    		super.onDestroy();
    	}
    
    	@Override
    	protected void onSaveInstanceState(Bundle outState) {
    		super.onSaveInstanceState(outState);
    		mMapView.onSaveInstanceState(outState);
    
    	}
    
    	@Override
    	protected void onRestoreInstanceState(Bundle savedInstanceState) {
    		super.onRestoreInstanceState(savedInstanceState);
    		mMapView.onRestoreInstanceState(savedInstanceState);
    	}
    }
    

    Application:

    package com.home;
    
    import com.baidu.mapapi.BMapManager;
    import com.baidu.mapapi.MKGeneralListener;
    import com.baidu.mapapi.map.MKEvent;
    
    import android.app.Application;
    import android.content.Context;
    import android.widget.Toast;
    
    public class DemoApplication extends Application {
    	private static DemoApplication mInstance = null;
    	BMapManager mBMapManager = null;
    	public static final String strKey = "0B0d1233eec3932c2273b4da82b27e36";
    
    	/*
    	 * 注意:为了给用户提供更安全的服务,Android SDK自v2.1.3版本开始采用了全新的Key验证体系。
    	 * 因此,当您选择使用v2.1.3及之后版本的SDK时,需要到新的Key申请页面进行全新Key的申请, 申请及配置流程请参考开发指南的对应章节
    	 */
    	@Override
    	public void onCreate() {
    		super.onCreate();
    		mInstance = this;
    		initEngineManager(this);
    	}
    
    	public static DemoApplication getInstance() {
    		return mInstance;
    	}
    
    	public void initEngineManager(Context context) {
    		if (mBMapManager == null) {
    			mBMapManager = new BMapManager(context);
    		}
    
    		if (!mBMapManager.init(strKey, new MyGeneralListener())) {
    			Toast.makeText(
    					DemoApplication.getInstance().getApplicationContext(),
    					"BMapManager  初始化错误!", Toast.LENGTH_LONG).show();
    		}
    	}
    
    	// 常用事件监听,用来处理通常的网络错误,授权验证错误等
    	static class MyGeneralListener implements MKGeneralListener {
    
    		@Override
    		public void onGetNetworkState(int iError) {
    			if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
    				Toast.makeText(
    						DemoApplication.getInstance().getApplicationContext(),
    						"网络出错!", Toast.LENGTH_LONG).show();
    			} else if (iError == MKEvent.ERROR_NETWORK_DATA) {
    				Toast.makeText(
    						DemoApplication.getInstance().getApplicationContext(),
    						"输入正确的检索条件!", Toast.LENGTH_LONG).show();
    			}
    		}
    
    		@Override
    		public void onGetPermissionState(int iError) {
    			if (iError == MKEvent.ERROR_PERMISSION_DENIED) {
    				// 授权Key错误:
    				Toast.makeText(
    						DemoApplication.getInstance().getApplicationContext(),
    						"请输入正确的授权Key!", Toast.LENGTH_LONG).show();
    			}
    		}
    	}
    }
    

    Manifest:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.home"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="10"
            android:targetSdkVersion="10" />
        <!-- 使用网络功能所需权限 -->
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
        </uses-permission>
        <uses-permission android:name="android.permission.INTERNET" >
        </uses-permission>
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
        </uses-permission>
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
        </uses-permission>
    
        <!-- 读取手机的当前状态权限,没有的话会报错,这个是使用百度地图API必须的 -->
        <uses-permission android:name="android.permission.READ_PHONE_STATE" >
        </uses-permission>
    
        <!-- Cache功能需要读写外部存储器 ,若没这个权限,地图加载不出来 -->
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
        </uses-permission>
    
        <!--
                 添加屏幕支持
          android:anyDensity="true" 
                这个属性指明应用程序是否包含了能够适用于任何屏幕密度的资源。
                对于支持Android1.6(API Level 4)和更高版本的应用程序,这个属性的默认值是true,
                并且除非绝对的确认这是应用程序正常工作所必须的,否则不应该把它设置为false。
                只是在应用程序直接操作位图时才需要禁止这个属性。
          
          android:largeScreens="true"
                  这个属性用于指示应用程序是否支持较大外形的屏幕。
                  一个large类型的屏幕被定义成一个比normal类型的手持设备的屏幕明显还要大的屏幕,
                  并且为了让应用程序能够良好的使用,使用这个属性时要特别小心,尽管可以依赖系统来调整尺寸,
                  以便能够填充屏幕。
                  这个属性的默认值实际上在某些版本之间是不同的,因此最好在任何时候都明确的声明这个属性。
                  如果设置为false,系统会启用屏幕兼容模式,这时要格外的小心。
          
          android:normalScreens="true"
                  这个属性用于指示应用程序是否支持普通外形的屏幕。
                  典型的是HVGA中等密度的屏幕,但是WQVGA低密度和WVGA高密度屏幕也被认为是普通屏幕。
                  这个属性的默认值是true。
          
          android:smallScreens="true" 
                  这个属性用于指定应用程序是否支持较小外形的屏幕。
                  一个small类型的屏幕被定义成一个比normal(传统的HVGA)类型的屏幕还要小的屏幕。
                  外部服务(如Google Play)不会把不支持小屏的应用程序提供给小屏设备,
                  因为很少有能够确保该应用程序在小屏幕的设备上正常工作的平台。这个属性的默认值是true。
          
          android:resizeable="true" 
                  这个属性用于指示针对不同的屏幕尺寸,应用程序是否可以调整尺寸。默认值是true。
        -->
        <supports-screens
            android:anyDensity="true"
            android:largeScreens="true"
            android:normalScreens="true"
            android:resizeable="true"
            android:smallScreens="true" />
    
        <application
            android:name="com.home.DemoApplication"
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.home.BaseMapActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>

    布局XML:

    <LinearLayout 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/main_bmapView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clickable="true" />
    
    </LinearLayout>




     

  • 相关阅读:
    Cufon css3@font-face
    HTML5 Canvas
    HTML5 Canvas 的宽高
    :nth-child()
    new Image()
    ios有些机型input和fixed导致的页面错位问题
    使用performance进行前端性能监控
    throttle(节流)和debounce(防抖)
    object-fit/object-position
    flex布局与ellipsis冲突问题
  • 原文地址:https://www.cnblogs.com/pangblog/p/3292153.html
Copyright © 2011-2022 走看看