第五步抽取就完成了,用DemoListActivity会非常简化我们的开发.
我们这个地图是可以包含一个或者说多个图层的,然后呢就是由多个图层呢就组成了我们这个百度地图了.它们覆盖了地图的整个表面.
百度地图热力图属于我们图层之中的一个分类.也就是说一会儿它显示出来的内容它会以一个图层的方式添加到地图里面去.像这种呢就是给添加了一个图层,添加到地图上面.
黑马坐标是通过坐标拾取系统来拾取的.我们java里面那个坐标它是纬度在前面,经度在后面,一定要反过来用.这里的话呢它是经度在前面纬度在后面.但是那个百度那个API就比较怪故意把纬度放到前面去了.大家用的时候要注意这个地方.
我们还有一个坐标反查.反查就是说你可以直接用这个坐标去查它具体位置在哪里.
百度迁徙:从其他地方进入北京市的一个情况.当你们快过年的时候呢你们看一看这个迁出.
商户免费标注:
提交完之后呢并不是说你就能马上看到你这个位置了.你肯定需要百度的人员去审核的.审核之后呢你在百度地图上百度你的公司你就能看到.
卫星地图是卫星拍摄的真实的地理面貌,所以卫星地图可用来检测地面的信息,你可以了解到地理位置,地形等。也就是说你一会儿看到的显示效果是真实的图片.
这些图是压盖的关系.基础地图是在最底部的,这个1代表它是在最底部.地形它是在底图的上方.以后你要写一些什么图层的时候呢如果你发现它们的一个位置不对你就来看看这个图层的一个关系就行了.
图层MapLayerActivity.java只要继承了BaseActivity.java,就能够使用父类里面的一些变量,例如:baiduMap和mMapView.
运行结果:
这个图是我们卫星真实拍摄的图片,都是真实的图片不是用电脑画的.是真实拍摄的这些照片.
按3,就多了一些绿色的线框.然后这些框有一些是红色的、有一些是橙色的、有一些是绿色的.那它就代表了你这个交通路况.红色就非常堵,绿色的话就非常畅通.还有橙色可能是一个居中的状态不是很堵也不是很畅通.那这个就是一个图层的分类.
package com.itheima.baidumap74; import com.baidu.mapapi.map.BaiduMap; import android.view.KeyEvent; public class MapLayerActivity extends BaseActivity { @Override public void init() { // TODO Auto-generated method stub } //这里就演示一下那个分类.有三个. //不写按钮,用onKeyDown的方法 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub switch (keyCode) { case KeyEvent.KEYCODE_1: //显示普通地图 baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);//BaiduMap里面会提供对应的常量.NORMAL是正常的普通的地图. //还有SATELLITE是我们的卫星图. baiduMap.setTrafficEnabled(false);//显示普通地图的时候不希望看到交通图. break; case KeyEvent.KEYCODE_2: //显示卫星图 baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE); baiduMap.setTrafficEnabled(false);//显示卫星地图的时候不希望看到交通图. break; case KeyEvent.KEYCODE_3: //显示交通图 baiduMap.setTrafficEnabled(true); break; //default: //break; } return super.onKeyDown(keyCode, event); } }
package com.itheima.baidumap74; //import com.itheima.baidumap74.DemoListActivity.ClassAndName; import com.baidu.mapapi.SDKInitializer; import com.itheima.baidumap74.util.Utils; import android.app.ListActivity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; //import android.widget.ListAdapter; import android.widget.ListView; public class DemoListActivity extends ListActivity { private BroadcastReceiver receiver; private ClassAndName[] datas = { //把它变成成员变量.直接用静态数组,静态初始化.不用new了,直接在大括号写值就可以了. new ClassAndName(HelloBaiduMapActivity.class, "HelloBaiduMap"),//让HelloBaiduMapActivity显示到DemoListActivity里面去.把字节码HelloBaiduMapActivity.class放进来.给它起一个名字叫做HelloBaiduMap. //它就相当于一个最基础的HelloWorld的这样的一个代码. //数组的元素是ClassAndName这样的一个类型,所以要new这样一个对象作为它的元素. new ClassAndName(MapLayerActivity.class, "地图图层"),//这个时候我们就发现想添加一个内容就很简单,非常快. //如果说你是写按钮的话就很麻烦了,你要开另一个Activity你要增加一个按钮,会很慢.用这个List的话我们看只要加这么一行语句就搞定. };//这个数组呢我们把它放到adapter的datas里面来,那这个adapter呢最终就能把你这个数组呢给你填充进去,显示到我们listview里面去. @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); registerSDKCheckReceiver(); ArrayAdapter<ClassAndName> adapter = new ArrayAdapter<DemoListActivity.ClassAndName>(this, android.R.layout.simple_list_item_1, datas);//上下文context,布局资源resource, //我们这里面的布局其实非常简单.就一个textview.所以我们这里面可以用系统里面的一个布局.系统里面给我们提供了很多简单的布局.objects其实是我们的数据.把objects改成datas吧. //适配器拿出来.ArrayAdapter它也是ListAdapter的一个子类.用ArrayAdapter,用它的真实类型. //ArrayAdapter需要接收一个数据类型T.T是一个泛型.也就是说一会儿我在适配器里面装什么你就通过泛型给我指定一下.现在我们装的是一个String. //然后你点击的时候它能跳转到这个Activity.说明我点击的时候能拿到对应的一个class.你要开启一个Activity你就要new一个intent,intent里面要传一个class. //所以我们这个对象其实包含了两个数据:一个是这个类的名字,一个是它的一个class字节码. //我们这里就按照面向对象的思想来设计. //listview要想显示数据,必须要给它一个适配器. setListAdapter(adapter);//这个方法它已经给你封装好了.它能直接设置说明它里面已经有一个listview了. } //这个就很简单,你不用去注册什么监听器了.直接覆盖它的onListItemClick方法. //跟我们注册的那个方法可以说是一模一样. @Override protected void onListItemClick(ListView l, View v, int position, long id) { // TODO Auto-generated method stub //super.onListItemClick(l, v, position, id);//super是空实现,可以删除掉. //取出单击位置的对象 ClassAndName 取出之后你就能拿到这个字节码,让它跳转到这个字节码对应的Activity. //Object itemAtPosition = l.getItemAtPosition(position);//l就是listview.把position放进来. ClassAndName classAndName = (ClassAndName) l.getItemAtPosition(position);//其实它拿出来的是ClassAndName //startActivity(new Intent(this, classAndName.cls));//开启一个Activity.上下文传this.字节码从classAndName这里面去取就行了. startActivity(new Intent(this, classAndName.clazz)); } class ClassAndName{//这个对象就封装了这个class和这个名字.数据这里就已经有了.这里我们就用它,待会Adapter里面就装它. //public ClassAndName(Class<?> cls, String name) { public ClassAndName(Class<?> clazz, String name) { super(); //this.cls = cls; this.clazz = clazz; this.name = name; } //这里面就两个内容:一个是名字, //public Class<?> cls; //名字是String,或者是写字节码也行.用泛型的话可以加一个问号.因为你不知道这一个字节码是哪一个Activity的.简写是cls. /*用于保存Activity的字节码*/ public Class<?> clazz; /*用于保存Activity对应的名字*/ public String name;//name是可以对这个类class起一个名字.这个名字你可以起一个中文名. @Override public String toString() {//打印ClassAndName的时候它就会调这个方法取这个字符串去显示. // TODO Auto-generated method stub return name; } }//Alt+Shift+S生成构造方法. @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("网络错误"); //Utils.showToast(this,"网络错误");//不能用this,这里this是BroadcastReceiver Utils.showToast(DemoListActivity.this,"网络错误"); } else if (SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR .equals(action)) { //showToast("key验证失败"); //Utils.showToast(this,"key验证失败");//不能用this,这里this是BroadcastReceiver Utils.showToast(DemoListActivity.this,"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);//解除注册还是放回来. } }
<?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" --> <!-- 把 DemoListActivity配置成第一个启动类.--> <activity android:name=".DemoListActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- HelloBaiduMapActivity就简短一点. --> <activity android:name=".HelloBaiduMapActivity" /> <activity android:name=".MapLayerActivity" /> </application> </manifest>