package com.autobobo.keep.car.activity;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;

import com.autobobo.keep.car.R;
import com.autobobo.keep.car.common.KeepCarApplication;
import com.autobobo.keep.car.uitl.ScreenUtil;
import com.autobobo.keep.car.uitl.ToastUtil;
import com.autobobo.keep.car.view.MorePopWindow;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMap.OnMapStatusChangeListener;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.Polyline;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.overlayutil.OverlayManager;
import com.baidu.mapapi.search.core.CityInfo;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.poi.PoiNearbySearchOption;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;

public class MapQueryActivity extends Activity implements
OnGetPoiSearchResultListener, OnClickListener {

private ImageButton back, setApp;
private TextView head_title;
private MapView mMapView;
private BaiduMap mBaiduMap;
private int type;
private PoiSearch mPoiSearch = null;
// 定位相关
LocationClient mLocClient;
public MyLocationListenner myListener = new MyLocationListenner();
public boolean isFirstLoc = true;// 是否首次定位
private BitmapDescriptor mCurrentMarker;
private BitmapDescriptor poiMarker;
private LocationMode mCurrentMode;
private LatLng ll;
private LatLng target;


private MorePopWindow mPop;
private MyPoiOverlay overlay;

@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
requestWindowFeature(1);
setContentView(R.layout.activity_map_query);

type = (Integer) getIntent().getExtras().get("position");

initView();
}

private void setTopTitle(int type) {
switch (type) {
case 0:
head_title.setText("加油站");
break;
case 1:
head_title.setText("加气站");
break;
case 2:
head_title.setText("停车场");
break;
default:
break;
}
}

private void initView() {
mMapView = (MapView) findViewById(R.id.bd_service_gas);
mBaiduMap = mMapView.getMap();
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(new MapStatus.Builder().zoom(15).build()));
//MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(14.0f);
//mBaiduMap.setMapStatus(msu);
mBaiduMap.setOnMarkerClickListener(overlay);

head_title = (TextView) findViewById(R.id.head_title);
back = (ImageButton) findViewById(R.id.head_button_01);
setApp = (ImageButton) findViewById(R.id.head_button_02);
//setApp.setVisibility(View.GONE);
setApp.setImageResource(R.drawable.more);
back.setImageResource(R.drawable.back);

setTopTitle(type);

back.setOnClickListener(this);
setApp.setOnClickListener(this);
baiduLocation();

// 搜索
mPoiSearch = PoiSearch.newInstance();

mPoiSearch.setOnGetPoiSearchResultListener(this);

OnMapStatusChangeListener statusListener = new OnMapStatusChangeListener() {
/**
* 手势操作地图,设置地图状态等操作导致地图状态开始改变。
* @param status 地图状态改变开始时的地图状态
*/
public void onMapStatusChangeStart(MapStatus status){
mBaiduMap.removeMarkerClickListener(overlay);
}
/**
* 地图状态变化中
* @param status 当前地图状态
*/
public void onMapStatusChange(MapStatus status){
mBaiduMap.removeMarkerClickListener(overlay);
}
/**
* 地图状态改变结束
* @param status 地图状态改变结束后的地图状态
*/
public void onMapStatusChangeFinish(MapStatus status){
if(overlay != null){
overlay.removeFromMap();
}
target = status.target;
//MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(target);
//mBaiduMap.animateMapStatus(update);
searchPoiFromMap(type,target);
}
};
mBaiduMap.setOnMapStatusChangeListener(statusListener);
}

/**
* 地图定位
*/
public void baiduLocation() {

// 隐藏缩放控件
mMapView.showZoomControls(false);
// 隐藏右下角的百度图标
mMapView.removeViewAt(1);
// 影藏比例尺
mMapView.removeViewAt(2);
// 开启定位图层
mBaiduMap.setMyLocationEnabled(true);
// 定位初始化
mLocClient = new LocationClient(KeepCarApplication.getContext());
mLocClient.registerLocationListener(myListener);
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);// 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
// option.setScanSpan(1000);//不设置只定位一次,如果多次定位的情况下,在popwindow点击取消的时候需要点击两次
option.setIsNeedAddress(true);

mLocClient.setLocOption(option);
mLocClient.start();

poiMarker = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);

mCurrentMarker = BitmapDescriptorFactory
.fromResource(R.drawable.icon_focus_marka);
mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(
mCurrentMode, true, mCurrentMarker));

}

/**
* 定位SDK监听函数
*/
public class MyLocationListenner implements BDLocationListener {

@Override
public void onReceiveLocation(BDLocation location) {
// map view 销毁后不在处理新接收的位置
if (location == null || mMapView == null)
return;
MyLocationData locData = new MyLocationData.Builder()
// .accuracy(location.getRadius())//去掉精度圈
// 此处设置开发者获取到的方向信息,顺时针0-360
.latitude(location.getLatitude())
.longitude(location.getLongitude()).build();

mBaiduMap.setMyLocationData(locData);
ll = new LatLng(location.getLatitude(), location.getLongitude());
if (isFirstLoc) {
isFirstLoc = false;
ll = new LatLng(location.getLatitude(), location.getLongitude());
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
mBaiduMap.animateMapStatus(u);

}
mLocClient.stop();
// 百度地图定位完成之后再调用显示兴趣点
searchPoiFromMap(type,ll);
}

public void onReceivePoi(BDLocation poiLocation) {

}
}

// 地图 搜索
private void searchPoiFromMap(int type, LatLng llParams) {
switch (type) {
// 加油站
case 0:

mPoiSearch
.searchNearby(new PoiNearbySearchOption().pageCapacity(20)
.location(llParams).radius(10000).keyword("加油站"));
break;
// 加气站
case 1:

mPoiSearch
.searchNearby(new PoiNearbySearchOption().pageCapacity(20)
.location(llParams).radius(10000).keyword("加气站"));

break;
// 停车场
case 2:

mPoiSearch.searchNearby(new PoiNearbySearchOption()
.pageCapacity(20).location(llParams).radius(10000)
.keyword("ͣ停车场"));

break;
}
}

public void onGetPoiResult(PoiResult result) {

if (result == null
|| result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {
Toast.makeText(getApplicationContext(), "未找到结果", Toast.LENGTH_LONG)
.show();
return;
}
if (result.error == SearchResult.ERRORNO.NO_ERROR) {
if(overlay != null){
overlay.removeFromMap();
overlay = null;
}
mBaiduMap.clear();
overlay = new MyPoiOverlay(mBaiduMap);
mBaiduMap.setOnMarkerClickListener(overlay);
overlay.setData(result);
overlay.addToMap();
//overlay.zoomToSpan();

return;
}
if (result.error == SearchResult.ERRORNO.AMBIGUOUS_KEYWORD) {

// 当输入关键字在本市没有找到,但在其他城市找到时,返回包含该关键字信息的城市列表
String strInfo = "在";
for (CityInfo cityInfo : result.getSuggestCityList()) {
strInfo += cityInfo.city;
strInfo += ",";
}
strInfo += "找到结果";
ToastUtil.showToast(strInfo);
}
}

public void onGetPoiDetailResult(PoiDetailResult result) {

if (result.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(getApplicationContext(), "抱歉,未找到结果",
Toast.LENGTH_SHORT).show();
} else {
// 需要长显示,让用户看清楚文字的内容
Toast.makeText(getApplicationContext(),
result.getName() + ": " + result.getAddress(),
Toast.LENGTH_SHORT).show();
}

}

/**
*
* @author quincy
*
*/
private class MyPoiOverlay extends OverlayManager {
private PoiResult poiResult = null;

public MyPoiOverlay(BaiduMap baiduMap) {
super(baiduMap);
}

public void setData(PoiResult poiResult) {
this.poiResult = poiResult;
}

@Override
public boolean onMarkerClick(Marker marker) {
if (marker.getExtraInfo() != null) {
int index = marker.getExtraInfo().getInt("index");
final PoiInfo poi = poiResult.getAllPoi().get(index);
View view = View.inflate(getApplicationContext(),
R.layout.navigation_location, null);
TextView name = (TextView) view.findViewById(R.id.name);
TextView address = (TextView) view.findViewById(R.id.address);
LinearLayout Route = (LinearLayout) view
.findViewById(R.id.Route);
LinearLayout close = (LinearLayout) view
.findViewById(R.id.ll_close);
name.setText(poi.name);
address.setText(poi.address);
final PopupWindow pop = new PopupWindow(view,
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
false);
pop.setBackgroundDrawable(new ColorDrawable());
pop.setOutsideTouchable(true);
// 设置此参数获得焦点,否则无法点击
pop.setFocusable(false);

pop.showAtLocation(findViewById(R.id.bd_service_gas),
Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, -5);
// 点击关闭pop
close.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (pop.isShowing()) {
pop.setFocusable(false);
pop.dismiss();
}
}
});

// 点击路线
Route.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(),
RouteActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
// 目的地的位置
intent.putExtra("latitude", poi.location.latitude+"");
intent.putExtra("longitude", poi.location.longitude+"");
KeepCarApplication.getContext().startActivity(intent);
}
});

// 详情搜索
/*
* mPoiSearch.searchPoiDetail((new PoiDetailSearchOption())
* .poiUid(poi.uid));
*/
}

return true;
}



@Override
public List<OverlayOptions> getOverlayOptions() {
if ((this.poiResult == null)
|| (this.poiResult.getAllPoi() == null))
return null;
ArrayList<OverlayOptions> arrayList = new ArrayList<OverlayOptions>();

for (int i = 0; i < this.poiResult.getAllPoi().size(); i++) {
if (this.poiResult.getAllPoi().get(i).location == null)
continue;
// 给marker加上标签
Bundle bundle = new Bundle();
bundle.putInt("index", i);
arrayList.add(new MarkerOptions().icon(BitmapDescriptorFactory.fromBitmap(setNumToIcon(i + 1)))
.extraInfo(bundle)
.position(this.poiResult.getAllPoi().get(i).location));
}
return arrayList;
}

@Override
public boolean onPolylineClick(Polyline arg0) {
return false;
}
}

/**
* 往图片添加数字
*/
private Bitmap setNumToIcon(int num) {
BitmapDrawable bd = (BitmapDrawable) getResources().getDrawable(
R.drawable.icon_marka);
Bitmap bitmap = bd.getBitmap().copy(Bitmap.Config.ARGB_8888, true);
Canvas canvas = new Canvas(bitmap);

Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setAntiAlias(true);
int widthX;
int heightY = 0;
if (num < 10) {
paint.setTextSize(30);
widthX = 8;
heightY = 6;
} else {
paint.setTextSize(20);
widthX = 11;
}

canvas.drawText(String.valueOf(num),
((bitmap.getWidth() / 2) - widthX),
((bitmap.getHeight() / 2) + heightY), paint);
return bitmap;
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.head_button_01:
finish();
break;

case R.id.head_button_02:
//弹出一个popwindow
mPop = new MorePopWindow(MapQueryActivity.this, this,true); // ScreenUtil.dip2px(MyRepairOrderActivity.this, 100)
mPop.showAsDropDown((ImageButton)findViewById(R.id.head_button_02), -ScreenUtil.dip2px(getApplicationContext(), 30), 0);
break;
case R.id.myposition:
//移动到当前定位的位置
myPosition();
mPop.dismiss();
break;
/*case R.id.delete:
ToastUtil.showToast("点击了删除");
break;*/
}
}

/**
* 移动到我当前的位置
*/
private void myPosition(){
if(ll != null){
//searchPoiFromMap(type,ll);
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
mBaiduMap.animateMapStatus(u);

}
}

}

更多相关文章

  1. android 仿照ihone开关
  2. StickyScrollView解说
  3. Android(安卓)CheckBox实现SwitchButton
  4. android状态栏下载
  5. Android(安卓)蓝牙服务端实现
  6. android 管理wifi
  7. android activity Understand the Lifecycle Callback
  8. 高德地图帮助类
  9. 大型情感类电视连续剧--Android高德之旅(3)地图交互

随机推荐

  1. 关于android系统自带数据库SQLite操作的
  2. Android(安卓)远程连接 daemon not runni
  3. Android DrawerLayout抽屉效果
  4. android提示错误: The process android.pr
  5. Android(安卓)关于@NonNull
  6. Unity3d和iOS、Android的混合开发介绍
  7. android 安卓事件处理示例
  8. 第3.2.1节 android基本视图
  9. android 自定义图片剪裁
  10. TextView跑马灯