package com.hpw.myapp.ui.map;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.widget.AutoCompleteTextView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.maps.AMap;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.LocationSource;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.CameraPosition;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.MyLocationStyle;
import com.amap.api.services.core.AMapException;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.core.PoiItem;
import com.amap.api.services.core.SuggestionCity;
import com.amap.api.services.geocoder.GeocodeResult;
import com.amap.api.services.geocoder.GeocodeSearch;
import com.amap.api.services.geocoder.RegeocodeQuery;
import com.amap.api.services.geocoder.RegeocodeResult;
import com.amap.api.services.help.Inputtips;
import com.amap.api.services.help.InputtipsQuery;
import com.amap.api.services.help.Tip;
import com.amap.api.services.poisearch.PoiResult;
import com.amap.api.services.poisearch.PoiSearch;
import com.hpw.mvpframe.base.CoreBaseActivity;
import com.hpw.mvpframe.utils.AppUtils;
import com.hpw.mvpframe.utils.DisplayUtils;
import com.hpw.mvpframe.utils.StatusBarUtil;
import com.hpw.mvpframe.utils.ToastUtils;
import com.hpw.myapp.Constants;
import com.hpw.myapp.R;
import com.hpw.myapp.widget.scrolllayout.ScrollLayout;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* Created by hpw on 2017/1/24.
*/
public class PoiAroundSearchActivity extends CoreBaseActivity implements View.OnClickListener, AMap.OnCameraChangeListener,
PoiSearch.OnPoiSearchListener, LocationSource, AMapLocationListener, TextWatcher, Inputtips.InputtipsListener {
private MapView mapview;
private ListView listView;
private AMap mAMap;
private PoiResult poiResult; // poi返回的结果
private PoiSearch.Query query;// Poi查询条件类
private LatLonPoint lp = new LatLonPoint(39.993743, 116.472995);// 116.472995,39.993743
private PoiSearch poiSearch;
private static List<PoiItem> poiItems = new ArrayList<>();// poi数据
private AutoCompleteTextView mSearchText;
private ScrollLayout mScrollLayout;
private AMapLocationClient mlocationClient;
private OnLocationChangedListener mListener;
private AMapLocationClientOption mLocationOption;
private ImageView mLocation;
private Boolean isLocation = false;
private static AMapLocation mAMapLocation;
private ListviewAdapter listviewAdapter;
public final static int REQUESTCODE = 1;
public final static int RESULTCODE = 2;
@Override
public int getLayoutId() {
return R.layout.poiaroundsearch_activity;
}
@Override
public void initView(Bundle savedInstanceState) {
mapview = (MapView) findViewById(R.id.mapView);
mapview.onCreate(savedInstanceState);
initView();
init();
}
private void initView() {
StatusBarUtil.setTransparent(this);
RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.root);
mScrollLayout = (ScrollLayout) findViewById(R.id.scroll_down_layout);
/**设置 setting*/
mScrollLayout.setMinOffset(DisplayUtils.dp2px(this, 50));
mScrollLayout.setMaxOffset(DisplayUtils.getScreenHeightPixels(this) - DisplayUtils.dp2px(this, 320));
mScrollLayout.setIsSupportExit(false);
mScrollLayout.setAllowHorizontalScroll(true);
mScrollLayout.getBackground().setAlpha(0);
relativeLayout.setOnClickListener(v -> mScrollLayout.scrollToExit());
mLocation = (ImageView) findViewById(R.id.location);
mLocation.setOnClickListener(this);
}
private void scroll() {
mScrollLayout.setToOpen();
listView = (ListView) findViewById(R.id.list_view);
listviewAdapter = new ListviewAdapter(this, poiItems);
listView.setAdapter(listviewAdapter);
if (poiItems != null && poiItems.size() != 0 && isLocation) {
LatLonPoint latLonPoint = poiItems.get(0).getLatLonPoint();
mAMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latLonPoint.getLatitude(), latLonPoint.getLongitude()), 17));
}
}
/**
* 初始化AMap对象
*/
private void init() {
if (mAMap == null) {
mAMap = mapview.getMap();
mAMap.setLocationSource(this);
mAMap.getUiSettings().setZoomControlsEnabled(false);
mAMap.setMyLocationEnabled(true);
mAMap.setMyLocationType(AMap.LOCATION_TYPE_LOCATE);
mAMap.setOnCameraChangeListener(this);
TextView searchButton = (TextView) findViewById(R.id.search_button);
searchButton.setOnClickListener(this);
searchButton.setText(getString(R.string.search));
}
setup();
setupLocationStyle();
}
private void setup() {
mSearchText = (AutoCompleteTextView) findViewById(R.id.etInput);
mSearchText.addTextChangedListener(this);
mSearchText.setHint(getString(R.string.search_map));
findViewById(R.id.search_back).setOnClickListener(view -> {
finish();
});
mSearchText.setOnEditorActionListener((textView, i, keyEvent) -> {
if (i == EditorInfo.IME_ACTION_SEARCH) {
doSearch();
}
return false;
});
}
/**
* 设置自定义定位蓝点
*/
private void setupLocationStyle() {
// 自定义系统定位蓝点
MyLocationStyle myLocationStyle = new MyLocationStyle();
// 自定义定位蓝点图标
myLocationStyle.myLocationIcon(BitmapDescriptorFactory.
fromResource(R.drawable.gps_point));
// 自定义精度范围的圆形边框颜色
myLocationStyle.strokeColor(getResources().getColor(R.color.map));
//自定义精度范围的圆形边框宽度
myLocationStyle.strokeWidth(2);
// 设置圆形的填充颜色
// myLocationStyle.radiusFillColor(Color.argb(10, 0, 0, 180));
myLocationStyle.radiusFillColor(getResources().getColor(R.color.map_fill));
// 将自定义的 myLocationStyle 对象添加到地图上
mAMap.setMyLocationStyle(myLocationStyle);
}
/**
* 开始进行poi搜索
*/
protected void doSearchQuery(String keyWord, String cityCode, boolean is) {
isLocation = is;
query = new PoiSearch.Query(keyWord, "", cityCode);// 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
if (lp != null) {
poiSearch = new PoiSearch(this, query);
poiSearch.setOnPoiSearchListener(this);
if (!is) {
poiSearch.setBound(new PoiSearch.SearchBound(lp, 1000));
}
// 设置搜索区域为以lp点为圆心,其周围5000米范围
poiSearch.searchPOIAsyn();// 异步搜索
}
}
@Override
public void onPoiItemSearched(PoiItem arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onPoiSearched(PoiResult result, int rcode) {
if (rcode == AMapException.CODE_AMAP_SUCCESS) {
if (result != null && result.getQuery() != null) {// 搜索poi的结果
if (result.getQuery().equals(query)) {// 是否是同一条
poiResult = result;
poiItems = poiResult.getPois();// 取得第一页的poiitem数据,页数从数字0开始
List<SuggestionCity> suggestionCities = poiResult
.getSearchSuggestionCitys();// 当搜索不到poiitem数据时,会返回含有搜索关键字的城市信息
if (poiItems != null && poiItems.size() > 0) {
scroll();
} else if (suggestionCities != null && suggestionCities.size() > 0) {
doSearchQuery(mSearchText.getText().toString().trim(), suggestionCities.get(0).getCityCode(), true);
} else {
ToastUtils.showToast(PoiAroundSearchActivity.this,
getString(R.string.no_result));
}
}
} else {
ToastUtils.showToast(PoiAroundSearchActivity.this, getString(R.string.no_result));
}
} else {
ToastUtils.showToast(this.getApplicationContext(), String.valueOf(rcode));
}
}
//定位有关接口
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if (mListener != null && aMapLocation != null) {
if (aMapLocation != null && aMapLocation.getErrorCode() == 0) {
mAMapLocation = aMapLocation;
mlocationClient.stopLocation();
mListener.onLocationChanged(aMapLocation);// 显示系统小蓝点
lp = new LatLonPoint(aMapLocation.getLatitude(), aMapLocation.getLongitude());
mAMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lp.getLatitude(), lp.getLongitude()), 17));
doSearchQuery(aMapLocation.getPoiName().trim(), aMapLocation.getCityCode(), false);
} else {
String errText = "定位失败," + aMapLocation.getErrorCode() + ": " + aMapLocation.getErrorInfo();
ToastUtils.showToast(this, errText);
}
}
}
@Override
public void activate(OnLocationChangedListener onLocationChangedListener) {
mListener = onLocationChangedListener;
if (mlocationClient == null) {
mlocationClient = new AMapLocationClient(this);
mLocationOption = new AMapLocationClientOption();
//设置定位监听
mlocationClient.setLocationListener(this);
//设置为高精度定位模式
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置定位参数
mlocationClient.setLocationOption(mLocationOption);
// 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,
// 注意设置合适的定位时间的间隔(最小间隔支持为2000ms),并且在合适时间调用stopLocation()方法来取消定位请求
// 在定位结束后,在合适的生命周期调用onDestroy()方法
// 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除
mlocationClient.startLocation();
}
}
@Override
public void deactivate() {
mListener = null;
if (mlocationClient != null) {
mlocationClient.stopLocation();
mlocationClient.onDestroy();
}
mlocationClient = null;
}
@Override
public void onGetInputtips(List<Tip> tipList, int rCode) {
if (rCode == AMapException.CODE_AMAP_SUCCESS) {
List<HashMap<String, String>> listString = new ArrayList<>();
for (int i = 0; i < tipList.size(); i++) {
HashMap<String, String> map = new HashMap<>();
map.put("name", tipList.get(i).getName());
map.put("address", tipList.get(i).getDistrict());
listString.add(map);
}
SimpleAdapter aAdapter = new SimpleAdapter(this, listString, R.layout.item_find_city_search,
new String[]{"name", "address"}, new int[]{R.id.poi_name, R.id.poi_address});
mSearchText.setAdapter(aAdapter);
aAdapter.notifyDataSetChanged();
mSearchText.setOnItemClickListener((adapterView, view, position, id) -> {
mSearchText.setText(listString.get(position).get("name"));
Intent intent = new Intent();
intent.putExtra(Constants.ARG_POIITEM, listString.get(position).get("name"));
setResult(RESULTCODE, intent);
// finish();
showToast(listString.get(position).get("name"));
});
} else {
ToastUtils.showToast(this.getApplicationContext(), String.valueOf(rCode));
}
}
//自动提示接口
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
String newText = charSequence.toString().trim();
InputtipsQuery inputquery = new InputtipsQuery(newText, null);
Inputtips inputTips = new Inputtips(this, inputquery);
inputTips.setInputtipsListener(this);
inputTips.requestInputtipsAsyn();
}
@Override
public void afterTextChanged(Editable editable) {
}
/**
* 方法必须重写
*/
@Override
protected void onResume() {
super.onResume();
mapview.onResume();
}
/**
* 方法必须重写
*/
@Override
protected void onPause() {
super.onPause();
mapview.onPause();
}
/**
* 方法必须重写
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mapview.onSaveInstanceState(outState);
}
/**
* 方法必须重写
*/
@Override
protected void onDestroy() {
super.onDestroy();
mapview.onDestroy();
if (null != mlocationClient) {
mlocationClient.onDestroy();
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.search_button:
doSearch();
break;
case R.id.location:
mlocationClient.startLocation();
break;
default:
break;
}
}
private void doSearch() {
AppUtils.hideSoftInput(mSearchText);
doSearchQuery(mSearchText.getText().toString().trim(), mAMapLocation.getCityCode(), true);
}
@Override
public void onCameraChange(CameraPosition cameraPosition) {
}
@Override
public void onCameraChangeFinish(CameraPosition cameraPosition) {
LatLng target = cameraPosition.target;
lp = new LatLonPoint(target.latitude, target.longitude);
GeocodeSearch geocoderSearch = new GeocodeSearch(this);
geocoderSearch.setOnGeocodeSearchListener(new GeocodeSearch.OnGeocodeSearchListener() {
@Override
public void onRegeocodeSearched(RegeocodeResult result, int rCode) {
if (rCode == AMapException.CODE_AMAP_SUCCESS) {
if (result != null && result.getRegeocodeAddress() != null
&& result.getRegeocodeAddress().getPois() != null) {
listviewAdapter.setData(result.getRegeocodeAddress().getPois());
}
} else {
ToastUtils.showToast(mContext, String.valueOf(rCode));
}
}
@Override
public void onGeocodeSearched(GeocodeResult geocodeResult, int i) {
}
});
RegeocodeQuery query = new RegeocodeQuery(lp, 200, GeocodeSearch.AMAP);
geocoderSearch.getFromLocationAsyn(query);
}
private class ListviewAdapter extends BaseAdapter {
private Context mContext;
private List<PoiItem> mPoiItem = new ArrayList<>();
public ListviewAdapter(Context context, List<PoiItem> list) {
this.mContext = context;
this.mPoiItem = list;
}
public void setData(List<PoiItem> list) {
if (list != null) {
this.mPoiItem = list;
notifyDataSetChanged();
}
}
@Override
public int getCount() {
return mPoiItem.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder viewholder;
if (null == convertView) {
convertView = View.inflate(mContext, R.layout.item_find_city_search, null);
viewholder = new ViewHolder(convertView);
convertView.setTag(viewholder);
} else {
viewholder = (ViewHolder) convertView.getTag();
}
PoiItem mCurrentPoi = mPoiItem.get(position);
viewholder.mPoiName.setText(mCurrentPoi.getTitle());
viewholder.mPoiAddress.setText(mCurrentPoi.getSnippet() + mCurrentPoi.getDistance());
if (position == 0) {
viewholder.mCurrent.setVisibility(View.VISIBLE);
} else {
viewholder.mCurrent.setVisibility(View.GONE);
}
if (position == mPoiItem.size() - 1 && mPoiItem.size() > 7) {
viewholder.mSpace.setVisibility(View.VISIBLE);
} else {
viewholder.mSpace.setVisibility(View.GONE);
}
convertView.setOnClickListener(v -> {
Intent intent = new Intent();
intent.putExtra(Constants.ARG_POIITEM, mCurrentPoi);
setResult(RESULTCODE, intent);
// finish();
showToast(mCurrentPoi.getTitle());
});
return convertView;
}
class ViewHolder {
TextView mPoiName, mPoiAddress;
ImageView mCurrent;
View mSpace;
public ViewHolder(View view) {
mPoiName = (TextView) view.findViewById(R.id.poi_name);
mPoiAddress = (TextView) view.findViewById(R.id.poi_address);
mCurrent = (ImageView) view.findViewById(R.id.iv_current);
mSpace = view.findViewById(R.id.space);
}
}
}
}