zoukankan      html  css  js  c++  java
  • Android学习之高德地图的通用功能开发步骤(二)

    周一又来了,我就接着上次的开发步骤(一)来吧,继续把高德地图的相关简单功能分享一下

    上次写到了第六步,接着写第七步吧。

    第七步:定位 + 地图选点 + 路径规划 + 实时导航

    以下是我的这个功能NaviMapActivity的页面布局文件:

      1 <?xml version="1.0" encoding="utf-8"?>
      2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      3     android:layout_width="match_parent"
      4     android:layout_height="match_parent" >
      5     
      6     
      7     
      8     <LinearLayout
      9         android:id="@+id/navibarcontainer"
     10         android:layout_width="match_parent"
     11         android:layout_height="wrap_content"
     12         android:orientation="vertical" >
     13 
     14 
     15         <LinearLayout
     16             android:layout_width="match_parent"
     17             android:layout_height="wrap_content"
     18             android:orientation="vertical" >
     19 
     20             <RelativeLayout
     21                 android:layout_width="match_parent"
     22                 android:layout_height="wrap_content" >
     23 
     24                 <TextView
     25                     android:id="@+id/navistarttext"
     26                     android:layout_width="wrap_content"
     27                     android:layout_height="wrap_content"
     28                     android:layout_marginLeft="@dimen/navibar_margin_left"
     29                     android:layout_marginRight="@dimen/margin_right"
     30                     android:paddingBottom="@dimen/margin_bottom"
     31                     android:paddingTop="@dimen/margin_top"
     32                     android:text="@string/navi_start"
     33                     android:textColor="@color/black"
     34                     android:textSize="@dimen/navibar_text_size" />
     35                 
     36                 <AutoCompleteTextView
     37                     android:id="@+id/navi_start_edit"
     38                     android:layout_width="wrap_content"
     39                     android:layout_height="@dimen/navibar_edit_height"
     40                     android:layout_alignParentRight="true"
     41                     android:layout_marginRight="@dimen/navibar_margin_right"
     42                     android:layout_toRightOf="@id/navistarttext"
     43                     android:focusable="false"
     44                     android:hint="@string/mypoistion"
     45                     android:paddingBottom="@dimen/margin_bottom"
     46                     android:paddingTop="@dimen/margin_top"
     47                     android:textSize="@dimen/navibar_text_size" >
     48                 </AutoCompleteTextView>
     49 
     50                 <ImageView
     51                     android:id="@+id/navi_start_image"
     52                     android:layout_width="wrap_content"
     53                     android:layout_height="@dimen/navibar_edit_height"
     54                     android:layout_alignBottom="@id/navi_start_edit"
     55                     android:layout_alignRight="@id/navi_start_edit"
     56                     android:layout_alignTop="@id/navi_start_edit"
     57                     android:layout_marginLeft="0dp"
     58                     android:layout_marginRight="@dimen/margin_right"
     59                     android:src="@drawable/downarrow" />
     60             </RelativeLayout>
     61 
     62             <RelativeLayout
     63                 android:layout_width="match_parent"
     64                 android:layout_height="wrap_content"
     65                 android:orientation="horizontal" >
     66 
     67                 <TextView
     68                     android:id="@+id/naviendtext"
     69                     android:layout_width="wrap_content"
     70                     android:layout_height="wrap_content"
     71                     android:layout_marginLeft="@dimen/navibar_margin_left"
     72                     android:layout_marginRight="@dimen/margin_right"
     73                     android:text="@string/navi_end"
     74                     android:textColor="@color/black"
     75                     android:textSize="@dimen/navibar_text_size" />
     76 
     77                 <EditText
     78                     android:id="@+id/navi_end_edit"
     79                     android:layout_width="wrap_content"
     80                     android:layout_height="@dimen/navibar_edit_height"
     81                     android:layout_alignParentRight="true"
     82                     android:layout_marginRight="@dimen/navibar_margin_right"
     83                     android:layout_toRightOf="@id/naviendtext"
     84                     android:focusable="false"
     85                     android:paddingBottom="@dimen/margin_bottom"
     86                     android:paddingTop="@dimen/margin_top"
     87                     android:textSize="@dimen/navibar_text_size" >
     88                 </EditText>
     89 
     90                 <ImageView
     91                     android:id="@+id/navi_end_image"
     92                     android:layout_width="wrap_content"
     93                     android:layout_height="@dimen/navibar_edit_height"
     94                     android:layout_alignBottom="@id/navi_end_edit"
     95                     android:layout_alignRight="@id/navi_end_edit"
     96                     android:layout_alignTop="@id/navi_end_edit"
     97                     android:layout_marginRight="@dimen/margin_right"
     98                     android:src="@drawable/downarrow" />
     99             </RelativeLayout>
    100 
    101             <RelativeLayout
    102                 android:layout_width="match_parent"
    103                 android:layout_height="wrap_content" >
    104 
    105                 <LinearLayout
    106                     android:layout_width="match_parent"
    107                     android:layout_height="wrap_content"
    108                     android:gravity="center_horizontal"
    109                     android:orientation="horizontal" >
    110 
    111                     <Button
    112                         android:id="@+id/navi_route_button"
    113                         android:layout_width="wrap_content"
    114                         android:layout_height="@dimen/navibar_button_height"
    115                         android:layout_marginRight="@dimen/navibar_margin_right"
    116                         android:paddingBottom="@dimen/margin_bottom"
    117                         android:paddingTop="@dimen/margin_top"
    118                         android:text="@string/navi_route" />
    119 
    120                     <Button
    121                         android:id="@+id/navi_navi_button"
    122                         android:layout_width="wrap_content"
    123                         android:layout_height="@dimen/navibar_button_height"
    124                         android:layout_marginLeft="@dimen/navibar_margin_left"
    125                         android:paddingBottom="@dimen/margin_bottom"
    126                         android:paddingTop="@dimen/margin_top"
    127                         android:text="@string/navi_navi" />
    128                 </LinearLayout>
    129             </RelativeLayout>
    130         </LinearLayout>
    131     </LinearLayout>
    132     <!-- 引入布局文件 -->
    133     <com.amap.api.maps.MapView
    134         android:id="@+id/map"
    135         android:layout_width="match_parent"
    136         android:layout_height="wrap_content"
    137         android:layout_alignParentBottom="true"
    138         android:layout_below="@id/navibarcontainer" />
    139 </RelativeLayout>
    View Code

    然后就是实现这个功能的代码:

      1 package com.oysd.activity;
      2 
      3 import java.util.ArrayList;
      4 import java.util.List;
      5 
      6 import android.app.Activity;
      7 import android.app.ProgressDialog;
      8 import android.content.Intent;
      9 import android.content.res.Resources;
     10 import android.graphics.BitmapFactory;
     11 import android.location.Location;
     12 import android.media.AudioManager;
     13 import android.os.Bundle;
     14 import android.text.InputType;
     15 import android.view.View;
     16 import android.view.View.OnClickListener;
     17 import android.widget.AdapterView;
     18 import android.widget.ArrayAdapter;
     19 import android.widget.AutoCompleteTextView;
     20 import android.widget.Button;
     21 import android.widget.EditText;
     22 import android.widget.ImageView;
     23 import android.widget.TextView;
     24 import android.widget.Toast;
     25 import android.widget.AdapterView.OnItemClickListener;
     26 
     27 import com.amap.api.location.AMapLocation;
     28 import com.amap.api.location.AMapLocationListener;
     29 import com.amap.api.location.LocationManagerProxy;
     30 import com.amap.api.location.LocationProviderProxy;
     31 import com.amap.api.maps.AMap;
     32 import com.amap.api.maps.MapView;
     33 import com.amap.api.maps.AMap.OnMapClickListener;
     34 import com.amap.api.maps.model.BitmapDescriptorFactory;
     35 import com.amap.api.maps.model.LatLng;
     36 import com.amap.api.maps.model.Marker;
     37 import com.amap.api.maps.model.MarkerOptions;
     38 import com.amap.api.navi.AMapNavi;
     39 import com.amap.api.navi.AMapNaviListener;
     40 import com.amap.api.navi.AMapNaviViewListener;
     41 import com.amap.api.navi.model.AMapNaviInfo;
     42 import com.amap.api.navi.model.AMapNaviLocation;
     43 import com.amap.api.navi.model.NaviInfo;
     44 import com.amap.api.navi.model.NaviLatLng;
     45 import com.oysd.Util.TTSController;
     46 import com.oysd.ouyangmap.R;
     47 import com.oysd.ouyangmap.R.drawable;
     48 import com.oysd.ouyangmap.R.id;
     49 import com.oysd.ouyangmap.R.layout;
     50 import com.oysd.ouyangmap.R.string;
     51 
     52 public class NaviMapActivity extends Activity implements AMapNaviViewListener, OnClickListener, OnMapClickListener {
     53     
     54     // --------------View基本控件---------------------
     55     private MapView mMapView;// 地图控件
     56     private AutoCompleteTextView mStartPointText;// 起点输入
     57     private EditText mEndPointText;// 终点输入
     58     private Button mRouteButton;// 路径规划按钮
     59     private Button mNaviButton;// 模拟导航按钮
     60     private ProgressDialog mProgressDialog;// 路径规划过程显示状态
     61     private ProgressDialog mGPSProgressDialog;// GPS过程显示状态
     62     private ImageView mStartImage;// 起点下拉按钮
     63     private ImageView mEndImage;// 终点点击按钮
     64     
     65     // 地图和导航核心逻辑类
     66     private AMap mAmap;
     67     private AMapNavi mAmapNavi;
     68     
     69     // ---------------------变量---------------------
     70     private String[] mPositionMethods;// 记录起点我的位置、地图点选数组
     71     
     72     // 驾车路径规划起点,途经点,终点的list
     73     private List<NaviLatLng> mStartPoints = new ArrayList<NaviLatLng>();
     74     private List<NaviLatLng> mWayPoints = new ArrayList<NaviLatLng>();
     75     private List<NaviLatLng> mEndPoints = new ArrayList<NaviLatLng>();
     76     
     77     // 记录起点、终点、途经点位置
     78     private NaviLatLng mStartPoint = new NaviLatLng();
     79     private NaviLatLng mEndPoint = new NaviLatLng();
     80     private NaviLatLng mWayPoint = new NaviLatLng();
     81     
     82     
     83     // 记录起点、终点、途经点在地图上添加的Marker
     84     private Marker mStartMarker;
     85     private Marker mWayMarker;
     86     private Marker mEndMarker;
     87     private Marker mGPSMarker;
     88     
     89     private boolean mIsGetGPS = false;// 记录GPS定位是否成功
     90     private boolean mIsStart = false;// 记录是否已我的位置发起路径规划
     91     
     92     private ArrayAdapter<String> mPositionAdapter;
     93 
     94     private AMapNaviListener mAmapNaviListener;
     95     
     96     // 记录地图点击事件相应情况,根据选择不同,地图响应不同
     97     private int mMapClickMode = MAP_CLICK_NO;
     98     private static final int MAP_CLICK_NO = 0;// 地图不接受点击事件
     99     private static final int MAP_CLICK_START = 1;// 地图点击设置起点
    100     private static final int MAP_CLICK_WAY = 2;// 地图点击设置途经点
    101     private static final int MAP_CLICK_END = 3;// 地图点击设置终点
    102     // 记录导航种类,用于记录当前选择是驾车还是步行
    103     private int mTravelMethod = WALK_NAVI_METHOD;
    104     private static final int WALK_NAVI_METHOD = 1;// 步行导航
    105     
    106     
    107     private int mNaviMethod;
    108     private static final int NAVI_METHOD = 0;// 执行模拟导航操作
    109     private static final int ROUTE_METHOD = 1;// 执行计算线路操作
    110 
    111     private int mStartPointMethod = BY_MY_POSITION;
    112     private static final int BY_MY_POSITION = 0;// 以我的位置作为起点
    113     private static final int BY_MAP_POSITION = 1;// 以地图点选的点为起点
    114     // 计算路的状态
    115     private final static int GPSNO = 0;// 使用我的位置进行计算、GPS定位还未成功状态
    116     private final static int CALCULATEERROR = 1;// 启动路径计算失败状态
    117     private final static int CALCULATESUCCESS = 2;// 启动路径计算成功状态
    118     
    119     //定位
    120     private LocationManagerProxy mLocationManger;
    121     
    122     
    123 private AMapLocationListener mLocationListener=new AMapLocationListener() {
    124         
    125         @Override
    126         public void onStatusChanged(String provider, int status, Bundle extras) {
    127             // TODO Auto-generated method stub
    128             
    129         }
    130         
    131         @Override
    132         public void onProviderEnabled(String provider) {
    133             // TODO Auto-generated method stub
    134             
    135         }
    136         
    137         @Override
    138         public void onProviderDisabled(String provider) {
    139             // TODO Auto-generated method stub
    140             
    141         }
    142         
    143         @Override
    144         public void onLocationChanged(Location location) {
    145             // TODO Auto-generated method stub
    146             
    147         }
    148         
    149         @Override
    150         public void onLocationChanged(AMapLocation location) {
    151             if (location!=null&&location.getAMapException().getErrorCode() == 0) {
    152             mIsGetGPS = true;
    153             mStartPoint =new NaviLatLng(location.getLatitude(), location.getLongitude());
    154                     
    155                     
    156             mGPSMarker.setPosition(new LatLng(
    157                     mStartPoint.getLatitude(), mStartPoint
    158                             .getLongitude()));
    159             mStartPoints.clear();
    160             mStartPoints.add(mStartPoint);
    161             
    162             dissmissGPSProgressDialog();
    163              
    164              calculateRoute();
    165             
    166          
    167             
    168             }
    169             else{
    170                 showToast("定位出现异常");
    171             }
    172         }
    173     };
    174     
    175     @Override
    176     protected void onCreate(Bundle savedInstanceState) {
    177         // TODO Auto-generated method stub
    178         super.onCreate(savedInstanceState);
    179         setContentView(R.layout.activity_navimap);
    180         // 初始化所需资源、控件、事件监听
    181         initResources();
    182         initView(savedInstanceState);
    183         initListener();
    184         initMapAndNavi();
    185         //MainApplication.getInstance().addActivity(this);
    186     }
    187     
    188     
    189     /**
    190      * 初始化地图和导航相关内容
    191      */
    192     private void initMapAndNavi() {
    193         // 初始语音播报资源
    194         setVolumeControlStream(AudioManager.STREAM_MUSIC);// 设置声音控制
    195         //语音播报开始
    196     
    197         mAmapNavi = AMapNavi.getInstance(this);// 初始化导航引擎
    198         
    199         // 初始化Marker添加到地图
    200         mStartMarker = mAmap.addMarker(new MarkerOptions()
    201                 .icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory
    202                         .decodeResource(getResources(), R.drawable.start))));
    203         mWayMarker = mAmap.addMarker(new MarkerOptions()
    204                 .icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory
    205                         .decodeResource(getResources(), R.drawable.way))));
    206         mEndMarker = mAmap.addMarker(new MarkerOptions()
    207                 .icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory
    208                         .decodeResource(getResources(), R.drawable.end))));
    209         mGPSMarker = mAmap.addMarker(new MarkerOptions()
    210                 .icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory
    211                         .decodeResource(getResources(),
    212                                 R.drawable.location_marker))));
    213     }
    214     /**
    215      * 初始化资源文件,主要是字符串
    216      */
    217     private void initResources() {
    218         Resources res = getResources();
    219         mPositionMethods = new String[] { res.getString(R.string.mypoistion),
    220                 res.getString(R.string.mappoistion) };
    221 
    222     }
    223     
    224     /**
    225      * 初始化界面所需View控件
    226      * 
    227      * @param savedInstanceState
    228      */
    229     private void initView(Bundle savedInstanceState) {
    230         mMapView = (MapView) findViewById(R.id.map);
    231         mMapView.onCreate(savedInstanceState);
    232         mAmap=mMapView.getMap();
    233         mStartPointText = (AutoCompleteTextView) findViewById(R.id.navi_start_edit);
    234          
    235         mStartPointText
    236                 .setDropDownBackgroundResource(R.drawable.whitedownborder);
    237         mEndPointText = (EditText) findViewById(R.id.navi_end_edit);
    238         mStartPointText.setInputType(InputType.TYPE_NULL);
    239         mEndPointText.setInputType(InputType.TYPE_NULL);
    240 
    241         mPositionAdapter = new ArrayAdapter<String>(this,
    242                 R.layout.strategy_inputs, mPositionMethods);
    243         
    244         mStartPointText.setAdapter(mPositionAdapter);
    245 
    246         mRouteButton = (Button) findViewById(R.id.navi_route_button);
    247         mNaviButton = (Button) findViewById(R.id.navi_navi_button);
    248         mStartImage = (ImageView) findViewById(R.id.navi_start_image);
    249         mEndImage = (ImageView) findViewById(R.id.navi_end_image);
    250         
    251         TTSController ttsManager = TTSController.getInstance(this);// 初始化语音模块
    252         ttsManager.init();
    253         AMapNavi.getInstance(this).setAMapNaviListener(ttsManager);// 设置语音模块播报
    254     }
    255     
    256     /**
    257      * 初始化所需监听
    258      */
    259     private void initListener() {
    260         // 控件点击事件
    261         mStartPointText.setOnClickListener(this);
    262         mEndPointText.setOnClickListener(this);
    263         mRouteButton.setOnClickListener(this);
    264         mNaviButton.setOnClickListener(this);
    265         mStartImage.setOnClickListener(this);
    266         mEndImage.setOnClickListener(this);
    267         // 设置地图点击事件
    268         mAmap.setOnMapClickListener(this);
    269         // 起点下拉框点击事件监听
    270         mStartPointText.setOnItemClickListener(getOnItemClickListener());
    271     }
    272 
    273     /**
    274      * 起点下拉框点击事件监听
    275      * */
    276     private OnItemClickListener getOnItemClickListener() {
    277         return new OnItemClickListener() {
    278             @Override
    279             public void onItemClick(AdapterView<?> arg0, View arg1, int index,
    280                     long arg3) {
    281                 switch (index) {
    282                 // 我的位置为起点进行导航或路径规划
    283                 case 0:
    284                     mStartPointMethod = BY_MY_POSITION;
    285                     break;
    286                 // 地图点选起点进行导航或路径规划
    287                 case 1:
    288                     mStartPointMethod = BY_MAP_POSITION;
    289                     mMapClickMode = MAP_CLICK_START;
    290                     showToast("点击地图添加起点");
    291                     break;
    292                 }
    293 
    294             }
    295 
    296         };
    297     }
    298     
    299     // ---------------UI操作----------------
    300     private void showToast(String message) {
    301         Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
    302     }
    303     
    304     private void setTextDescription(TextView view, String description) {
    305         view.setText(description);
    306     }
    307     
    308     
    309     /**
    310      * 地图点击事件监听
    311      * */
    312     @Override
    313     public void onMapClick(LatLng latLng) {
    314         // 默认不接受任何操作
    315         if (mMapClickMode == MAP_CLICK_NO) {
    316             return;
    317         }
    318         // 其他情况根据起点、途经点、终点不同逻辑处理不同
    319         addPointToMap(latLng);
    320 
    321     }
    322     
    323     /**
    324      * 地图点击事件核心处理逻辑
    325      * @param position
    326      */
    327     private void addPointToMap(LatLng position) {
    328         NaviLatLng naviLatLng = new NaviLatLng(position.latitude,
    329                 position.longitude);
    330         switch (mMapClickMode) {
    331         //起点
    332         case MAP_CLICK_START:
    333             mStartMarker.setPosition(position);
    334             mStartPoint = naviLatLng;
    335             mStartPoints.clear();
    336             mStartPoints.add(mStartPoint);
    337             setTextDescription(mStartPointText, "已成功设置起点");
    338             break;
    339         //终点
    340         case MAP_CLICK_END:
    341             mEndMarker.setPosition(position);
    342             mEndPoints.clear();
    343             mEndPoint = naviLatLng;
    344             mEndPoints.add(mEndPoint);
    345             setTextDescription(mEndPointText, "已成功设置终点");
    346             break;
    347         }
    348 
    349     }
    350 
    351     @Override
    352     public void onClick(View v) {
    353         // TODO Auto-generated method stub
    354         switch (v.getId()) {
    355         // 路径规划按钮处理事件
    356         case R.id.navi_route_button:
    357             mNaviMethod = ROUTE_METHOD;
    358             calculateRoute();
    359             break;
    360         // 模拟导航处理事件
    361         case R.id.navi_navi_button:
    362             mNaviMethod = NAVI_METHOD;
    363             calculateRoute();
    364             break;
    365         // 起点点击事件
    366         case R.id.navi_start_image:
    367         case R.id.navi_start_edit:
    368             setTextDescription(mStartPointText, null);
    369             mPositionAdapter = new ArrayAdapter<String>(this,
    370                     R.layout.strategy_inputs, mPositionMethods);
    371             mStartPointText.setAdapter(mPositionAdapter);
    372             mStartPoints.clear();
    373             mStartMarker.setPosition(null);
    374             mStartPointText.showDropDown();
    375             break;
    376         // 终点点击事件
    377         case R.id.navi_end_image:
    378         case R.id.navi_end_edit:
    379             mMapClickMode = MAP_CLICK_END;
    380             mEndPoints.clear();
    381             mEndMarker.setPosition(null);
    382             setTextDescription(mEndPointText, "点击地图设置终点");
    383             showToast("点击地图添加终点");
    384             break;
    385         }
    386     }
    387 
    388     @Override
    389     public void onLockMap(boolean arg0) {
    390         // TODO Auto-generated method stub
    391         
    392     }
    393 
    394     @Override
    395     public void onNaviCancel() {
    396         // TODO Auto-generated method stub
    397         
    398     }
    399 
    400     @Override
    401     public void onNaviMapMode(int arg0) {
    402         // TODO Auto-generated method stub
    403         
    404     }
    405 
    406     @Override
    407     public void onNaviSetting() {
    408         // TODO Auto-generated method stub
    409         
    410     }
    411 
    412     @Override
    413     public void onNaviTurnClick() {
    414         // TODO Auto-generated method stub
    415         
    416     }
    417 
    418     @Override
    419     public void onNextRoadClick() {
    420         // TODO Auto-generated method stub
    421         
    422     }
    423 
    424     @Override
    425     public void onScanViewButtonClick() {
    426         // TODO Auto-generated method stub
    427         
    428     }
    429     
    430     /**
    431      * 算路的方法,根据选择可以进行行车和步行两种方式进行路径规划
    432      */
    433     private void calculateRoute() {
    434         if(mStartPointMethod==BY_MY_POSITION&&!mIsGetGPS){
    435             mLocationManger=LocationManagerProxy.getInstance(this);
    436             //进行一次定位
    437             mLocationManger.requestLocationData(LocationProviderProxy.AMapNetwork, -1, 15, mLocationListener);
    438             showGPSProgressDialog();
    439             
    440              
    441             return;
    442         
    443         }
    444         mIsGetGPS=false;
    445         switch (mTravelMethod) {
    446         // 步行导航
    447         case WALK_NAVI_METHOD:
    448             int walkIndex = calculateWalkRoute();
    449             if (walkIndex == CALCULATEERROR) {
    450                 showToast("路线计算失败,检查参数情况");
    451                 return;
    452             } else if (walkIndex == GPSNO) {
    453                 return;
    454             }
    455             break;
    456         }
    457         // 显示路径规划的窗体
    458         showProgressDialog();
    459     }
    460     
    461     
    462 
    463     /**
    464      * 导航回调函数
    465      * 
    466      * @return
    467      */
    468     private AMapNaviListener getAMapNaviListener() {
    469         if (mAmapNaviListener == null) {
    470 
    471             mAmapNaviListener = new AMapNaviListener() {
    472           
    473                 @Override
    474                 public void onTrafficStatusUpdate() {
    475                     // TODO Auto-generated method stub
    476 
    477                 }
    478 
    479                 @Override
    480                 public void onStartNavi(int arg0) {
    481                     // TODO Auto-generated method stub
    482 
    483                 }
    484 
    485                 @Override
    486                 public void onReCalculateRouteForYaw() {
    487                     // TODO Auto-generated method stub
    488 
    489                 }
    490 
    491                 @Override
    492                 public void onReCalculateRouteForTrafficJam() {
    493                     // TODO Auto-generated method stub
    494 
    495                 }
    496 
    497                 @Override
    498                 public void onLocationChange(AMapNaviLocation location) {
    499                      
    500                     
    501                 }
    502 
    503                 @Override
    504                 public void onInitNaviSuccess() {
    505                     // TODO Auto-generated method stub
    506 
    507                 }
    508 
    509                 @Override
    510                 public void onInitNaviFailure() {
    511                     // TODO Auto-generated method stub
    512 
    513                 }
    514 
    515                 @Override
    516                 public void onGetNavigationText(int arg0, String arg1) {
    517                     // TODO Auto-generated method stub
    518 
    519                 }
    520 
    521                 @Override
    522                 public void onEndEmulatorNavi() {
    523                     // TODO Auto-generated method stub
    524 
    525                 }
    526 
    527                 @Override
    528                 public void onCalculateRouteSuccess() {
    529                     dissmissProgressDialog();
    530                     switch (mNaviMethod) {
    531                     //路径规划
    532                     case ROUTE_METHOD:
    533                         Intent intent = new Intent(NaviMapActivity.this,
    534                                 NaviRouteActivity.class);
    535                         intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    536                         startActivity(intent);
    537 
    538                         break;
    539                     //模拟导航
    540                     case NAVI_METHOD:
    541                         Intent standIntent = new Intent(NaviMapActivity.this,
    542                                 NaviCustomActivity.class);
    543                         standIntent
    544                                 .addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    545                         startActivity(standIntent);
    546                         break;
    547                     }
    548                 }
    549 
    550                 @Override
    551                 public void onCalculateRouteFailure(int arg0) {
    552                     dissmissProgressDialog();
    553                     showToast("路径规划出错");
    554                 }
    555 
    556                 @Override
    557                 public void onArrivedWayPoint(int arg0) {
    558                     // TODO Auto-generated method stub
    559 
    560                 }
    561 
    562                 @Override
    563                 public void onArriveDestination() {
    564                     // TODO Auto-generated method stub
    565 
    566                 }
    567 
    568                 @Override
    569                 public void onGpsOpenStatus(boolean arg0) {
    570                     // TODO Auto-generated method stub
    571 
    572                 }
    573 
    574                 @Override
    575                 public void onNaviInfoUpdated(AMapNaviInfo arg0) {
    576                     // TODO Auto-generated method stub
    577                     
    578                 }
    579 
    580                 @Override
    581                 public void onNaviInfoUpdate(NaviInfo arg0) {
    582                       
    583                     // TODO Auto-generated method stub  
    584                     
    585                 }
    586             };
    587         }
    588         return mAmapNaviListener;
    589     }
    590     
    591     
    592     /**
    593      * 显示GPS进度框
    594      */
    595     private void showGPSProgressDialog() {
    596         if (mGPSProgressDialog == null)
    597             mGPSProgressDialog = new ProgressDialog(this);
    598         mGPSProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    599         mGPSProgressDialog.setIndeterminate(false);
    600         mGPSProgressDialog.setCancelable(true);
    601         mGPSProgressDialog.setMessage("定位中...");
    602         mGPSProgressDialog.show();
    603     }
    604     
    605     /**
    606      * 隐藏进度框
    607      */
    608     private void dissmissGPSProgressDialog() {
    609         if (mGPSProgressDialog != null) {
    610             mGPSProgressDialog.dismiss();
    611         }
    612     }
    613     
    614     /**
    615      * 显示进度框
    616      */
    617     private void showProgressDialog() {
    618         if (mProgressDialog == null)
    619             mProgressDialog = new ProgressDialog(this);
    620         mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    621         mProgressDialog.setIndeterminate(false);
    622         mProgressDialog.setCancelable(true);
    623         mProgressDialog.setMessage("线路规划中");
    624         mProgressDialog.show();
    625     }
    626     
    627     /**
    628      * 对步行路线进行规划
    629      */
    630     private int calculateWalkRoute() {
    631         int code = CALCULATEERROR;
    632         if (mAmapNavi.calculateWalkRoute(mStartPoint, mEndPoint)) {
    633             code = CALCULATESUCCESS;
    634         } else {
    635              
    636             code = CALCULATEERROR;
    637         }
    638 
    639         return code;
    640     }
    641     
    642     /**
    643      * 隐藏进度框
    644      */
    645     private void dissmissProgressDialog() {
    646         if (mProgressDialog != null) {
    647             mProgressDialog.dismiss();
    648         }
    649     }
    650 
    651     // -------------生命周期必须重写方法----------------
    652     @Override
    653     protected void onSaveInstanceState(Bundle outState) {
    654         super.onSaveInstanceState(outState);
    655         mMapView.onSaveInstanceState(outState);
    656     }
    657     @Override
    658     public void onResume() {
    659         super.onResume();
    660         mMapView.onResume();
    661         // 以上两句必须重写
    662         // 以下两句逻辑是为了保证进入首页开启定位和加入导航回调
    663         AMapNavi.getInstance(this).setAMapNaviListener(getAMapNaviListener());
    664         mAmapNavi.startGPS();
    665         TTSController.getInstance(this).startSpeaking();
    666     }
    667 
    668     @Override
    669     public void onPause() {
    670         super.onPause();
    671         mMapView.onPause();
    672         // 以上两句必须重写
    673         // 下边逻辑是移除监听
    674         AMapNavi.getInstance(this)
    675                 .removeAMapNaviListener(getAMapNaviListener());
    676     }
    677 
    678     @Override
    679     public void onDestroy() {
    680         super.onDestroy();
    681         mMapView.onDestroy();
    682          
    683         
    684 
    685     }
    686 }
    View Code

    当用户选择路径规划的时候,会跳转到NaviRouteActivity,以下是其布局文件:

      1 <?xml version="1.0" encoding="utf-8"?>
      2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      3     android:layout_width="match_parent"
      4     android:layout_height="match_parent"
      5     android:background="@color/grey"
      6     android:orientation="vertical" >
      7 
      8     <LinearLayout
      9         android:layout_width="match_parent"
     10         android:layout_height="wrap_content"
     11         android:background="@drawable/border" >
     12 
     13         <ImageView
     14             android:id="@+id/route_back_view"
     15             android:layout_width="wrap_content"
     16             android:layout_height="wrap_content"
     17             android:layout_marginBottom="@dimen/margin_bottom"
     18             android:layout_marginTop="@dimen/margin_top"
     19             android:src="@drawable/back_top" />
     20 
     21         <TextView
     22             android:layout_width="wrap_content"
     23             android:layout_height="wrap_content"
     24             android:layout_marginBottom="@dimen/margin_bottom"
     25             android:layout_marginTop="@dimen/margin_top"
     26             android:layout_weight="1"
     27             android:gravity="center_horizontal"
     28             android:text="@string/routeshow"
     29             android:textColor="@color/black"
     30             android:textSize="@dimen/titletext_size" />
     31     </LinearLayout>
     32 
     33     <LinearLayout
     34         android:layout_width="match_parent"
     35         android:layout_height="wrap_content"
     36         android:layout_weight="1"
     37         android:background="@drawable/border" >
     38 
     39         <com.amap.api.maps.MapView
     40             android:id="@+id/routemap"
     41             android:layout_width="match_parent"
     42             android:layout_height="match_parent" />
     43     </LinearLayout>
     44 
     45     <LinearLayout
     46         android:layout_width="match_parent"
     47         android:layout_height="wrap_content" >
     48 
     49         <TextView
     50             android:layout_width="wrap_content"
     51             android:layout_height="wrap_content"
     52             android:layout_gravity="center_horizontal"
     53             android:paddingBottom="@dimen/margin_bottom"
     54             android:paddingLeft="@dimen/margin_left"
     55             android:paddingTop="@dimen/margin_top"
     56             android:text="@string/routeinfo_1"
     57             android:textColor="@color/black"
     58             android:textSize="@dimen/route_text_size" />
     59 
     60         <TextView
     61             android:id="@+id/navi_route_distance"
     62             android:layout_width="wrap_content"
     63             android:layout_height="wrap_content"
     64             android:layout_gravity="center_horizontal"
     65             android:paddingBottom="@dimen/margin_bottom"
     66             android:paddingLeft="@dimen/margin_left"
     67             android:paddingTop="@dimen/margin_top"
     68             android:text="@string/routeinfo_default"
     69             android:textColor="@color/red"
     70             android:textSize="@dimen/route_text_size" />
     71 
     72         <TextView
     73             android:layout_width="wrap_content"
     74             android:layout_height="wrap_content"
     75             android:layout_gravity="center_horizontal"
     76             android:paddingBottom="@dimen/margin_bottom"
     77             android:paddingTop="@dimen/margin_top"
     78             android:text="@string/routeinfo_2"
     79             android:textColor="@color/black"
     80             android:textSize="@dimen/route_text_size" />
     81 
     82         <TextView
     83             android:id="@+id/navi_route_time"
     84             android:layout_width="wrap_content"
     85             android:layout_height="wrap_content"
     86             android:layout_gravity="center_horizontal"
     87             android:paddingBottom="@dimen/margin_bottom"
     88             android:paddingLeft="@dimen/margin_left"
     89             android:paddingTop="@dimen/margin_top"
     90             android:text="@string/routeinfo_default"
     91             android:textColor="@color/red"
     92             android:textSize="@dimen/route_text_size" />
     93 
     94         <TextView
     95             android:id="@+id/navi_route_cost_before"
     96             android:layout_width="wrap_content"
     97             android:layout_height="wrap_content"
     98             android:layout_gravity="center_horizontal"
     99             android:paddingBottom="@dimen/margin_bottom"
    100             android:paddingTop="@dimen/margin_top"
    101             android:text="@string/routeinfo_3"
    102             android:textColor="@color/black"
    103             android:textSize="@dimen/route_text_size" />
    104 
    105         <TextView
    106             android:id="@+id/navi_route_cost"
    107             android:layout_width="wrap_content"
    108             android:layout_height="wrap_content"
    109             android:layout_gravity="center_horizontal"
    110             android:paddingBottom="@dimen/margin_bottom"
    111             android:paddingLeft="@dimen/margin_left"
    112             android:paddingTop="@dimen/margin_top"
    113             android:text="@string/routeinfo_default"
    114             android:textColor="@color/red"
    115             android:singleLine="true"
    116             android:textSize="@dimen/route_text_size" />
    117 
    118         <TextView
    119             android:id="@+id/navi_route_cost_after"
    120             android:layout_width="wrap_content"
    121             android:layout_height="wrap_content"
    122             android:layout_gravity="center_horizontal"
    123             android:paddingBottom="@dimen/margin_bottom"
    124             android:paddingTop="@dimen/margin_top"
    125             android:text="@string/routeinfo_4"
    126             android:textColor="@color/black"
    127             android:textSize="@dimen/route_text_size" />
    128     </LinearLayout>
    129 
    130     <RelativeLayout
    131         android:layout_width="match_parent"
    132         android:layout_height="wrap_content" >
    133 
    134         <Button
    135             android:id="@+id/routestartnavi"
    136             android:layout_width="wrap_content"
    137             android:layout_height="@dimen/naviroute_navi_height"
    138             android:layout_alignParentRight="true"
    139             android:text="@string/start_navi_navi" />
    140 
    141         <AutoCompleteTextView
    142             android:id="@+id/navi_theme_text"
    143             android:layout_width="wrap_content"
    144             android:layout_height="@dimen/naviroute_navi_height"
    145             android:layout_alignParentLeft="true"
    146             android:layout_toLeftOf="@id/routestartnavi"
    147             android:focusable="false"
    148             android:hint="@string/theme_blue" >
    149         </AutoCompleteTextView>
    150 
    151         <ImageView
    152             android:id="@+id/navi_theme_image"
    153             android:layout_width="wrap_content"
    154             android:layout_height="@dimen/naviroute_navi_height"
    155             android:layout_alignBottom="@+id/navi_theme_text"
    156             android:layout_alignRight="@+id/navi_theme_text"
    157             android:layout_alignTop="@id/navi_theme_text"
    158             android:layout_marginRight="@dimen/margin_right"
    159             android:src="@drawable/downarrow" />
    160     </RelativeLayout>
    161 
    162 </LinearLayout>
    View Code

    紧接着是其实现代码(主要来自高德API官网):

      1 package com.oysd.activity;
      2 
      3 import android.app.Activity;
      4 import android.content.Intent;
      5 import android.content.res.Resources;
      6 import android.os.Bundle;
      7 import android.text.InputType;
      8 import android.view.KeyEvent;
      9 import android.view.View;
     10 import android.view.View.OnClickListener;
     11 import android.widget.ArrayAdapter;
     12 import android.widget.AutoCompleteTextView;
     13 import android.widget.Button;
     14 import android.widget.ImageView;
     15 import android.widget.TextView;
     16 
     17 import com.amap.api.maps.AMap;
     18 import com.amap.api.maps.MapView;
     19 import com.amap.api.maps.AMap.OnMapLoadedListener;
     20 import com.amap.api.navi.AMapNavi;
     21 import com.amap.api.navi.AMapNaviViewOptions;
     22 import com.amap.api.navi.model.AMapNaviPath;
     23 import com.amap.api.navi.view.RouteOverLay;
     24 import com.oysd.ouyangmap.R;
     25 import com.oysd.ouyangmap.R.drawable;
     26 import com.oysd.ouyangmap.R.id;
     27 import com.oysd.ouyangmap.R.layout;
     28 import com.oysd.ouyangmap.R.string;
     29 
     30 /**
     31  * 路径规划结果展示界面
     32  */
     33 public class NaviRouteActivity extends Activity implements OnClickListener,
     34         OnMapLoadedListener {
     35 
     36     // View
     37     private Button mStartNaviButton;// 实时导航按钮
     38     private MapView mMapView;// 地图控件
     39     private AutoCompleteTextView mThemeText;// 选择导航界面的风格
     40     private ImageView mThemeImage;// 选择按钮
     41     private ImageView mRouteBackView;// 返回按钮
     42     private TextView mRouteDistanceView;// 距离显示控件
     43     private TextView mRouteTimeView;// 时间显示控件
     44     private TextView mRouteCostView;// 花费显示控件
     45     // 地图导航资源
     46     private AMap mAmap;
     47     private AMapNavi mAmapNavi;
     48     private RouteOverLay mRouteOverLay;
     49     // 主题数组
     50     private String mTheme[];
     51 
     52     private boolean mIsMapLoaded = false;
     53 
     54     protected void onCreate(Bundle savedInstanceState) {
     55         super.onCreate(savedInstanceState);
     56         setContentView(R.layout.activity_route);
     57         initResources();
     58         initView(savedInstanceState);
     59         //MainApplication.getInstance().addActivity(this);
     60     }
     61 
     62     // -----------------------初始化----------------------------------
     63 
     64     /**
     65      * 初始化资源
     66      */
     67     private void initResources() {
     68         Resources res = getResources();
     69         mTheme = new String[] { res.getString(R.string.theme_blue),
     70                 res.getString(R.string.theme_pink),
     71                 res.getString(R.string.theme_white) };
     72     }
     73 
     74     /**
     75      * 初始化控件
     76      */
     77     private void initView(Bundle savedInstanceState) {
     78         mStartNaviButton = (Button) findViewById(R.id.routestartnavi);
     79 
     80         mRouteBackView = (ImageView) findViewById(R.id.route_back_view);
     81 
     82         mThemeText = (AutoCompleteTextView) findViewById(R.id.navi_theme_text);
     83         mThemeText.setInputType(InputType.TYPE_NULL);
     84         ArrayAdapter<String> themeAdapter = new ArrayAdapter<String>(this,
     85                 R.layout.strategy_inputs, mTheme);
     86         mThemeText.setAdapter(themeAdapter);
     87 
     88         mThemeText.setDropDownBackgroundResource(R.drawable.whitedownborder);
     89 
     90         mThemeImage = (ImageView) findViewById(R.id.navi_theme_image);
     91         mRouteDistanceView = (TextView) findViewById(R.id.navi_route_distance);
     92         mRouteTimeView = (TextView) findViewById(R.id.navi_route_time);
     93         mRouteCostView = (TextView) findViewById(R.id.navi_route_cost);
     94         mMapView = (MapView) findViewById(R.id.routemap);
     95         mMapView.onCreate(savedInstanceState);
     96         mAmap = mMapView.getMap();
     97         mAmap.setOnMapLoadedListener(this);
     98         mThemeImage.setOnClickListener(this);
     99         mThemeText.setOnClickListener(this);
    100         mStartNaviButton.setOnClickListener(this);
    101         mRouteBackView.setOnClickListener(this);
    102         mRouteOverLay = new RouteOverLay(mAmap, null);
    103     }
    104 
    105     /**
    106      * 初始化路线描述信息和加载线路
    107      */
    108     private void initNavi() {
    109         
    110         mAmapNavi = AMapNavi.getInstance(this);
    111         AMapNaviPath naviPath = mAmapNavi.getNaviPath();
    112         if (naviPath == null) {
    113             return;
    114         }
    115         // 获取路径规划线路,显示到地图上
    116         mRouteOverLay.setRouteInfo(naviPath);
    117         mRouteOverLay.addToMap();
    118         if (mIsMapLoaded) {
    119             mRouteOverLay.zoomToSpan();
    120         }
    121 
    122         double length = ((int) (naviPath.getAllLength() / (double) 1000 * 10))
    123                 / (double) 10;
    124         // 不足分钟 按分钟计
    125         int time = (naviPath.getAllTime() + 59) / 60;
    126         int cost = naviPath.getTollCost();
    127         mRouteDistanceView.setText(String.valueOf(length));
    128         mRouteTimeView.setText(String.valueOf(time));
    129         mRouteCostView.setText(String.valueOf(cost));
    130     }
    131 
    132     /**
    133      * 获取导航界面主题样式
    134      * 
    135      * @param themeColor
    136      * @return
    137      */
    138     private int getThemeStyle(String themeColor) {
    139         int theme = AMapNaviViewOptions.BLUE_COLOR_TOPIC;
    140         if (mTheme[0].equals(themeColor)) {
    141             theme = AMapNaviViewOptions.BLUE_COLOR_TOPIC;
    142         } else if (mTheme[1].equals(themeColor)) {
    143             theme = AMapNaviViewOptions.PINK_COLOR_TOPIC;
    144         } else if (mTheme[2].equals(themeColor)) {
    145             theme = AMapNaviViewOptions.WHITE_COLOR_TOPIC;
    146         }
    147         return theme;
    148     }
    149 
    150     // ------------------------------事件处理-----------------------------
    151     @Override
    152     public void onClick(View v) {
    153         switch (v.getId()) {
    154         // 实时导航操作
    155         case R.id.routestartnavi:
    156             Bundle bundle = new Bundle();
    157             bundle.putInt("theme", getThemeStyle(mThemeText.getText()
    158                     .toString()));
    159             Intent routeIntent = new Intent(NaviRouteActivity.this,
    160                     NaviCustomActivity.class);
    161             routeIntent.putExtras(bundle);
    162             startActivity(routeIntent);
    163             break;
    164         // 返回操作
    165         case R.id.route_back_view:
    166             Intent startIntent = new Intent(NaviRouteActivity.this,
    167                     NaviMapActivity.class);
    168             startIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    169             startActivity(startIntent);
    170             //MainApplication.getInstance().deleteActivity(this);
    171             finish();
    172             break;
    173         // 主题选择
    174         case R.id.navi_theme_image:
    175         case R.id.navi_theme_text:
    176             mThemeText.showDropDown();
    177             break;
    178         }
    179 
    180     }
    181 
    182     /**
    183      * 
    184      * 返回键监听
    185      * */
    186     @Override
    187     public boolean onKeyDown(int keyCode, KeyEvent event) {
    188 
    189         if (keyCode == KeyEvent.KEYCODE_BACK) {
    190             Intent intent = new Intent(NaviRouteActivity.this,
    191                     NaviMapActivity.class);
    192             intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    193             startActivity(intent);
    194             //MainApplication.getInstance().deleteActivity(this);
    195             finish();
    196 
    197         }
    198         return super.onKeyDown(keyCode, event);
    199     }
    200 
    201     // ------------------------------生命周期必须重写方法---------------------------
    202     @Override
    203     protected void onSaveInstanceState(Bundle outState) {
    204         super.onSaveInstanceState(outState);
    205         mMapView.onSaveInstanceState(outState);
    206     }
    207 
    208     @Override
    209     public void onResume() {
    210         super.onResume();
    211         mMapView.onResume();
    212         initNavi();
    213     }
    214 
    215     @Override
    216     public void onPause() {
    217         super.onPause();
    218         mMapView.onPause();
    219     }
    220 
    221     @Override
    222     public void onDestroy() {
    223         super.onDestroy();
    224         mMapView.onDestroy();
    225     }
    226 
    227     @Override
    228     public void onMapLoaded() {
    229         mIsMapLoaded = true;
    230         if (mRouteOverLay != null) {
    231             mRouteOverLay.zoomToSpan();
    232 
    233         }
    234     }
    235 
    236 }
    View Code

    当用户点击模拟导航 或者 这路径规划界面点击实时导航的时候,界面跳转到NaviCustomActivity,以下是其布局文件:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:id="@+id/map_container"
     4     android:layout_width="match_parent"
     5     android:layout_height="match_parent"
     6     android:orientation="vertical" >
     7    <com.amap.api.navi.AMapNaviView
     8         android:id="@+id/customnavimap"
     9         android:layout_width="match_parent"
    10         android:layout_height="match_parent"
    11        />
    12 
    13 </LinearLayout>
    View Code

    然后是其实现代码:

      1 package com.oysd.activity;
      2 
      3 import android.app.Activity;
      4 import android.content.Intent;
      5 import android.os.Bundle;
      6 import android.view.KeyEvent;
      7 
      8 import com.amap.api.navi.AMapNavi;
      9 import com.amap.api.navi.AMapNaviListener;
     10 import com.amap.api.navi.AMapNaviView;
     11 import com.amap.api.navi.AMapNaviViewListener;
     12 import com.amap.api.navi.AMapNaviViewOptions;
     13 import com.amap.api.navi.model.AMapNaviInfo;
     14 import com.amap.api.navi.model.AMapNaviLocation;
     15 import com.amap.api.navi.model.NaviInfo;
     16 import com.oysd.Util.TTSController;
     17 import com.oysd.Util.Utils;
     18 import com.oysd.ouyangmap.R;
     19 import com.oysd.ouyangmap.R.id;
     20 import com.oysd.ouyangmap.R.layout;
     21 
     22 /**
     23  * 实时导航界面
     24  * 
     25  */
     26 public class NaviCustomActivity extends Activity implements
     27         AMapNaviViewListener {
     28 
     29     private AMapNaviView mAmapAMapNaviView;
     30     // 导航可以设置的参数
     31     private boolean mDayNightFlag = Utils.DAY_MODE;// 默认为白天模式
     32     private boolean mDeviationFlag = Utils.YES_MODE;// 默认进行偏航重算
     33     private boolean mJamFlag = Utils.YES_MODE;// 默认进行拥堵重算
     34     private boolean mTrafficFlag = Utils.OPEN_MODE;// 默认进行交通播报
     35     private boolean mCameraFlag = Utils.OPEN_MODE;// 默认进行摄像头播报
     36     private boolean mScreenFlag = Utils.YES_MODE;// 默认是屏幕常亮
     37     // 导航界面风格
     38     private int mThemeStle;
     39     // 导航监听
     40     private AMapNaviListener mAmapNaviListener;
     41 
     42     public void onCreate(Bundle savedInstanceState) {
     43         super.onCreate(savedInstanceState);
     44         setContentView(R.layout.activity_navicustom);
     45         //语音播报开始
     46         TTSController.getInstance(this).startSpeaking();
     47         // 实时导航方式进行导航
     48         AMapNavi.getInstance(this).startNavi(AMapNavi.GPSNaviMode);
     49         
     50         initView(savedInstanceState);
     51     }
     52 
     53     private void initView(Bundle savedInstanceState) {
     54         mAmapAMapNaviView = (AMapNaviView) findViewById(R.id.customnavimap);
     55         mAmapAMapNaviView.onCreate(savedInstanceState);
     56         mAmapAMapNaviView.setAMapNaviViewListener(this);
     57         setAmapNaviViewOptions();
     58     }
     59 
     60     /**
     61      * 设置导航的参数
     62      */
     63     private void setAmapNaviViewOptions() {
     64         if (mAmapAMapNaviView == null) {
     65             return;
     66         }
     67         AMapNaviViewOptions viewOptions = new AMapNaviViewOptions();
     68         viewOptions.setSettingMenuEnabled(true);// 设置导航setting可用
     69         viewOptions.setNaviNight(mDayNightFlag);// 设置导航是否为黑夜模式
     70         viewOptions.setReCalculateRouteForYaw(mDeviationFlag);// 设置导偏航是否重算
     71         viewOptions.setReCalculateRouteForTrafficJam(mJamFlag);// 设置交通拥挤是否重算
     72         viewOptions.setTrafficInfoUpdateEnabled(mTrafficFlag);// 设置是否更新路况
     73         viewOptions.setCameraInfoUpdateEnabled(mCameraFlag);// 设置摄像头播报
     74         viewOptions.setScreenAlwaysBright(mScreenFlag);// 设置屏幕常亮情况
     75         viewOptions.setNaviViewTopic(mThemeStle);// 设置导航界面主题样式
     76 
     77         mAmapAMapNaviView.setViewOptions(viewOptions);
     78 
     79     }
     80 
     81     private AMapNaviListener getAMapNaviListener() {
     82         if (mAmapNaviListener == null) {
     83 
     84             mAmapNaviListener = new AMapNaviListener() {
     85 
     86                 @Override
     87                 public void onTrafficStatusUpdate() {
     88                     // TODO Auto-generated method stub
     89 
     90                 }
     91 
     92                 @Override
     93                 public void onStartNavi(int arg0) {
     94                     // TODO Auto-generated method stub
     95 
     96                 }
     97 
     98                 @Override
     99                 public void onReCalculateRouteForYaw() {
    100                     // 可以在频繁重算时进行设置,例如五次之后
    101                     // i++;
    102                     // if (i >= 5) {
    103                     // AMapNaviViewOptions viewOptions = new
    104                     // AMapNaviViewOptions();
    105                     // viewOptions.setReCalculateRouteForYaw(false);
    106                     // mAmapAMapNaviView.setViewOptions(viewOptions);
    107                     // }
    108                 }
    109 
    110                 @Override
    111                 public void onReCalculateRouteForTrafficJam() {
    112 
    113                 }
    114 
    115                 @Override
    116                 public void onLocationChange(AMapNaviLocation location) {
    117 
    118                 }
    119 
    120                 @Override
    121                 public void onInitNaviSuccess() {
    122                     // TODO Auto-generated method stub
    123 
    124                 }
    125 
    126                 @Override
    127                 public void onInitNaviFailure() {
    128                     // TODO Auto-generated method stub
    129 
    130                 }
    131 
    132                 @Override
    133                 public void onGetNavigationText(int arg0, String arg1) {
    134                     // TODO Auto-generated method stub
    135 
    136                 }
    137 
    138                 @Override
    139                 public void onEndEmulatorNavi() {
    140                     // TODO Auto-generated method stub
    141 
    142                 }
    143 
    144                 @Override
    145                 public void onCalculateRouteSuccess() {
    146 
    147                 }
    148 
    149                 @Override
    150                 public void onCalculateRouteFailure(int arg0) {
    151 
    152                 }
    153 
    154                 @Override
    155                 public void onArrivedWayPoint(int arg0) {
    156                     // TODO Auto-generated method stub
    157 
    158                 }
    159 
    160                 @Override
    161                 public void onArriveDestination() {
    162                     // TODO Auto-generated method stub
    163 
    164                 }
    165 
    166                 @Override
    167                 public void onGpsOpenStatus(boolean arg0) {
    168                     // TODO Auto-generated method stub
    169 
    170                 }
    171 
    172                 @Override
    173                 public void onNaviInfoUpdated(AMapNaviInfo arg0) {
    174                     // TODO Auto-generated method stub
    175                     
    176                 }
    177 
    178                 @Override
    179                 public void onNaviInfoUpdate(NaviInfo arg0) {
    180                       
    181                     // TODO Auto-generated method stub  
    182                     
    183                 }
    184             };
    185         }
    186         return mAmapNaviListener;
    187     }
    188 
    189     // -------处理
    190     /**
    191      * 导航界面返回按钮监听
    192      * */
    193     @Override
    194     public void onNaviCancel() {
    195         Intent intent = new Intent(NaviCustomActivity.this,
    196                 FunctionsListActivity.class);
    197         intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    198         startActivity(intent);
    199         finish();
    200     }
    201 
    202     /**
    203      * 点击设置按钮的事件
    204      */
    205     @Override
    206     public void onNaviSetting() {
    207         Bundle bundle = new Bundle();
    208         bundle.putInt(Utils.THEME, mThemeStle);
    209         bundle.putBoolean(Utils.DAY_NIGHT_MODE, mDayNightFlag);
    210         bundle.putBoolean(Utils.DEVIATION, mDeviationFlag);
    211         bundle.putBoolean(Utils.JAM, mJamFlag);
    212         bundle.putBoolean(Utils.TRAFFIC, mTrafficFlag);
    213         bundle.putBoolean(Utils.CAMERA, mCameraFlag);
    214         bundle.putBoolean(Utils.SCREEN, mScreenFlag);
    215         Intent intent = new Intent(NaviCustomActivity.this,
    216                 NaviSettingActivity.class);
    217         intent.putExtras(bundle);
    218         startActivity(intent);
    219 
    220     }
    221 
    222     @Override
    223     public void onNaviMapMode(int arg0) {
    224 
    225     }
    226     @Override
    227     public void onNaviTurnClick() {
    228         
    229         
    230     }
    231 
    232     @Override
    233     public void onNextRoadClick() {
    234         // TODO Auto-generated method stub
    235         
    236     }
    237 
    238     @Override
    239     public void onScanViewButtonClick() {
    240         // TODO Auto-generated method stub
    241         
    242     }
    243     private void processBundle(Bundle bundle) {
    244 
    245         if (bundle != null) {
    246             mDayNightFlag = bundle.getBoolean(Utils.DAY_NIGHT_MODE,
    247                     mDayNightFlag);
    248             mDeviationFlag = bundle.getBoolean(Utils.DEVIATION, mDeviationFlag);
    249             mJamFlag = bundle.getBoolean(Utils.JAM, mJamFlag);
    250             mTrafficFlag = bundle.getBoolean(Utils.TRAFFIC, mTrafficFlag);
    251             mCameraFlag = bundle.getBoolean(Utils.CAMERA, mCameraFlag);
    252             mScreenFlag = bundle.getBoolean(Utils.SCREEN, mScreenFlag);
    253             mThemeStle = bundle.getInt(Utils.THEME);
    254 
    255         }
    256     }
    257 
    258     @Override
    259     protected void onNewIntent(Intent intent) {
    260         // TODO Auto-generated method stub
    261         super.onNewIntent(intent);
    262         setIntent(intent);
    263     }
    264 
    265     @Override
    266     public boolean onKeyDown(int keyCode, KeyEvent event) {
    267 
    268         if (keyCode == KeyEvent.KEYCODE_BACK) {
    269             Intent intent = new Intent(NaviCustomActivity.this,
    270                     NaviMapActivity.class);
    271             intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    272             startActivity(intent);
    273             finish();
    274         }
    275         return super.onKeyDown(keyCode, event);
    276     }
    277 
    278     // ------------------------------生命周期方法---------------------------
    279     @Override
    280     protected void onSaveInstanceState(Bundle outState) {
    281         super.onSaveInstanceState(outState);
    282         mAmapAMapNaviView.onSaveInstanceState(outState);
    283     }
    284 
    285     @Override
    286     public void onResume() {
    287         // TODO Auto-generated method stub
    288         super.onResume();
    289         Bundle bundle = getIntent().getExtras();
    290         processBundle(bundle);
    291         setAmapNaviViewOptions();
    292         AMapNavi.getInstance(this).setAMapNaviListener(getAMapNaviListener());
    293         mAmapAMapNaviView.onResume();
    294 
    295     }
    296 
    297     @Override
    298     public void onPause() {
    299         mAmapAMapNaviView.onPause();
    300         super.onPause();
    301         AMapNavi.getInstance(this)
    302                 .removeAMapNaviListener(getAMapNaviListener());
    303 
    304     }
    305 
    306     @Override
    307     public void onDestroy() {
    308 
    309         super.onDestroy();
    310         mAmapAMapNaviView.onDestroy();
    311          //页面结束时,停止语音播报
    312         TTSController.getInstance(this).stopSpeaking();
    313     }
    314 
    315     @Override
    316     public void onLockMap(boolean arg0) {
    317           
    318         // TODO Auto-generated method stub  
    319         
    320     }
    321 
    322     
    323 
    324 }
    View Code

    其中包括页面的设置界面,NaviSettingActivity的布局文件:

      1 <?xml version="1.0" encoding="utf-8"?>
      2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      3     android:layout_width="match_parent"
      4     android:layout_height="match_parent"
      5     android:background="@color/grey"
      6     android:orientation="vertical" >
      7 
      8     <RelativeLayout
      9         android:layout_width="match_parent"
     10         android:layout_height="wrap_content"
     11         android:layout_marginBottom="@dimen/setting_margin_bottom" >
     12 
     13         <ImageView
     14             android:id="@+id/setting_back_image"
     15             android:layout_width="wrap_content"
     16             android:layout_height="wrap_content"
     17             android:src="@drawable/back_top" />
     18 
     19         <TextView
     20             android:layout_width="wrap_content"
     21             android:layout_height="wrap_content"
     22             android:layout_centerHorizontal="true"
     23             android:layout_weight="1"
     24             android:gravity="center_horizontal"
     25             android:text="@string/setting"
     26             android:textColor="@color/black"
     27             android:textSize="@dimen/titletext_size" />
     28     </RelativeLayout>
     29 
     30     <RelativeLayout
     31         android:layout_width="match_parent"
     32         android:layout_height="wrap_content"
     33         android:layout_marginBottom="@dimen/setting_margin_bottom"
     34         android:layout_marginLeft="@dimen/navibar_margin_left"
     35         android:layout_marginRight="@dimen/navibar_margin_right"
     36         android:layout_marginTop="@dimen/setting_margin_top"
     37         android:layout_weight="1"
     38         android:gravity="center_vertical"
     39         android:background="@drawable/whiteborder" >
     40 
     41         <TextView
     42             android:layout_width="wrap_content"
     43             android:layout_height="wrap_content"
     44             android:layout_marginLeft="@dimen/margin_left"
     45             android:layout_marginTop="10dp"
     46             android:gravity="center_vertical"
     47             android:text="@string/daynightmode"
     48             android:textColor="@color/black"
     49             android:textSize="@dimen/navisetting_subtext_size" />
     50 
     51         <RadioGroup
     52             android:id="@+id/day_night_group"
     53             android:layout_width="wrap_content"
     54             android:layout_height="wrap_content"
     55             android:layout_alignParentRight="true"
     56             android:layout_marginRight="@dimen/margin_right"
     57             android:orientation="horizontal" >
     58 
     59             <RadioButton
     60                 android:id="@+id/dayratio"
     61                 android:layout_width="wrap_content"
     62                 android:layout_height="wrap_content"
     63                 android:layout_marginRight="@dimen/margin_right"
     64                 android:checked="true"
     65                 android:text="@string/day"
     66                 android:textColor="@color/black" />
     67 
     68             <RadioButton
     69                 android:id="@+id/nightradio"
     70                 android:layout_width="wrap_content"
     71                 android:layout_height="wrap_content"
     72                 android:text="@string/night"
     73                 android:textColor="@color/black" />
     74         </RadioGroup>
     75     </RelativeLayout>
     76 
     77     <RelativeLayout
     78          android:layout_weight="1"
     79         android:layout_width="match_parent"
     80         android:layout_height="wrap_content"
     81         android:layout_marginBottom="@dimen/setting_margin_bottom"
     82         android:layout_marginLeft="@dimen/navibar_margin_left"
     83         android:layout_marginRight="@dimen/navibar_margin_right"
     84         android:layout_marginTop="@dimen/setting_margin_top"
     85           android:gravity="center_vertical"
     86         android:background="@drawable/whiteborder" >
     87 
     88         <TextView
     89             android:layout_width="wrap_content"
     90             android:layout_height="wrap_content"
     91             android:layout_marginLeft="@dimen/margin_left"
     92             android:layout_marginTop="10dp"
     93             android:text="@string/deviationrecalculation"
     94             android:textColor="@color/black"
     95             android:textSize="@dimen/navisetting_subtext_size" />
     96 
     97         <RadioGroup
     98             android:id="@+id/deviation_group"
     99             android:layout_width="wrap_content"
    100             android:layout_height="wrap_content"
    101             android:layout_alignParentRight="true"
    102             android:layout_marginRight="@dimen/margin_right"
    103             android:orientation="horizontal" >
    104 
    105             <RadioButton
    106                 android:id="@+id/deviationyesradio"
    107                 android:layout_width="wrap_content"
    108                 android:layout_height="wrap_content"
    109                 android:layout_marginRight="@dimen/margin_right"
    110                 android:checked="true"
    111                 android:text="@string/yes"
    112                 android:textColor="@color/black" />
    113 
    114             <RadioButton
    115                 android:id="@+id/deviationnoradio"
    116                 android:layout_width="wrap_content"
    117                 android:layout_height="wrap_content"
    118                 android:text="@string/no"
    119                 android:textColor="@color/black" />
    120         </RadioGroup>
    121     </RelativeLayout>
    122 
    123     <RelativeLayout
    124          android:layout_weight="1"
    125         android:layout_width="match_parent"
    126         android:layout_height="wrap_content"
    127           android:gravity="center_vertical"
    128         android:layout_marginBottom="@dimen/setting_margin_bottom"
    129         android:layout_marginLeft="@dimen/navibar_margin_left"
    130         android:layout_marginRight="@dimen/navibar_margin_right"
    131         android:layout_marginTop="@dimen/setting_margin_top"
    132         android:background="@drawable/whiteborder" >
    133 
    134         <TextView
    135             android:layout_width="wrap_content"
    136             android:layout_height="wrap_content"
    137             android:layout_marginLeft="@dimen/margin_left"
    138             android:layout_marginTop="10dp"
    139             android:text="@string/jamrecalculation"
    140             android:textColor="@color/black"
    141             android:textSize="@dimen/navisetting_subtext_size" />
    142 
    143         <RadioGroup
    144             android:id="@+id/jam_group"
    145             android:layout_width="wrap_content"
    146             android:layout_height="wrap_content"
    147             android:layout_alignParentRight="true"
    148             android:layout_marginRight="@dimen/margin_right"
    149             android:orientation="horizontal" >
    150 
    151             <RadioButton
    152                 android:id="@+id/jam_yes_radio"
    153                 android:layout_width="wrap_content"
    154                 android:layout_height="wrap_content"
    155                 android:layout_marginRight="@dimen/margin_right"
    156                 android:checked="true"
    157                 android:text="@string/yes"
    158                 android:textColor="@color/black" />
    159 
    160             <RadioButton
    161                 android:id="@+id/jam_no_radio"
    162                 android:layout_width="wrap_content"
    163                 android:layout_height="wrap_content"
    164                 android:text="@string/no"
    165                 android:textColor="@color/black" />
    166         </RadioGroup>
    167     </RelativeLayout>
    168 
    169     <RelativeLayout
    170          android:layout_weight="1"
    171         android:layout_width="match_parent"
    172         android:layout_height="wrap_content"
    173           android:gravity="center_vertical"
    174         android:layout_marginBottom="@dimen/setting_margin_bottom"
    175         android:layout_marginLeft="@dimen/navibar_margin_left"
    176         android:layout_marginRight="@dimen/navibar_margin_right"
    177         android:layout_marginTop="@dimen/setting_margin_top"
    178         android:background="@drawable/whiteborder" >
    179 
    180         <TextView
    181             android:id="@+id/textView2"
    182             android:layout_width="wrap_content"
    183             android:layout_height="wrap_content"
    184             android:layout_marginLeft="@dimen/margin_left"
    185             android:layout_marginTop="10dp"
    186             android:text="@string/trafficbroadcast"
    187             android:textColor="@color/black"
    188             android:textSize="@dimen/navisetting_subtext_size" />
    189 
    190         <RadioGroup
    191             android:id="@+id/traffic_group"
    192             android:layout_width="wrap_content"
    193             android:layout_height="wrap_content"
    194             android:layout_alignParentRight="true"
    195           android:layout_marginRight="@dimen/margin_right"
    196             android:orientation="horizontal" >
    197 
    198             <RadioButton
    199                 android:id="@+id/trafficyesradio"
    200                 android:layout_width="wrap_content"
    201                 android:layout_height="wrap_content"
    202                 android:layout_marginRight="@dimen/margin_right"
    203                 android:checked="true"
    204                 android:text="@string/open"
    205                 android:textColor="@color/black" />
    206 
    207             <RadioButton
    208                 android:id="@+id/trafficnoradio"
    209                 android:layout_width="wrap_content"
    210                 android:layout_height="wrap_content"
    211                 android:text="@string/close"
    212                 android:textColor="@color/black" />
    213         </RadioGroup>
    214     </RelativeLayout>
    215 
    216     <RelativeLayout
    217          android:layout_weight="1"
    218         android:layout_width="match_parent"
    219         android:layout_height="wrap_content"
    220           android:gravity="center_vertical"
    221         android:layout_marginBottom="@dimen/setting_margin_bottom"
    222         android:layout_marginLeft="@dimen/navibar_margin_left"
    223         android:layout_marginRight="@dimen/navibar_margin_right"
    224         android:layout_marginTop="@dimen/setting_margin_top"
    225         android:background="@drawable/whiteborder" >
    226 
    227         <TextView
    228             android:layout_width="wrap_content"
    229             android:layout_height="wrap_content"
    230             android:layout_marginLeft="@dimen/margin_left"
    231             android:layout_marginTop="10dp"
    232             android:text="@string/camerabroadcast"
    233             android:textColor="@color/black"
    234             android:textSize="@dimen/navisetting_subtext_size" />
    235 
    236         <RadioGroup
    237             android:id="@+id/camera_group"
    238             android:layout_width="wrap_content"
    239             android:layout_height="wrap_content"
    240             android:layout_alignParentRight="true"
    241             android:layout_marginRight="@dimen/margin_right"
    242             android:orientation="horizontal" >
    243 
    244             <RadioButton
    245                 android:id="@+id/camerayesradio"
    246                 android:layout_width="wrap_content"
    247                 android:layout_height="wrap_content"
    248                 android:layout_marginRight="@dimen/margin_right"
    249                 android:checked="true"
    250                 android:text="@string/open"
    251                 android:textColor="@color/black" />
    252 
    253             <RadioButton
    254                 android:id="@+id/cameranoradio"
    255                 android:layout_width="wrap_content"
    256                 android:layout_height="wrap_content"
    257                 android:text="@string/close"
    258                 android:textColor="@color/black" />
    259         </RadioGroup>
    260     </RelativeLayout>
    261 
    262     <RelativeLayout
    263          android:layout_weight="1"
    264         android:layout_width="match_parent"
    265         android:layout_height="wrap_content"
    266           android:gravity="center_vertical"
    267         android:layout_marginBottom="@dimen/setting_margin_bottom"
    268         android:layout_marginLeft="@dimen/navibar_margin_left"
    269         android:layout_marginRight="@dimen/navibar_margin_right"
    270         android:layout_marginTop="@dimen/setting_margin_top"
    271         android:background="@drawable/whiteborder" >
    272 
    273         <TextView
    274             android:layout_width="wrap_content"
    275             android:layout_height="wrap_content"
    276             android:layout_marginLeft="@dimen/margin_left"
    277             android:layout_marginTop="10dp"
    278             android:text="@string/screenon"
    279             android:textColor="@color/black"
    280             android:textSize="@dimen/navisetting_subtext_size" />
    281 
    282         <RadioGroup
    283             android:id="@+id/screen_group"
    284             android:layout_width="wrap_content"
    285             android:layout_height="wrap_content"
    286             android:layout_alignParentRight="true"
    287         android:layout_marginRight="@dimen/margin_right"
    288             android:orientation="horizontal" >
    289 
    290             <RadioButton
    291                 android:id="@+id/screenonradio"
    292                 android:layout_width="wrap_content"
    293                 android:layout_height="wrap_content"
    294                 android:layout_marginRight="@dimen/margin_right"
    295                 android:checked="true"
    296                 android:text="@string/yes"
    297                 android:textColor="@color/black" />
    298 
    299             <RadioButton
    300                 android:id="@+id/screenoffradio"
    301                 android:layout_width="wrap_content"
    302                 android:layout_height="wrap_content"
    303                 android:text="@string/no"
    304                 android:textColor="@color/black" />
    305         </RadioGroup>
    306     </RelativeLayout>
    307 
    308 </LinearLayout>
    View Code

    实现代码:

      1 package com.oysd.activity;
      2 
      3 import android.app.Activity;
      4 import android.content.Intent;
      5 import android.os.Bundle;
      6 import android.view.KeyEvent;
      7 import android.view.View;
      8 import android.view.View.OnClickListener;
      9 import android.widget.ImageView;
     10 import android.widget.RadioGroup;
     11 import android.widget.RadioGroup.OnCheckedChangeListener;
     12 
     13 import com.amap.api.navi.AMapNaviViewOptions;
     14 import com.oysd.Util.Utils;
     15 import com.oysd.ouyangmap.R;
     16 import com.oysd.ouyangmap.R.id;
     17 import com.oysd.ouyangmap.R.layout;
     18 
     19 /**
     20  * 导航设置界面
     21  *
     22  */
     23 public class NaviSettingActivity extends Activity implements OnClickListener,
     24         OnCheckedChangeListener {
     25     // ----------------View
     26 
     27     private ImageView mBackView;//返回按钮
     28     private RadioGroup mDayNightGroup;//黑夜模式白天模式
     29     private RadioGroup mDeviationGroup;//偏航重算
     30     private RadioGroup mJamGroup;//拥堵重算
     31     private RadioGroup mTrafficGroup;//交通播报
     32     private RadioGroup mCameraGroup;//摄像头播报
     33     private RadioGroup mScreenGroup;//屏幕常亮
     34 
     35     private boolean mDayNightFlag = Utils.DAY_MODE;
     36     private boolean mDeviationFlag = Utils.YES_MODE;
     37     private boolean mJamFlag = Utils.YES_MODE;
     38     private boolean mTrafficFlag = Utils.OPEN_MODE;
     39     private boolean mCameraFlag = Utils.OPEN_MODE;
     40     private boolean mScreenFlag = Utils.YES_MODE;
     41     private int mThemeStyle;
     42 
     43     protected void onCreate(Bundle savedInstanceState) {
     44         super.onCreate(savedInstanceState);
     45         setContentView(R.layout.activity_navisetting);
     46         Bundle bundle=getIntent().getExtras();
     47         processBundle(bundle);
     48         initView();
     49         initListener();
     50     }
     51 
     52 
     53     /**
     54      * 初始化控件
     55      */
     56     private void initView() {
     57         mBackView = (ImageView) findViewById(R.id.setting_back_image);
     58         mDayNightGroup = (RadioGroup) findViewById(R.id.day_night_group);
     59         mDeviationGroup = (RadioGroup) findViewById(R.id.deviation_group);
     60         mJamGroup = (RadioGroup) findViewById(R.id.jam_group);
     61         mTrafficGroup = (RadioGroup) findViewById(R.id.traffic_group);
     62         mCameraGroup = (RadioGroup) findViewById(R.id.camera_group);
     63         mScreenGroup = (RadioGroup) findViewById(R.id.screen_group);
     64 
     65     }
     66 
     67     /**
     68      * 初始化监听事件
     69      */
     70     private void initListener() {
     71         mBackView.setOnClickListener(this);
     72         mDayNightGroup.setOnCheckedChangeListener(this);
     73         mDeviationGroup.setOnCheckedChangeListener(this);
     74         mJamGroup.setOnCheckedChangeListener(this);
     75         mTrafficGroup.setOnCheckedChangeListener(this);
     76         mCameraGroup.setOnCheckedChangeListener(this);
     77         mScreenGroup.setOnCheckedChangeListener(this);
     78 
     79     }
     80 
     81     /**
     82      * 根据导航界面传过来的数据设置当前界面的显示状态
     83      */
     84     private void setViewContent() {
     85         if (mDayNightGroup == null) {
     86             return;
     87         }
     88         if (mDayNightFlag) {
     89             mDayNightGroup.check(R.id.nightradio);
     90         } else {
     91             mDayNightGroup.check(R.id.dayratio);
     92         }
     93         if (mDeviationFlag) {
     94             mDeviationGroup.check(R.id.deviationyesradio);
     95         } else {
     96             mDeviationGroup.check(R.id.deviationnoradio);
     97         }
     98 
     99         if (mJamFlag) {
    100             mJamGroup.check(R.id.jam_yes_radio);
    101         } else {
    102             mJamGroup.check(R.id.jam_no_radio);
    103         }
    104 
    105         if (mTrafficFlag) {
    106             mTrafficGroup.check(R.id.trafficyesradio);
    107         } else {
    108             mTrafficGroup.check(R.id.trafficnoradio);
    109         }
    110 
    111         if (mCameraFlag) {
    112             mCameraGroup.check(R.id.camerayesradio);
    113         } else {
    114             mCameraGroup.check(R.id.cameranoradio);
    115         }
    116 
    117         if (mScreenFlag) {
    118             mScreenGroup.check(R.id.screenonradio);
    119         } else {
    120             mScreenGroup.check(R.id.screenoffradio);
    121         }
    122     }
    123 
    124     /**
    125      * 处理具体的bundle
    126      * @param bundle
    127      */
    128     private void processBundle(Bundle bundle) {
    129         if (bundle != null) {
    130             mThemeStyle = bundle.getInt(Utils.THEME,
    131                     AMapNaviViewOptions.DEFAULT_COLOR_TOPIC);
    132             mDayNightFlag = bundle.getBoolean(Utils.DAY_NIGHT_MODE);
    133             mDeviationFlag = bundle.getBoolean(Utils.DEVIATION);
    134             mJamFlag = bundle.getBoolean(Utils.JAM);
    135             mTrafficFlag = bundle.getBoolean(Utils.TRAFFIC);
    136             mCameraFlag = bundle.getBoolean(Utils.CAMERA);
    137             mScreenFlag = bundle.getBoolean(Utils.SCREEN);
    138 
    139         }
    140     }
    141 
    142     /**
    143      * 根据当前界面的设置设置,构建bundle
    144      * @return
    145      */
    146     private Bundle getBundle() {
    147         Bundle bundle = new Bundle();
    148         bundle.putBoolean(Utils.DAY_NIGHT_MODE, mDayNightFlag);
    149         bundle.putBoolean(Utils.DEVIATION, mDeviationFlag);
    150         bundle.putBoolean(Utils.JAM, mJamFlag);
    151         bundle.putBoolean(Utils.TRAFFIC, mTrafficFlag);
    152         bundle.putBoolean(Utils.CAMERA, mCameraFlag);
    153         bundle.putBoolean(Utils.SCREEN, mScreenFlag);
    154         bundle.putInt(Utils.THEME, mThemeStyle);
    155         return bundle;
    156     }
    157 
    158     // 事件处理方法
    159     @Override
    160     public void onClick(View v) {
    161         switch (v.getId()) {
    162         case R.id.setting_back_image:
    163 
    164             Intent intent = new Intent(NaviSettingActivity.this,
    165                     NaviCustomActivity.class);
    166             intent.putExtras(getBundle());
    167             intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    168             startActivity(intent);
    169             finish();
    170             break;
    171         }
    172 
    173     }
    174 
    175     
    176 /**
    177  * 返回键监听
    178  * */
    179     @Override
    180     public boolean onKeyDown(int keyCode, KeyEvent event) {
    181 
    182         if (keyCode == KeyEvent.KEYCODE_BACK) {
    183             Intent intent = new Intent(NaviSettingActivity.this,
    184                     NaviCustomActivity.class);
    185             intent.putExtras(getBundle());
    186             intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    187             startActivity(intent);
    188             finish();
    189 
    190         }
    191         return super.onKeyDown(keyCode, event);
    192     }
    193 
    194     // ------------------------------生命周期重写方法---------------------------
    195 
    196     @Override
    197     public void onResume() {
    198         // TODO Auto-generated method stub
    199         super.onResume();
    200         setViewContent();
    201     }
    202 
    203     @Override
    204     public void onCheckedChanged(RadioGroup group, int checkedId) {
    205         switch (checkedId) {
    206         // 昼夜模式
    207         case R.id.dayratio:
    208             mDayNightFlag = Utils.DAY_MODE;
    209             break;
    210         case R.id.nightradio:
    211             mDayNightFlag = Utils.NIGHT_MODE;
    212             break;
    213         // 偏航重算
    214         case R.id.deviationyesradio:
    215             mDeviationFlag = Utils.YES_MODE;
    216             break;
    217         case R.id.deviationnoradio:
    218             mDeviationFlag = Utils.NO_MODE;
    219             break;
    220         // 拥堵重算
    221         case R.id.jam_yes_radio:
    222             mJamFlag = Utils.YES_MODE;
    223             break;
    224         case R.id.jam_no_radio:
    225             mJamFlag = Utils.NO_MODE;
    226             break;
    227         // 交通播报
    228         case R.id.trafficyesradio:
    229             mTrafficFlag = Utils.OPEN_MODE;
    230             break;
    231         case R.id.trafficnoradio:
    232             mTrafficFlag = Utils.CLOSE_MODE;
    233             break;
    234         // 摄像头播报
    235         case R.id.camerayesradio:
    236             mCameraFlag = Utils.OPEN_MODE;
    237             break;
    238         case R.id.cameranoradio:
    239             mCameraFlag = Utils.CLOSE_MODE;
    240             break;
    241             // 屏幕常亮
    242         case R.id.screenonradio:
    243             mScreenFlag = Utils.YES_MODE;
    244             break;
    245         case R.id.screenoffradio:
    246             mScreenFlag = Utils.NO_MODE;
    247             break;
    248         }
    249 
    250     }
    251 }
    View Code

    以上就差不多实现了导航的基本功能,后面开始分享地点搜索并且获得搜索点的经纬度

    第八步:兴趣点搜索+地理编码+步行规划(只是使用简单的兴趣点搜索,勿喷,另外,我这里只是使用了步行导航,如果需要驾车导航以及公交导航,可以去调用相类似的方法)

    首先需要在高德API官方网站下载搜索服务的jar包,至于在哪里,可以自己去查看,下载了这么多包了,应该知道怎么找了

    添加包之后,就可以写代码了,以下是我的RoutePlanningActivity的布局文件:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent" >
     5     
     6     <com.amap.api.maps.MapView
     7         android:id="@+id/map"
     8         android:layout_width="match_parent"
     9         android:layout_height="match_parent" />
    10  
    11     <LinearLayout
    12         android:layout_width="match_parent"
    13         android:layout_height="wrap_content"
    14         android:orientation="vertical">
    15  
    16         <LinearLayout 
    17             android:layout_width="fill_parent"
    18             android:layout_height="match_parent"
    19             android:orientation="horizontal">
    20             <AutoCompleteTextView
    21                 android:id="@+id/startPlace"
    22                 android:layout_width="match_parent"
    23                 android:layout_height="wrap_content"
    24                 android:layout_weight="2"
    25                 android:hint="起点"
    26                 android:text="天虹商场" />
    27             <Button 
    28                 android:id="@+id/addStartPlace"
    29                 android:layout_width="match_parent"
    30                 android:layout_height="wrap_content"
    31                 android:layout_weight="4"
    32                 android:text="添加起点"/>
    33         </LinearLayout>
    34  
    35         <LinearLayout 
    36             android:layout_width="fill_parent"
    37             android:layout_height="match_parent"
    38             android:orientation="horizontal">
    39             <AutoCompleteTextView
    40                 android:id="@+id/endPlace"
    41                 android:layout_width="match_parent"
    42                 android:layout_height="wrap_content"
    43                 android:layout_weight="2"
    44                 android:hint="终点"
    45                 android:text="上沙村" />
    46             <Button 
    47                 android:id="@+id/addEndPlace"
    48                 android:layout_width="match_parent"
    49                 android:layout_height="wrap_content"
    50                 android:layout_weight="4"
    51                 android:text="添加终点"/>
    52         </LinearLayout>
    53  
    54         <Button
    55             android:id="@+id/searchBtn"
    56             android:layout_width="match_parent"
    57             android:layout_height="wrap_content"
    58             android:text="搜索"/>
    59  
    60     </LinearLayout>
    61 
    62 </RelativeLayout>
    View Code


    然后就是RoutePlanningActivity的实现代码了:

      1 package com.oysd.activity;
      2 
      3 import java.util.ArrayList;
      4 import java.util.List;
      5 
      6 import com.amap.api.maps.AMap;
      7 import com.amap.api.maps.MapView;
      8 import com.amap.api.maps.overlay.WalkRouteOverlay;
      9 import com.amap.api.services.core.AMapException;
     10 import com.amap.api.services.core.LatLonPoint;
     11 import com.amap.api.services.geocoder.GeocodeQuery;
     12 import com.amap.api.services.geocoder.GeocodeResult;
     13 import com.amap.api.services.geocoder.GeocodeSearch;
     14 import com.amap.api.services.geocoder.GeocodeSearch.OnGeocodeSearchListener;
     15 import com.amap.api.services.geocoder.RegeocodeResult;
     16 import com.amap.api.services.help.Inputtips;
     17 import com.amap.api.services.help.Tip;
     18 import com.amap.api.services.poisearch.PoiSearch;
     19 import com.amap.api.services.route.BusRouteResult;
     20 import com.amap.api.services.route.DriveRouteResult;
     21 import com.amap.api.services.route.RouteSearch;
     22 import com.amap.api.services.route.RouteSearch.OnRouteSearchListener;
     23 import com.amap.api.services.route.WalkPath;
     24 import com.amap.api.services.route.WalkRouteResult;
     25 import com.oysd.ouyangmap.R;
     26 
     27 import android.app.Activity;
     28 import android.app.ProgressDialog;
     29 import android.os.Bundle;
     30 import android.text.Editable;
     31 import android.text.TextWatcher;
     32 import android.view.View;
     33 import android.view.View.OnClickListener;
     34 import android.widget.ArrayAdapter;
     35 import android.widget.AutoCompleteTextView;
     36 import android.widget.Button;
     37 import android.widget.EditText;
     38 import android.widget.Toast;
     39 
     40 public class RoutePlanningActivity extends Activity implements
     41         OnRouteSearchListener, OnGeocodeSearchListener, OnClickListener{
     42 
     43     private MapView mMapView;
     44     private AMap mAMap;
     45 
     46     private AutoCompleteTextView startPlace;// 起点
     47     private AutoCompleteTextView  endPlace;// 终点
     48     private Button searchBtn;// 搜索按钮
     49 
     50     private Button addStartPlaceBtn;
     51     private Button addEndPlaceBtn;
     52     private boolean isStart;
     53     private boolean isEnd;
     54     private GeocodeSearch mGeocodeSearch;
     55     // 搜索时进度条
     56     private ProgressDialog progDialog = null;
     57     private String strStart;
     58     private String strEnd;
     59     private LatLonPoint startPoint = null;
     60     private LatLonPoint endPoint = null;
     61     private PoiSearch.Query startSearchQuery;
     62     private PoiSearch.Query endSearchQuery;
     63 
     64     private int walkMode = RouteSearch.WalkDefault;// 步行默认模式
     65     private RouteSearch routeSearch;
     66 
     67     @Override
     68     protected void onCreate(Bundle savedInstanceState) {
     69         // TODO Auto-generated method stub
     70         super.onCreate(savedInstanceState);
     71         setContentView(R.layout.activity_routeplanning);
     72         mMapView = (MapView) findViewById(R.id.map);
     73         mMapView.onCreate(savedInstanceState);
     74         initAMap();
     75         findViewById();
     76     }
     77 
     78     /**
     79      * 初始化AMap对象
     80      */
     81     private void initAMap() {
     82         if (mAMap == null) {
     83             mAMap = mMapView.getMap();
     84         }
     85         mGeocodeSearch = new GeocodeSearch(this);
     86         mGeocodeSearch.setOnGeocodeSearchListener(this);
     87         
     88     }
     89 
     90     /**
     91      * 获取控件
     92      */
     93     private void findViewById() {
     94         startPlace = (AutoCompleteTextView) findViewById(R.id.startPlace);
     95         endPlace = (AutoCompleteTextView) findViewById(R.id.endPlace);
     96         searchBtn = (Button) findViewById(R.id.searchBtn);
     97         addEndPlaceBtn = (Button) findViewById(R.id.addEndPlace);
     98         addStartPlaceBtn = (Button) findViewById(R.id.addStartPlace);
     99         
    100         setListener();
    101     }
    102 
    103     /**
    104      * 设置监听
    105      */
    106     private void setListener() {
    107         
    108         searchBtn.setOnClickListener(this);
    109         addStartPlaceBtn.setOnClickListener(this);
    110         addEndPlaceBtn.setOnClickListener(this);
    111         startPlace.addTextChangedListener(this.startPlaceWatch);
    112         endPlace.addTextChangedListener(this.endPlaceWatch);
    113     }
    114 
    115     TextWatcher startPlaceWatch = new TextWatcher() {
    116         
    117         @Override
    118         public void onTextChanged(CharSequence s, int start, int before, int count) {
    119             // TODO Auto-generated method stub
    120             String newText = s.toString().trim();
    121             Inputtips inputTips = new Inputtips(RoutePlanningActivity.this,
    122                     new Inputtips.InputtipsListener() {
    123                         @Override
    124                         public void onGetInputtips(List<Tip> tipList, int rCode) {
    125                             if (rCode == 0) {// 正确返回
    126                                 List<String> listString = new ArrayList<String>();
    127                                 for (int i = 0; i < tipList.size(); i++) {
    128                                     listString.add(tipList.get(i).getName());
    129                                 }
    130                                 ArrayAdapter<String> aAdapter = new ArrayAdapter<String>(RoutePlanningActivity.this,android.R.layout.simple_list_item_1, listString);
    131                                 startPlace.setAdapter(aAdapter);
    132                                 aAdapter.notifyDataSetChanged();
    133                             }
    134                         }
    135                     });
    136             try {
    137                 // 第一个参数表示提示关键字,第二个参数默认代表全国,也可以为城市区号
    138                 inputTips.requestInputtips(newText,null);
    139             } catch (AMapException e) {
    140                 e.printStackTrace();
    141             }
    142         }
    143         
    144         @Override
    145         public void beforeTextChanged(CharSequence s, int start, int count,
    146                 int after) {
    147             // TODO Auto-generated method stub
    148             
    149         }
    150         
    151         @Override
    152         public void afterTextChanged(Editable s) {
    153             // TODO Auto-generated method stub
    154             
    155         }
    156     };
    157     
    158     TextWatcher endPlaceWatch = new TextWatcher() {
    159         
    160         @Override
    161         public void onTextChanged(CharSequence s, int start, int before, int count) {
    162             // TODO Auto-generated method stub
    163             String newText = s.toString().trim();
    164             Inputtips inputTips = new Inputtips(RoutePlanningActivity.this,
    165                     new Inputtips.InputtipsListener() {
    166                         @Override
    167                         public void onGetInputtips(List<Tip> tipList, int rCode) {
    168                             if (rCode == 0) {// 正确返回
    169                                 List<String> listString = new ArrayList<String>();
    170                                 for (int i = 0; i < tipList.size(); i++) {
    171                                     listString.add(tipList.get(i).getName());
    172                                 }
    173                                 ArrayAdapter<String> aAdapter = new ArrayAdapter<String>(RoutePlanningActivity.this,android.R.layout.simple_list_item_2, listString);
    174                                 startPlace.setAdapter(aAdapter);
    175                                 aAdapter.notifyDataSetChanged();
    176                             }
    177                         }
    178                     });
    179             try {
    180                 // 第一个参数表示提示关键字,第二个参数默认代表全国,也可以为城市区号
    181                 inputTips.requestInputtips(newText,null);
    182             } catch (AMapException e) {
    183                 e.printStackTrace();
    184             }
    185         }
    186         
    187         @Override
    188         public void beforeTextChanged(CharSequence s, int start, int count,
    189                 int after) {
    190             // TODO Auto-generated method stub
    191             
    192         }
    193         
    194         @Override
    195         public void afterTextChanged(Editable s) {
    196             // TODO Auto-generated method stub
    197             
    198         }
    199     };
    200 
    201     /**
    202      * 显示进度框
    203      */
    204     private void showProgressDialog() {
    205         if (progDialog == null)
    206             progDialog = new ProgressDialog(this);
    207         progDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    208         progDialog.setIndeterminate(false);
    209         progDialog.setCancelable(false);
    210         progDialog.setMessage("正在规划:
    ");
    211         progDialog.show();
    212     }
    213 
    214     /**
    215      * 隐藏进度框
    216      */
    217     private void dissmissProgressDialog() {
    218         if (progDialog != null) {
    219             progDialog.dismiss();
    220         }
    221     }
    222 
    223     @Override
    224     public void onBusRouteSearched(BusRouteResult arg0, int arg1) {
    225         // TODO Auto-generated method stub
    226 
    227     }
    228 
    229     @Override
    230     public void onDriveRouteSearched(DriveRouteResult arg0, int arg1) {
    231         // TODO Auto-generated method stub
    232 
    233     }
    234 
    235     @Override
    236     public void onWalkRouteSearched(WalkRouteResult walkRouteResult, int rCode) {
    237         // TODO Auto-generated method stub
    238         dissmissProgressDialog();
    239         if (rCode == 0) {
    240             if (walkRouteResult != null && walkRouteResult.getPaths() != null
    241                     && walkRouteResult.getPaths().size() > 0) {
    242                 WalkPath walkPath = walkRouteResult.getPaths().get(0);
    243 
    244                 mAMap.clear();// 清理之前的图标
    245                 WalkRouteOverlay walkRouteOverlay = new WalkRouteOverlay(this,
    246                         mAMap, walkPath, walkRouteResult.getStartPos(),
    247                         walkRouteResult.getTargetPos());
    248                 walkRouteOverlay.removeFromMap();
    249                 walkRouteOverlay.addToMap();
    250                 walkRouteOverlay.zoomToSpan();
    251             } else {
    252                 dissmissProgressDialog();// 隐藏对话框
    253                 Toast.makeText(RoutePlanningActivity.this, "没有搜索到结果",
    254                         Toast.LENGTH_SHORT).show();
    255             }
    256         } else {
    257             dissmissProgressDialog();// 隐藏对话框
    258             Toast.makeText(RoutePlanningActivity.this, "网络错误",
    259                     Toast.LENGTH_SHORT).show();
    260         }
    261     }
    262 
    263     @Override
    264     public void onGeocodeSearched(GeocodeResult geocodeResult, int rCode) {
    265         // TODO Auto-generated method stub
    266         if (rCode == 0) {
    267             if (geocodeResult != null
    268                     && geocodeResult.getGeocodeAddressList() != null
    269                     && geocodeResult.getGeocodeAddressList().size() > 0) {
    270                 LatLonPoint latLonPoint = geocodeResult.getGeocodeAddressList()
    271                         .get(0).getLatLonPoint();
    272                 if (isStart) {
    273                     startPoint = new LatLonPoint(latLonPoint.getLatitude(),
    274                             latLonPoint.getLongitude());
    275                     Toast.makeText(RoutePlanningActivity.this, "加入起点成功",
    276                             Toast.LENGTH_SHORT).show();
    277                 } else if (isEnd) {
    278                     endPoint = new LatLonPoint(latLonPoint.getLatitude(),
    279                             latLonPoint.getLongitude());
    280                     Toast.makeText(RoutePlanningActivity.this, "加入终点成功",
    281                             Toast.LENGTH_SHORT).show();
    282                 }
    283             } else {
    284                 Toast.makeText(RoutePlanningActivity.this, "没有结果",
    285                         Toast.LENGTH_SHORT).show();
    286             }
    287 
    288         } else {
    289             Toast.makeText(RoutePlanningActivity.this, "网络连接失败",
    290                     Toast.LENGTH_SHORT).show();
    291         }
    292     }
    293 
    294     @Override
    295     public void onRegeocodeSearched(RegeocodeResult arg0, int arg1) {
    296         // TODO Auto-generated method stub
    297         
    298     }
    299 
    300     @Override
    301     public void onClick(View v) {
    302         // TODO Auto-generated method stub
    303         switch(v.getId()){
    304         case R.id.searchBtn:
    305             doSearch();
    306             break;
    307         case R.id.addStartPlace:
    308             addStartPlace();
    309             break;
    310         case R.id.addEndPlace:
    311             addEndPlace();
    312             break;
    313         }
    314     }
    315     
    316     /**
    317      * 执行搜索功能
    318      */
    319     private void doSearch(){
    320         showProgressDialog();// 显示进度框
    321         RouteSearch.FromAndTo fromAndto = new RouteSearch.FromAndTo(
    322                 startPoint, endPoint);
    323         routeSearch = new RouteSearch(RoutePlanningActivity.this);
    324         routeSearch.setRouteSearchListener(RoutePlanningActivity.this);
    325         RouteSearch.WalkRouteQuery query = new RouteSearch.WalkRouteQuery(
    326                 fromAndto, walkMode);
    327         routeSearch.calculateWalkRouteAsyn(query);
    328     }
    329     
    330     /**
    331      * 执行添加起点操作功能
    332      */
    333     private void addStartPlace(){
    334         
    335         isStart = true;
    336         isEnd = false;
    337         addPoint(startPlace.getText().toString().trim());
    338     }
    339     
    340     
    341     /**
    342      * 执行添加终点操作功能
    343      */
    344     private void addEndPlace(){
    345         isStart = false;
    346         isEnd = true;
    347         addPoint(endPlace.getText().toString().trim());
    348     }
    349 
    350     private void addPoint(String address){
    351         
    352         // 第一个参数表示地址,第二个参数表示查询城市,中文或者中文全拼,citycode、adcode
    353         GeocodeQuery query = new GeocodeQuery(address, "深圳");
    354         mGeocodeSearch.getFromLocationNameAsyn(query);
    355     }
    356 
    357 }
    View Code


    不过这里面使用了AutoCompleteTextView 来实现输入提示,里面有一点点的问题,我这里有输入起点与终点,

    输入起点的时候,会有输入提示,但是输入终点就没有任何提示,自己也是不知道问题出在哪里,若有大神飘过,还请帮我解惑

    到这里 这个高德地图的简单功能开发算是分享得差不多了。

    其实,高德地图、百度地图、谷歌地图这些的开发都大同小异,还是需要认真查看API文档

    如果可能的话,完全可以在自己的手机上安装一个属于自己的私人地图,想要什么功能,自己往里面添加,自己怎么用的方便怎么用。。。。

  • 相关阅读:
    求24点
    关于参数和返回值的常量性
    点到平面的距离公式
    大端序与小端序
    Quake3中的绝对值函数
    整数超出范围时如何表示?
    关于数组的几道面试题
    在移位数组中查找数
    时间复杂度O(n),空间复杂度O(1)的排序
    C++之对象切割
  • 原文地址:https://www.cnblogs.com/ouyangduoduo/p/4623680.html
Copyright © 2011-2022 走看看