您的位置:首页 > 其它

安卓开发_慕课网_百度地图_实现模式转换

2014-12-15 22:35 363 查看
学习内容来自“慕课网”

模式转换,即地图的普通模式,罗盘模式,跟随模式之间的转换

学习内容接自前三篇

安卓开发_慕课网_百度地图

安卓开发_慕课网_百度地图_实现定位

安卓开发_慕课网_百度地图_实现方向传感器

一、模式转换通过菜单按钮来控制

所以添加对应的菜单项(红色字体部分)

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item
android:id="@+id/id_map_common"

android:showAsAction="never"
android:title="普通地图"/>
<item
android:id="@+id/id_map_site"

android:showAsAction="never"
android:title="卫星地图"/>
<item
android:id="@+id/id_map_traffic"

android:showAsAction="never"
android:title="实时交通(off)"/>
<item
android:id="@+id/id_map_location"

android:showAsAction="never"
android:title="定位我的位置"/>
<item
android:id="@+id/id_mode_commer"

26         android:showAsAction="never"
27         android:title="普通模式"/>
28     <item
29         android:id="@+id/id_mode_following"
30
31         android:showAsAction="never"
32         android:title="跟随模式"/>
33     <item
34         android:id="@+id/id_mode_compass"
35
36         android:showAsAction="never"
37         android:title="罗盘模式"/>

</menu>


在MainActivity.java中添加模式转换的代码

package com.example.map;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.example.map.MyOrientationListener.OnOrientationListener;
import com.example.map.R;

import android.location.Location;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
import android.widget.Toast;

public class MainActivity extends Activity {

private MapView mMapView = null;
private BaiduMap mBaiduMap;
//简化代码            用于this.context=this;
private Context context;
//定位相关
private LocationClient mLocationClient;
private MyLocationListener mLocationListener;
//是否第一次定位的标志
private boolean isFirstIn = true;
//定位经纬度
private double mLatitude;
private double mLongtitude;
//自定义定位图标
private BitmapDescriptor mIconLocation;
47     private LocationMode mLocationMode;//定义模式
private MyOrientationListener myOrientationListener;
private float mCurrentX;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在使用SDK各组件之前初始化context信息,传入ApplicationContext
//注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());

requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
this.context = this;
initView();
//初始化定位
initLocation();

}

private void initView() {
// TODO Auto-generated method stub
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
//设置打开时的显示比列  这里显示500m左右
MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);
mBaiduMap.setMapStatus(msu);
}
private void initLocation() {
// TODO Auto-generated method stub
mLocationClient = new LocationClient(this);
mLocationListener = new MyLocationListener();
mLocationClient.registerLocationListener(mLocationListener);
81         //默认模式为普通型
82         mLocationMode = LocationMode.NORMAL;
LocationClientOption option = new LocationClientOption();
option.setCoorType("bd09ll");
option.setIsNeedAddress(true);
option.setOpenGps(true);
option.setScanSpan(1000);

mLocationClient.setLocOption(option);

// 初始化图标
mIconLocation = BitmapDescriptorFactory.fromResource(R.drawable.navi_map_gps_locked);
myOrientationListener = new MyOrientationListener(context);
myOrientationListener.setOnOrientationListener(new OnOrientationListener()
{
@Override
public void onOrientationChanged(float x)
{
mCurrentX = x;
}
});
}
//activity销毁时百度地图也销毁
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
// 开启定位
mBaiduMap.setMyLocationEnabled(true);
if (!mLocationClient.isStarted())
mLocationClient.start();
// 开启方向传感器
myOrientationListener.start();

}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
// 停止定位
mBaiduMap.setMyLocationEnabled(false);
mLocationClient.stop();
// 停止方向传感器
myOrientationListener.stop();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub

getMenuInflater().inflate(R.menu.main, menu);
return true;
}
//菜单按钮的响应事件
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.id_map_common:
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
break;
case R.id.id_map_site:
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
break;
case R.id.id_map_traffic:
if(mBaiduMap.isTrafficEnabled())
{
mBaiduMap.setTrafficEnabled(false);
item.setTitle("实时交通(off)");
}
else
{
mBaiduMap.setTrafficEnabled(true);
item.setTitle("实时交通(on)");
}
break;
case R.id.id_map_location:
//定位最新自己的位置
centerToMyLocation();
break;

179         case R.id.id_mode_common:
180             //设置普通模式
181             mLocationMode = LocationMode.NORMAL;
182             break;
183         case R.id.id_mode_following:
184             //设置跟随模式
185             mLocationMode = LocationMode.FOLLOWING;
186             break;
187         case R.id.id_mode_compass:
188             //设置罗盘模式
189             mLocationMode = LocationMode.COMPASS;
190             break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
//进到自己的位置
private void centerToMyLocation() {
LatLng latLng = new LatLng(mLatitude,mLongtitude);

MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
mBaiduMap.animateMapStatus(msu);
}
private class MyLocationListener implements BDLocationListener{

@Override
public void onReceiveLocation(BDLocation location) {
// TODO Auto-generated method stub
MyLocationData data = new MyLocationData.Builder()//
.direction(mCurrentX)//
.accuracy(location.getRadius())//
.latitude(location.getLatitude())//
.longitude(location.getLongitude())//
.build();
mBaiduMap.setMyLocationData(data);
// 设置自定义图标
216     MyLocationConfiguration config = new MyLocationConfiguration(mLocationMode, true, mIconLocation);
mBaiduMap.setMyLocationConfigeration(config);
//获取最新经纬度
mLatitude = location.getLatitude();
mLongtitude = location.getLongitude();
//判断是否第一次定位
if (isFirstIn)
{
//设置经纬度
LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude());

MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
mBaiduMap.animateMapStatus(msu);
//将是否第一次定位的标志 变为不是第一次定位
isFirstIn = false;
//显示当前定位的位置
Toast.makeText(context, location.getAddrStr(),
Toast.LENGTH_SHORT).show();
}

}

}
}


效果图:

罗盘模式



跟随模式:

坐标一直显示在界面中心位置

代码是学习的,发现一点Bug

点击罗盘模式后点击左上角指南针图标 无法回到普通模式

在罗盘模式后,点击普通模式,界面不直接显示为普通模式,而要再点击左上角指南针图标后才能回到普通模式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: