03、HelleBaiduMap
D:\百度地图\百度地图\资料\百度地图与定位SDK\百度地图v3.5.0\BaiduMap_AndroidSDK_v3.5.0_All\BaiduMap_AndroidSDK_v3.5.0_Docs\doc\index.html
public final class MapView
extends ViewGroup
ViewGroup是一个ViewGroup,是一个容器,学自定义View的时候我们就知道如果是一个容器代表说它里面可以装很多其他的子控件.
addView本来ViewGroup它就有,为什么要搞一个addView()呢?这里有一个LayoutParams params,肯定是说参数它不一样.如果说都一样的话用ViewGroup的addView()就行了.以后我们要给覆盖物添加一个Mark就用addView().
setScaleControlPosition可以设置比例尺的位置.
getMap()它能获取到一个地图的控制器,它能控制什么内容呢?我们顺藤摸瓜点进去看看它里面有什么方法?
有很多监听器.方法太多了,所以我们这里看几个比较主要的一些方法就行了.
获取地图最大缩放级别.它最大能放到到多少,最小又能缩小到多少?
08-01 12:36:42.026: I/HelloBaiduMapActivity(1541): minZoomLevel = 3.0, maxZoomLevel20.0.最大缩放级别是20.0,最小缩放级别是3.0.
//MapStatusUpdate mapStatusUpdate = new HelloBaiduMapActivity();//MapStatusUpdate是没有构造方法的,所以你Alt+/ new不出来.
以前学Java基础的时候,有一些类如果没有构造方法那么它可能会有工厂类.
public static MapStatusUpdate newLatLng(LatLng latLng) new一个经纬度.
设置地图新状态
MapStatusUpdateFactory.newMapStatus(MapStatus mapStatus)
BaiduMap是我们地图的一个控制器.就是控制这个地图要干嘛的.
animateMapStatus(MapStatusUpdate update, int durationMs)以动画方式更新地图状态.int durationMs是指定动画的时间,这是一个毫秒值.
360度其实就是0度.说明旋转角度是从0度到360度的.
俯仰之后就能看到一个3D立体效果.俯仰角度最大不是负50度,最大是负45度.
这个是百度地图最基础的功能.
package com.itheima.baidumap74; //Ctrl+Shift+O清除多余的包名. //import com.baidu.mapapi.SDKInitializer; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.MapStatus; import com.baidu.mapapi.map.MapStatusUpdate; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.model.LatLng; public class HelloBaiduMapActivity extends BaseActivity { // 常量要放在最前面. /** 黑马坐标(北京市海淀区东北旺南路45号) */ protected LatLng hmPos = new LatLng(40.050513, 116.30361);// LatLng的一个常量表示. /** 传智坐标 */ protected LatLng czPos = new LatLng(40.065817, 116.349902); /** 天安门坐标 */ protected LatLng tamPos = new LatLng(39.915112, 116.403963); private static final String TAG = "HelloBaiduMapActivity";// 这个常量我们一般用它的类名就行了. private MapView mMapView; private BroadcastReceiver receiver;// 把receiver由局部/本地变量变成成员变量 private BaiduMap baiduMap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 在使用SDK各组件之前初始化context信息,传入ApplicationContext // 注意该方法要再setContentView方法之前实现 // SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); // 获取地图控件引用 mMapView = (MapView) findViewById(R.id.bmapView);// MapView用于显示 // 获取地图控制器 baiduMap = mMapView.getMap();// BaiduMap地图控制器用于控制 // 这个很明显就是一个MVC模式,你这个地图显示出来之后呢我想改变显示的形状.比如说我想让地图旋转或者说是让地图放大. // 就是通过这个控制器来实现.这个是一个标准的MVC模式了. // 1. 隐藏缩放按钮、比例尺 // mMapView.showScaleControl(false);//显示比例控件 隐藏比例按钮 // 默认是显示比例按钮的.Scale是规模,比例,刻度 // mMapView.showZoomControls(false);//隐藏缩放按钮,默认是显示缩放按钮的. // 2. 获取获取最小(3)、最大缩放级别(20) float maxZoomLevel = baiduMap.getMaxZoomLevel();// 获取地图最大缩放级别 用本地/局部变量保存 float minZoomLevel = baiduMap.getMinZoomLevel();// 获取地图最小缩放级别 Log.i(TAG, "minZoomLevel = " + minZoomLevel + ", maxZoomLevel" + maxZoomLevel); // 3. 设置地图中心点为黑马 // MapStatusUpdate mapStatusUpdate = new // HelloBaiduMapActivity();//MapStatusUpdate是没有构造方法的,所以你Alt+/ new不出来. MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory .newLatLng(hmPos); baiduMap.setMapStatus(mapStatusUpdate);// setMapStatus是baiduMap地图控制器的方法.把这个状态传给我这个baiduMap.那我立马就能给你跳到这个位置. // 4.设置地图缩放为15 mapStatusUpdate = MapStatusUpdateFactory.zoomTo(15);// 不new一个经纬度的状态,是new一个缩放的状态.zoomTo是缩放一个绝对值.重复调用zoomTo()它还是缩放到那个数值. baiduMap.setMapStatus(mapStatusUpdate); } // 6.获取地图Ui控制器:隐藏指南针 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub MapStatusUpdate mapStatusUpdate = null;// 在最前面声明一个状态,然后默认值给它一个null switch (keyCode) { // 5.更新地图状态 case KeyEvent.KEYCODE_1: // 1)缩小 mapStatusUpdate = MapStatusUpdateFactory.zoomOut(); break; case KeyEvent.KEYCODE_2: // 2)放大 mapStatusUpdate = MapStatusUpdateFactory.zoomIn(); break; case KeyEvent.KEYCODE_3: // 3)旋转(0 ~ 360),每次在原来的基础上再旋转30度 MapStatus currentMapStatus = baiduMap.getMapStatus(); // 获取地图当前的状态. float rotate = currentMapStatus.rotate + 30;// 拿出它原来的旋转角度. Log.i(TAG, "rotate = " + rotate);//打印旋转角度 MapStatus mapStatus = new MapStatus.Builder().rotate(rotate).build();// MapStatus不能直接new它因为它没有构造方法,你要new的是它MapStatus.Builder的那个类.最后再 // 调用build()就能返回地图的一个状态.但是返回之前需要设置一下旋转角度.rotate()设置旋转角度. mapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mapStatus); break; case KeyEvent.KEYCODE_4: // 4)俯仰(0 ~ -45),每次在原来的基础上再俯仰-5度 currentMapStatus = baiduMap.getMapStatus();// 获取地图当前的状态. float overlook = currentMapStatus.overlook - 5;//为什么要俯仰负5度?后面演示的时候再说.因为我们拿出来是45,再减5就变成50了.所以是这个地方误导了一下,误导了.其实俯仰角度最大是负45.为什么要减5? //因为它这个只支持负数,你给它一个正数它是看不到俯仰效果的. Log.i(TAG, "overlook = " + overlook);//打印俯仰角度 mapStatus = new MapStatus.Builder().overlook(overlook).build();//MapStatus没有构造方法你只能重新去new它的Builder().然后调一下build()方法它就创建出来这个状态对象. //build()之前要进行一个俯仰.overlook()设置俯仰角度. mapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mapStatus); break; case KeyEvent.KEYCODE_5: // 5)移动 mapStatusUpdate = MapStatusUpdateFactory.newLatLng(czPos);//移动,它是没有move这种方法的.移动的实现是你给它一个位置(经纬度)就行了. //移动这个状态呢它是瞬间改变你看不到效果. baiduMap.animateMapStatus(mapStatusUpdate, 2000);//animateMapStatus是能看到过程的,以动画的形式改变这个状态.2000ms,让它两秒钟完成. return super.onKeyDown(keyCode, event);//一return这个语句就完了它就不会走下面. } baiduMap.setMapStatus(mapStatusUpdate);//这是瞬间改变看不到过程. return super.onKeyDown(keyCode, event); } @SuppressWarnings("unused") private void registerSDKCheckReceiver() { // 如果你不注册这个广播假设你这个key错了你也不知道.你可能会认为哪一步错了然后找很久找不到原因.所以我们最好去注册一下这样的一个广播. receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub // 如果说接收到广播就会跑到这里面来. // 这里面由于我们是有两个action,我们要进行一个判断,先把它们取出来. String action = intent.getAction(); if (SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR .equals(action)) {// 首先是这个网络错误,. // 显示吐司这种代码很常用,如果说我们有一个base的话呢以后我们显示吐司会非常方便. // 这个base类大家应该不陌生. // 当我们接收到这一个网络处理故障的广播的时候呢, showToast("网络错误"); } else if (SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR .equals(action)) { showToast("key验证失败"); } } // 因为代码不会很多我就直接new它的内部类了. }; IntentFilter filter = new IntentFilter();// 本地变量,局部变量.IntentFilter是比较关键,也就是说你要拦截哪些广播就通过它来指定. // 监听网络错误 filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);// 广播会以action的方式发出来.这个action从哪里来呢? // 我们最主要的还不是监听网络错误,我们需要的是权限检查的错误 // 监听百度地图sdk 的key是否正确. filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR); // 只要这两个广播一发出来,那你这个接收者呢就能接收到 // 注册接收者 registerReceiver(receiver, filter);// 接收一个广播接收者BroadcastReceiver,IntentFilter. } // Ctrl+I格式化 // 这是百度地图规定的,它mMapView也有生命周期方法,你必须在Activity相应的生命周期方法里面呢去调mMapView对应的生命周期方法. // 这个就没什么好记的了,死记硬背就行了.照着调用. @Override protected void onDestroy() { super.onDestroy(); // 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 mMapView.onDestroy(); // 解除注册接收者 unregisterReceiver(receiver); } @Override protected void onResume() { super.onResume(); // 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); // 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理 mMapView.onPause(); } }
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.itheima.baidumap74" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <!-- 增加读电话状态的权限.这个你不加也无所谓,但是看到报那个黄色异常还是挺不爽的.还是把它加一下. --> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <application android:name=".MyApplication" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <!-- .就代表你前面这个基础的一个包 --> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="QaDs6ScFuwxGh75ku6gijqNnBhnXmNqZ" /> <!-- 下面这个activity也是一样,简单一点,以.打头就行了.这样看起来会比较简短一点,看起来会比较舒服. android:name="com.itheima.baidumap74.MainActivity" --> <activity android:name=".HelloBaiduMapActivity" 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>