zoukankan      html  css  js  c++  java
  • 安卓开发_慕课网_百度地图_实现模式转换

    学习内容来自“慕课网”

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

    学习内容接自前三篇

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

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

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

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

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

     1 <menu xmlns:android="http://schemas.android.com/apk/res/android" >
     2 
     3     <item
     4         android:id="@+id/id_map_common"
     5         
     6         android:showAsAction="never"
     7         android:title="普通地图"/>
     8     <item
     9         android:id="@+id/id_map_site"
    10         
    11         android:showAsAction="never"
    12         android:title="卫星地图"/>
    13     <item
    14         android:id="@+id/id_map_traffic"
    15         
    16         android:showAsAction="never"
    17         android:title="实时交通(off)"/>
    18     <item
    19         android:id="@+id/id_map_location"
    20         
    21         android:showAsAction="never"
    22         android:title="定位我的位置"/>
    23     <item
    24         android:id="@+id/id_mode_commer"
    25         
    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="罗盘模式"/>
    38 
    39 </menu>

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

      1 package com.example.map;
      2 
      3 import com.baidu.location.BDLocation;
      4 import com.baidu.location.BDLocationListener;
      5 import com.baidu.location.LocationClient;
      6 import com.baidu.location.LocationClientOption;
      7 import com.baidu.mapapi.SDKInitializer;
      8 import com.baidu.mapapi.map.BaiduMap;
      9 import com.baidu.mapapi.map.BitmapDescriptor;
     10 import com.baidu.mapapi.map.BitmapDescriptorFactory;
     11 import com.baidu.mapapi.map.MapStatusUpdate;
     12 import com.baidu.mapapi.map.MapStatusUpdateFactory;
     13 import com.baidu.mapapi.map.MapView;
     14 import com.baidu.mapapi.map.MyLocationConfiguration;
     15 import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode;
     16 import com.baidu.mapapi.map.MyLocationData;
     17 import com.baidu.mapapi.model.LatLng;
     18 import com.example.map.MyOrientationListener.OnOrientationListener;
     19 import com.example.map.R;
     20 
     21 import android.location.Location;
     22 import android.os.Bundle;
     23 import android.app.Activity;
     24 import android.content.Context;
     25 import android.graphics.Bitmap;
     26 import android.view.Menu;
     27 import android.view.MenuItem;
     28 import android.view.Window;
     29 import android.widget.Toast;
     30 
     31 public class MainActivity extends Activity {
     32     
     33     private MapView mMapView = null;
     34     private BaiduMap mBaiduMap;
     35     //简化代码            用于this.context=this;
     36     private Context context;
     37     //定位相关
     38     private LocationClient mLocationClient;
     39     private MyLocationListener mLocationListener;
     40     //是否第一次定位的标志
     41     private boolean isFirstIn = true;
     42     //定位经纬度
     43     private double mLatitude;
     44     private double mLongtitude;
     45     //自定义定位图标
     46     private BitmapDescriptor mIconLocation;
     47     private LocationMode mLocationMode;//定义模式
     48     private MyOrientationListener myOrientationListener;
     49     private float mCurrentX;
     50     
     51     
     52     @Override
     53     protected void onCreate(Bundle savedInstanceState) {
     54         super.onCreate(savedInstanceState);
     55       //在使用SDK各组件之前初始化context信息,传入ApplicationContext  
     56         //注意该方法要再setContentView方法之前实现  
     57         SDKInitializer.initialize(getApplicationContext());  
     58         
     59         requestWindowFeature(Window.FEATURE_NO_TITLE);
     60         setContentView(R.layout.activity_main);
     61         this.context = this;
     62         initView();
     63         //初始化定位
     64         initLocation();
     65         
     66     }
     67     
     68     private void initView() {
     69         // TODO Auto-generated method stub
     70         mMapView = (MapView) findViewById(R.id.bmapView);
     71         mBaiduMap = mMapView.getMap();
     72         //设置打开时的显示比列  这里显示500m左右
     73         MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f); 
     74         mBaiduMap.setMapStatus(msu);
     75         }
     76     private void initLocation() {
     77         // TODO Auto-generated method stub
     78         mLocationClient = new LocationClient(this);
     79         mLocationListener = new MyLocationListener();
     80         mLocationClient.registerLocationListener(mLocationListener);
     81         //默认模式为普通型
     82         mLocationMode = LocationMode.NORMAL;
     83         LocationClientOption option = new LocationClientOption();
     84         option.setCoorType("bd09ll");
     85         option.setIsNeedAddress(true);
     86         option.setOpenGps(true);
     87         option.setScanSpan(1000);
     88         
     89         mLocationClient.setLocOption(option);
     90         
     91         // 初始化图标
     92         mIconLocation = BitmapDescriptorFactory.fromResource(R.drawable.navi_map_gps_locked);
     93         myOrientationListener = new MyOrientationListener(context);
     94         myOrientationListener.setOnOrientationListener(new OnOrientationListener()
     95         {
     96             @Override
     97             public void onOrientationChanged(float x)
     98             {
     99                 mCurrentX = x;
    100             }
    101         });
    102     }
    103     //activity销毁时百度地图也销毁
    104     @Override  
    105     protected void onDestroy() {   
    106         super.onDestroy();  
    107         //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理  
    108         mMapView.onDestroy();  
    109     }  
    110     @Override
    111     protected void onStart() {
    112         // TODO Auto-generated method stub
    113         super.onStart();
    114         // 开启定位
    115         mBaiduMap.setMyLocationEnabled(true);
    116         if (!mLocationClient.isStarted())
    117             mLocationClient.start();
    118         // 开启方向传感器
    119         myOrientationListener.start();
    120             
    121     }
    122     @Override
    123     protected void onStop() {
    124         // TODO Auto-generated method stub
    125         super.onStop();
    126         // 停止定位
    127         mBaiduMap.setMyLocationEnabled(false);
    128         mLocationClient.stop();
    129         // 停止方向传感器
    130         myOrientationListener.stop();
    131     }
    132     @Override  
    133     protected void onResume() {  
    134         super.onResume();  
    135         //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理  
    136         mMapView.onResume();  
    137         }  
    138     @Override  
    139     protected void onPause() {  
    140         super.onPause();  
    141         //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理  
    142         mMapView.onPause();  
    143         }  
    144     @Override
    145     public boolean onCreateOptionsMenu(Menu menu) {
    146         // TODO Auto-generated method stub
    147         
    148         getMenuInflater().inflate(R.menu.main, menu);
    149         return true;
    150     }
    151     //菜单按钮的响应事件
    152     @Override
    153     public boolean onOptionsItemSelected(MenuItem item) {
    154         // TODO Auto-generated method stub
    155         switch (item.getItemId()) {
    156         case R.id.id_map_common:
    157             mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
    158             break;
    159         case R.id.id_map_site:
    160             mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
    161             break;
    162         case R.id.id_map_traffic:
    163             if(mBaiduMap.isTrafficEnabled())
    164             {
    165                 mBaiduMap.setTrafficEnabled(false);
    166                 item.setTitle("实时交通(off)");
    167             }
    168             else
    169             {
    170                 mBaiduMap.setTrafficEnabled(true);
    171                 item.setTitle("实时交通(on)");
    172             }
    173             break;
    174         case R.id.id_map_location:
    175             //定位最新自己的位置
    176             centerToMyLocation();
    177             break;
    178 
    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;
    191         default:
    192             break;
    193         }
    194         return super.onOptionsItemSelected(item);
    195     }
    196     //进到自己的位置
    197     private void centerToMyLocation() {
    198         LatLng latLng = new LatLng(mLatitude,mLongtitude);
    199         
    200         MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
    201         mBaiduMap.animateMapStatus(msu);
    202     }
    203     private class MyLocationListener implements BDLocationListener{
    204 
    205         @Override
    206         public void onReceiveLocation(BDLocation location) {
    207             // TODO Auto-generated method stub
    208             MyLocationData data = new MyLocationData.Builder()//
    209             .direction(mCurrentX)//
    210             .accuracy(location.getRadius())//
    211             .latitude(location.getLatitude())//
    212             .longitude(location.getLongitude())//
    213             .build();
    214     mBaiduMap.setMyLocationData(data);
    215     // 设置自定义图标
    216     MyLocationConfiguration config = new MyLocationConfiguration(mLocationMode, true, mIconLocation);
    217     mBaiduMap.setMyLocationConfigeration(config);
    218     //获取最新经纬度
    219     mLatitude = location.getLatitude();
    220     mLongtitude = location.getLongitude();
    221     //判断是否第一次定位
    222     if (isFirstIn)
    223     {
    224         //设置经纬度
    225         LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude());
    226         
    227         MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
    228         mBaiduMap.animateMapStatus(msu);
    229         //将是否第一次定位的标志 变为不是第一次定位
    230         isFirstIn = false;
    231         //显示当前定位的位置
    232         Toast.makeText(context, location.getAddrStr(),
    233                 Toast.LENGTH_SHORT).show();
    234     }
    235 
    236         }
    237         
    238     }
    239 }

    效果图:

    罗盘模式

    跟随模式:

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

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

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

    在罗盘模式后,点击普通模式,界面不直接显示为普通模式,而要再点击左上角指南针图标后才能回到普通模式

  • 相关阅读:
    ContentResolver.query()—>buildQueryString()
    maven基础依赖外部lib包(依赖钉钉sdk为例)
    在 Windows 中配置Maven
    windows系统下设置mtu值的方法
    dotfuscator 在混淆.Net Framework 4.0以上版本的时候报错的解决方法2
    dotfuscator 在混淆.Net Framework 4.0以上版本的时候报错的解决方法
    C# 反编译防范
    SpringBoot 集成Shiro
    windows系统下同时安装mysql5.5和8.0.11
    Eclipse安装STS(Spring Tool Suite (STS) for Eclipse)插件
  • 原文地址:https://www.cnblogs.com/xqxacm/p/4339866.html
Copyright © 2011-2022 走看看