package com.amapv2.cn.apis.route;
import java.util.List;
import android.app.ProgressDialog;
import android.content.res.Configuration;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.Toast;
import com.amap.api.maps.AMap;
import com.amap.api.maps.AMap.InfoWindowAdapter;
import com.amap.api.maps.AMap.OnInfoWindowClickListener;
import com.amap.api.maps.AMap.OnMapClickListener;
import com.amap.api.maps.AMap.OnMarkerClickListener;
import com.amap.api.maps.SupportMapFragment;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
import com.amap.api.search.core.AMapException;
import com.amap.api.search.core.LatLonPoint;
import com.amap.api.search.poisearch.PoiItem;
import com.amap.api.search.poisearch.PoiPagedResult;
import com.amap.api.search.poisearch.PoiSearch;
import com.amap.api.search.poisearch.PoiSearch.Query;
import com.amap.api.search.poisearch.PoiTypeDef;
import com.amap.api.search.route.Route;
import com.amapv2.cn.apis.route.RouteSearchPoiDialog.OnListItemClick;
import com.amapv2.cn.apis.util.AMapUtil;
import com.amapv2.cn.apis.util.Constants;
import com.example.lokal.R;
public class RouteDemoActivity extends FragmentActivity implements
OnMarkerClickListener, OnMapClickListener ,OnInfoWindowClickListener, InfoWindowAdapter{
private AMap mMap;
private Button drivingButton;
private Button transitButton;
private Button walkButton;
private ImageButton startImageButton;
private ImageButton endImageButton;
private ImageButton routeSearchImagebtn;
private AutoCompleteTextView startTextView;
private AutoCompleteTextView endTextView;
private int mode = Route.BusDefault;
private ProgressDialog progDialog;
private PoiPagedResult startSearchResult;
private PoiPagedResult endSearchResult;
private String strStart;
private String strEnd;
private LatLonPoint startPoint = null;
private LatLonPoint endPoint = null;
private List<Route> routeResult;
private LinearLayout routeNav;
private ImageButton routePre, routeNext;
private RouteOverlay routeOverlay;
private Route route;
private boolean isClickStart = false;
private boolean isClickTarget = false;
private Marker startMk, targetMk;
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.route);
startTextView = (AutoCompleteTextView) findViewById(R.id.autotextview_roadsearch_start);
startTextView.setSelectAllOnFocus(true);
endTextView = (AutoCompleteTextView) findViewById(R.id.autotextview_roadsearch_goals);
endTextView.setSelectAllOnFocus(true);
routeNav = (LinearLayout) findViewById(R.id.LinearLayoutLayout_index_bottom);
drivingButton = (Button) findViewById(R.id.imagebtn_roadsearch_tab_driving);
transitButton = (Button) findViewById(R.id.imagebtn_roadsearch_tab_transit);
walkButton = (Button) findViewById(R.id.imagebtn_roadsearch_tab_walk);
drivingButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mode = Route.DrivingDefault;
drivingButton.setBackgroundResource(R.drawable.mode_driving_on);
transitButton
.setBackgroundResource(R.drawable.mode_transit_off);
walkButton.setBackgroundResource(R.drawable.mode_walk_off);
}
});
transitButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mode = Route.BusDefault;
drivingButton
.setBackgroundResource(R.drawable.mode_driving_off);
transitButton.setBackgroundResource(R.drawable.mode_transit_on);
walkButton.setBackgroundResource(R.drawable.mode_walk_off);
}
});
walkButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mode = Route.WalkDefault;
drivingButton
.setBackgroundResource(R.drawable.mode_driving_off);
transitButton
.setBackgroundResource(R.drawable.mode_transit_off);
walkButton.setBackgroundResource(R.drawable.mode_walk_on);
}
});
startImageButton = (ImageButton) findViewById(R.id.imagebtn_roadsearch_startoption);
startImageButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showToast("在地图上点击您的起点");
isClickStart = true;
isClickTarget = false;
registerListener();
}
});
endImageButton = (ImageButton) findViewById(R.id.imagebtn_roadsearch_goalsoption);
endImageButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showToast("在地图上点击您的终点");
isClickTarget = true;
isClickStart = false;
registerListener();
}
});
routeSearchImagebtn = (ImageButton) findViewById(R.id.imagebtn_roadsearch_search);
routeSearchImagebtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
strStart = startTextView.getText().toString().trim();
strEnd = endTextView.getText().toString().trim();
if (strStart == null || strStart.length() == 0) {
Toast.makeText(RouteDemoActivity.this, "请选择起点",
Toast.LENGTH_SHORT).show();
return;
}
if (strEnd == null || strEnd.length() == 0) {
Toast.makeText(RouteDemoActivity.this, "请选择终点",
Toast.LENGTH_SHORT).show();
return;
}
startSearchResult();
}
});
routePre = (ImageButton) findViewById(R.id.pre_index);
routePre.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if (routeOverlay != null) {
boolean enablePre = routeOverlay.showPrePopInfo();
if (!enablePre) {
routePre.setBackgroundResource(R.drawable.prev_disable);
routeNext
.setBackgroundResource(R.drawable.btn_route_next);
} else {
routePre.setBackgroundResource(R.drawable.btn_route_pre);
routeNext
.setBackgroundResource(R.drawable.btn_route_next);
}
}
}
});
routeNext = (ImageButton) findViewById(R.id.next_index);
routeNext.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (routeOverlay != null) {
boolean enableNext = routeOverlay.showNextPopInfo();
if (!enableNext) {
routePre.setBackgroundResource(R.drawable.btn_route_pre);
routeNext
.setBackgroundResource(R.drawable.next_disable);
} else {
routePre.setBackgroundResource(R.drawable.btn_route_pre);
routeNext
.setBackgroundResource(R.drawable.btn_route_next);
}
}
}
});
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
}
@Override
protected void onResume() {
super.onResume();
setUpMapIfNeeded();
}
@Override
public void onInfoWindowClick(Marker arg0) {
// TODO Auto-generated method stub
isClickStart = false;
isClickTarget = false;
mMap.clear();
if (startMk.equals(arg0)) {
startTextView.setText("地图上的点");
startPoint = AMapUtil.convertToLatLonPoint(startMk.getPosition());
} else if (targetMk.equals(arg0)) {
endTextView.setText("地图上的点");
endPoint = AMapUtil.convertToLatLonPoint(targetMk.getPosition());
}
releaseListener();
}
@Override
public boolean onMarkerClick(Marker arg0) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onMapClick(LatLng latng) {
mMap.clear();
if (isClickStart) {
startMk = mMap.addMarker(new MarkerOptions().anchor(0.5f, 1)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.point))
.position(latng)
.title("点击选择为起点"));
startMk.showInfoWindow();
} else if (isClickTarget) {
targetMk = mMap.addMarker(new MarkerOptions().anchor(0.5f, 1)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.point))
.position(latng)
.title("点击选择为目的地"));
targetMk.showInfoWindow();
}
}
@Override
public View getInfoContents(Marker arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public View getInfoWindow(Marker arg0) {
// TODO Auto-generated method stub
return null;
}
private void registerListener(){
mMap.setOnMapClickListener(RouteDemoActivity.this);
mMap.setOnMarkerClickListener(RouteDemoActivity.this);
mMap.setOnInfoWindowClickListener(RouteDemoActivity.this);
mMap.setInfoWindowAdapter(RouteDemoActivity.this);
}
private void releaseListener(){
mMap.setOnMapClickListener(null);
mMap.setOnMarkerClickListener(null);
mMap.setOnInfoWindowClickListener(null);
mMap.setInfoWindowAdapter(null);
}
private void setUpMapIfNeeded() {
if (mMap == null) {
mMap = ((SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map)).getMap();
if (mMap != null) {
setUpMap();
}
}
}
private void setUpMap() {
mMap.getUiSettings().setZoomControlsEnabled(true);
}
public void showToast(String showString) {
Toast.makeText(getApplicationContext(), showString, Toast.LENGTH_SHORT)
.show();
}
// 查询路径规划起点
public void startSearchResult() {
strStart = startTextView.getText().toString().trim();
if (startPoint != null && strStart.equals("地图上的点")) {
endSearchResult();
} else {
final Query startQuery = new Query(strStart, PoiTypeDef.All, "010");
progDialog = ProgressDialog.show(RouteDemoActivity.this, null,
"正在搜索您所需信息...", true, true);
Thread t = new Thread(new Runnable() {
@Override
public void run() {
// 调用搜索POI方法
PoiSearch poiSearch = new PoiSearch(RouteDemoActivity.this,
startQuery); // 设置搜索字符串
try {
startSearchResult = poiSearch.searchPOI();
if (progDialog.isShowing()) {
routeHandler.sendMessage(Message.obtain(
routeHandler, Constants.ROUTE_START_SEARCH));
}
} catch (AMapException e) {
Message msg = new Message();
msg.what = Constants.ROUTE_SEARCH_ERROR;
msg.obj = e.getErrorMessage();
routeHandler.sendMessage(msg);
}
}
});
t.start();
}
}
// 查询路径规划终点
public void endSearchResult() {
strEnd = endTextView.getText().toString().trim();
if (endPoint != null && strEnd.equals("地图上的点")) {
searchRouteResult(startPoint, endPoint);
} else {
final Query endQuery = new Query(strEnd, PoiTypeDef.All, "010");
progDialog = ProgressDialog.show(RouteDemoActivity.this, null,
"正在搜索您所需信息...", true, false);
Thread t = new Thread(new Runnable() {
@Override
public void run() {
PoiSearch poiSearch = new PoiSearch(RouteDemoActivity.this,
endQuery); // 设置搜索字符串
try {
endSearchResult = poiSearch.searchPOI();
if (progDialog.isShowing()) {
routeHandler.sendMessage(Message.obtain(
routeHandler, Constants.ROUTE_END_SEARCH));
}
} catch (AMapException e) {
Message msg = new Message();
msg.what = Constants.ROUTE_SEARCH_ERROR;
msg.obj = e.getErrorMessage();
routeHandler.sendMessage(msg);
}
}
});
t.start();
}
}
public void searchRouteResult(LatLonPoint startPoint, LatLonPoint endPoint) {
progDialog = ProgressDialog.show(RouteDemoActivity.this, null,
"正在获取线路", true, true);
final Route.FromAndTo fromAndTo = new Route.FromAndTo(startPoint,
endPoint);
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
routeResult = Route.calculateRoute(RouteDemoActivity.this,
fromAndTo, mode);
if (progDialog.isShowing()) {
if (routeResult != null || routeResult.size() > 0)
routeHandler.sendMessage(Message
.obtain(routeHandler,
Constants.ROUTE_SEARCH_RESULT));
}
} catch (AMapException e) {
Message msg = new Message();
msg.what = Constants.ROUTE_SEARCH_ERROR;
msg.obj = e.getErrorMessage();
routeHandler.sendMessage(msg);
}
}
});
t.start();
}
private Handler routeHandler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == Constants.ROUTE_START_SEARCH) {
progDialog.dismiss();
try {
List<PoiItem> poiItems;
if (startSearchResult != null
&& (poiItems = startSearchResult.getPage(1)) != null
&& poiItems.size() > 0) {
RouteSearchPoiDialog dialog = new RouteSearchPoiDialog(
RouteDemoActivity.this, poiItems);
dialog.setTitle("您要找的起点是:");
dialog.show();
dialog.setOnListClickListener(new OnListItemClick() {
@Override
public void onListItemClick(
RouteSearchPoiDialog dialog,
PoiItem startpoiItem) {
startPoint = startpoiItem.getPoint();
strStart = startpoiItem.getTitle();
startTextView.setText(strStart);
endSearchResult();
}
});
} else {
showToast("无搜索起点结果,建议重新设定...");
}
} catch (AMapException e) {
e.printStackTrace();
}
} else if (msg.what == Constants.ROUTE_END_SEARCH) {
progDialog.dismiss();
try {
List<PoiItem> poiItems;
if (endSearchResult != null
&& (poiItems = endSearchResult.getPage(1)) != null
&& poiItems.size() > 0) {
RouteSearchPoiDialog dialog = new RouteSearchPoiDialog(
RouteDemoActivity.this, poiItems);
dialog.setTitle("您要找的终点是:");
dialog.show();
dialog.setOnListClickListener(new OnListItemClick() {
@Override
public void onListItemClick(
RouteSearchPoiDialog dialog,
PoiItem endpoiItem) {
// TODO Auto-generated method stub
endPoint = endpoiItem.getPoint();
strEnd = endpoiItem.getTitle();
endTextView.setText(strEnd);
searchRouteResult(startPoint, endPoint);
}
});
} else {
showToast("无搜索起点结果,建议重新设定...");
}
} catch (AMapException e) {
e.printStackTrace();
}
} else if (msg.what == Constants.ROUTE_SEARCH_RESULT) {
progDialog.dismiss();
if (routeResult != null && routeResult.size() > 0) {
route = routeResult.get(0);
if (route != null) {
routeOverlay = new RouteOverlay(RouteDemoActivity.this,
mMap, route);
routeOverlay.removeFormMap();
routeOverlay.addMarkerLine();
// routeNav.setVisibility(View.VISIBLE);
routePre.setBackgroundResource(R.drawable.prev_disable);
routeNext
.setBackgroundResource(R.drawable.btn_route_next);
}
}
} else if (msg.what == Constants.ROUTE_SEARCH_ERROR) {
progDialog.dismiss();
showToast((String) msg.obj);
}
}
};
}