仿百度外賣3_7_1百度地圖拖動定位,顯示附近地址poi提示搜索



前頁:這裏用到的sdk包就不介紹了在百度api裏面去下載就好了,然後就正式看對mapview的使用以及拖動地圖控件時候對地圖中間的紅色箭頭的處理。



1.先看下當前頁面的佈局文件:R.layout.activity_more_address,由一個mapview和listview組成,上面的編輯框是由AutoCompleteTextView自動提示輸入框組成。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:clipToPadding="false"
    android:fitsSystemWindows="true"
    android:orientation="vertical" >


    <RelativeLayout
        android:id="@+id/rl_search"
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:background="@color/tab" >


        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="30dp"
            android:layout_centerInParent="true"
            android:layout_marginLeft="6dp"
            android:layout_marginRight="12dp"
            android:layout_marginTop="6dp"
            android:layout_toRightOf="@+id/iv_left"
            android:background="@color/bg_mine" >


            <ImageView
                android:id="@+id/iv_search"
                android:layout_width="26dp"
                android:layout_height="26dp"
                android:layout_centerVertical="true"
                android:layout_marginLeft="6dp"
                android:paddingRight="6dp"
                android:src="@drawable/search_icon_blac" />


            <AutoCompleteTextView
                android:id="@+id/et_search"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_toRightOf="@+id/iv_search"
                android:background="@color/bg_mine"
                android:gravity="center_vertical"
                android:hint="請輸入您的收貨地址"
                android:paddingLeft="2dp"
                android:singleLine="true"
                android:textColor="@color/black"
                android:textSize="14sp" />
        </RelativeLayout>


        <ImageView
            android:id="@+id/iv_left"
            style="@style/head_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            android:layout_marginLeft="6dp"
            android:padding="14dp"
            android:src="@drawable/arrow_left" />
    </RelativeLayout>


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="280dp"
        android:orientation="vertical"
        android:visibility="visible" >


        <com.baidu.mapapi.map.MapView
            android:id="@+id/map"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/white"
            android:onClick="true" >
        </com.baidu.mapapi.map.MapView>


        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:background="@color/transparent"
            android:src="@drawable/gps_red" />
    </RelativeLayout>


    <ListView
        android:id="@+id/lv_near_address"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:cacheColorHint="#00000000"
        android:descendantFocusability="beforeDescendants"
        android:fastScrollEnabled="true"
        android:scrollbars="none" />


</LinearLayout>


2.然後就是拖動的地址活動界面MoreAddressActivity,拖動地圖的時候中間的紅色gps箭頭指向當前的地址,下面的listview會根據當前經緯度反地理編碼拿到附近的地址列表,第一個當然顯示的是gps箭頭所指向位置,點擊listview中的item之後,會返回所要拿到的地圖位置。


package cn.wifi.bryant.ttelife;


import java.util.List;


import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMap.OnMapStatusChangeListener;
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.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.geocode.GeoCodeResult;
import com.baidu.mapapi.search.geocode.GeoCoder;
import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.sug.OnGetSuggestionResultListener;
import com.baidu.mapapi.search.sug.SuggestionResult;
import com.baidu.mapapi.search.sug.SuggestionSearch;
import com.baidu.mapapi.search.sug.SuggestionSearchOption;
import com.umeng.analytics.MobclickAgent;


import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import cn.wifi.bryant.ttelife.application.RequestManager;
import cn.wifi.bryant.ttelife.utils.SystemBarTintManager;
import cn.wifi.bryant.ttelife.utils.TtelifeLog;


public class MoreAddressActivity extends Activity implements OnClickListener, OnGetSuggestionResultListener,
OnMapStatusChangeListener, BDLocationListener, OnGetGeoCoderResultListener {
private ImageView iv_left;
protected static final String TAG = "MoreAddressActivity";
protected static final int REQUEST_OK = 0;
private ListView lv_near_address;
private SuggestionSearch mSuggestionSearch = null;
private BaiduMap mBaiduMap = null;
private double latitude;
private double longitude;
/**
* 搜索關鍵字輸入窗口
*/
private AutoCompleteTextView keyWorldsView = null;
private ArrayAdapter<String> sugAdapter = null;
private int load_Index = 0;
private PoiSearchAdapter adapter;
private MapView map;
private MyLocationConfiguration.LocationMode mCurrentMode;
private LocationClient mLocClient;
private GeoCoder geoCoder;
private String city;
private boolean isFirstLoc = true;
private LatLng locationLatLng;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_more_address);
initData();
setStatusBarColor();
}


private void initData() {
map = (MapView) findViewById(R.id.map);
mBaiduMap = map.getMap();
MapStatus mapStatus = new MapStatus.Builder().zoom(15).build();
MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mapStatus);
mBaiduMap.setMapStatus(mMapStatusUpdate);
// 地圖狀態改變相關監聽
mBaiduMap.setOnMapStatusChangeListener(this);
// 開啓定位圖層
mBaiduMap.setMyLocationEnabled(true);
// 定位圖層顯示方式
mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL;
mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(mCurrentMode, true, null));
mLocClient = new LocationClient(this);
// 註冊定位監聽
mLocClient.registerLocationListener(this);
// 定位選項
LocationClientOption option = new LocationClientOption();
/**
* coorType - 取值有3個: 返回國測局經緯度座標系:gcj02 返回百度墨卡託座標系 :bd09 返回百度經緯度座標系
* :bd09ll
*/
option.setCoorType("bd09ll");
// 設置是否需要地址信息,默認爲無地址
option.setIsNeedAddress(true);
// 設置是否需要返回位置語義化信息,可以在BDLocation.getLocationDescribe()中得到數據,ex:"在天安門附近",
// 可以用作地址信息的補充
option.setIsNeedLocationDescribe(true);
// 設置是否需要返回位置POI信息,可以在BDLocation.getPoiList()中得到數據
option.setIsNeedLocationPoiList(true);
/**
* 設置定位模式 Battery_Saving 低功耗模式 Device_Sensors 僅設備(Gps)模式 Hight_Accuracy
* 高精度模式
*/
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
// 設置是否打開gps進行定位
option.setOpenGps(true);
// 設置掃描間隔,單位是毫秒 當<1000(1s)時,定時定位無效
option.setScanSpan(1000);
// 設置 LocationClientOption
mLocClient.setLocOption(option);
// 開始定位
mLocClient.start();
lv_near_address = (ListView) findViewById(R.id.lv_near_address);
// 初始化搜索模塊,註冊搜索事件監聽
mSuggestionSearch = SuggestionSearch.newInstance();
mSuggestionSearch.setOnGetSuggestionResultListener(this);
keyWorldsView = (AutoCompleteTextView) findViewById(R.id.et_search);
sugAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line);
keyWorldsView.setAdapter(sugAdapter);
/**
* 當輸入關鍵字變化時,動態更新建議列表
*/
keyWorldsView.addTextChangedListener(new TextWatcher() {


@Override
public void afterTextChanged(Editable arg0) {
}


@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {


}


@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
if (cs.length() <= 0) {
return;
}
String city = "深圳";
/**
* 使用建議搜索服務獲取建議列表,結果在onSuggestionResult()中更新
*/
mSuggestionSearch.requestSuggestion((new SuggestionSearchOption()).keyword(cs.toString()).city(city));
}
});
keyWorldsView.setOnItemClickListener(new OnItemClickListener() {


@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
String address = arg0.getItemAtPosition(arg2).toString();
TtelifeLog.i(TAG, "address.toString()" + address.toString());
Intent intentAddress = new Intent();
intentAddress.putExtra("selectAddress", keyWorldsView.getText().toString());
setResult(RESULT_OK, intentAddress);
finish();
}
});
iv_left = (ImageView) findViewById(R.id.iv_left);
iv_left.setOnClickListener(this);
}


/*
* 接受周邊地理位置結果

* @param poiResult
*/


@Override
protected void onDestroy() {
super.onDestroy();
mLocClient.stop();
mBaiduMap.setMyLocationEnabled(false);
map.onDestroy();
if (geoCoder != null) {
geoCoder.destroy();
}
map = null;
mSuggestionSearch.destroy();
RequestManager.cancelRequest(this);
}


@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}


@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}


@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.iv_left:
finish();
break;


default:
break;
}
}


public void onResume() {
super.onResume();
map.onResume();
if (getIntent().getStringExtra("latitude") != null && (!"".equals(getIntent().getStringExtra("latitude")))) {
latitude = Double.parseDouble(getIntent().getStringExtra("latitude"));
longitude = Double.parseDouble(getIntent().getStringExtra("longitude"));
TtelifeLog.i(TAG, "latitude" + latitude);
}
MobclickAgent.onResume(this);
}


public void onPause() {
super.onPause();
map.onPause();
MobclickAgent.onPause(this);
}


private void setStatusBarColor() {
Window window = getWindow();
WindowManager.LayoutParams params = getWindow().getAttributes();
params.flags |= WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
window.setAttributes(params);
SystemBarTintManager tintManager = new SystemBarTintManager(this);
tintManager.setStatusBarTintEnabled(true);
tintManager.setTintColor(getResources().getColor(R.color.tab));
}


public void onGetPoiDetailResult(PoiDetailResult result) {
if (result.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(MoreAddressActivity.this, "抱歉,未找到結果", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MoreAddressActivity.this, result.getName() + ": " + result.getAddress(), Toast.LENGTH_SHORT)
.show();
}
}


@Override
public void onGetSuggestionResult(SuggestionResult res) {
if (res == null || res.getAllSuggestions() == null) {
return;
}
sugAdapter.clear();
for (SuggestionResult.SuggestionInfo info : res.getAllSuggestions()) {
if (info.key != null)
sugAdapter.add(info.key + " " + info.city + info.district);
}
sugAdapter.notifyDataSetChanged();
}


class PoiSearchAdapter extends BaseAdapter {


private Context context;
private List<PoiInfo> list;
private ViewHolder holder;


public PoiSearchAdapter(Context context, List<PoiInfo> appGroup) {
this.context = context;
this.list = appGroup;
}


@Override
public int getCount() {
return list.size();
}


@Override
public Object getItem(int location) {
return list.get(location);
}


@Override
public long getItemId(int arg0) {
return arg0;
}


public void addObject(List<PoiInfo> mAppGroup) {
this.list = mAppGroup;
notifyDataSetChanged();
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {


if (convertView == null) {
holder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.activity_poi_search_item, null);
holder.mpoi_name = (TextView) convertView.findViewById(R.id.mpoiNameT);
holder.mpoi_address = (TextView) convertView.findViewById(R.id.mpoiAddressT);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.mpoi_name.setText(list.get(position).name);
holder.mpoi_address.setText(list.get(position).address);
// Log.i("yxx", "==1=poi===城市:" + poiInfo.city + "名字:" +
// poiInfo.name + "地址:" + poiInfo.address);
return convertView;
}


public class ViewHolder {
public TextView mpoi_name;// 名稱
public TextView mpoi_address;// 地址


}


}


@Override
public void onMapStatusChange(MapStatus mapStatus) {


}


@Override
public void onMapStatusChangeFinish(MapStatus mapStatus) {
// 地圖操作的中心點
LatLng cenpt = mapStatus.target;
geoCoder.reverseGeoCode(new ReverseGeoCodeOption().location(cenpt));
}


@Override
public void onMapStatusChangeStart(MapStatus mapStatus) {


}


@Override
public void onReceiveLocation(BDLocation bdLocation) {
// 如果bdLocation爲空或mapView銷燬後不再處理新數據接收的位置
if (bdLocation == null || mBaiduMap == null) {
return;
}


// 定位數據
MyLocationData data = new MyLocationData.Builder()
// 定位精度bdLocation.getRadius()
.accuracy(bdLocation.getRadius())
// 此處設置開發者獲取到的方向信息,順時針0-360
.direction(bdLocation.getDirection())
// 經度
.latitude(bdLocation.getLatitude())
// 緯度
.longitude(bdLocation.getLongitude())
// 構建
.build();


// 設置定位數據
mBaiduMap.setMyLocationData(data);


// 是否是第一次定位
if (isFirstLoc) {
isFirstLoc = false;
LatLng ll = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
MapStatusUpdate msu = MapStatusUpdateFactory.newLatLngZoom(ll, 18);
mBaiduMap.animateMapStatus(msu);
}


locationLatLng = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
// 獲取城市,待會用於POISearch
city = bdLocation.getCity();


// 創建GeoCoder實例對象
geoCoder = GeoCoder.newInstance();
// 發起反地理編碼請求(經緯度->地址信息)
ReverseGeoCodeOption reverseGeoCodeOption = new ReverseGeoCodeOption();
// 設置反地理編碼位置座標
reverseGeoCodeOption.location(new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude()));
geoCoder.reverseGeoCode(reverseGeoCodeOption);


// 設置查詢結果監聽者
geoCoder.setOnGetGeoCodeResultListener(this);
}


@Override
public void onGetGeoCodeResult(GeoCodeResult arg0) {


}


// 拿到變化地點後的附近地址
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
final List<PoiInfo> poiInfos = reverseGeoCodeResult.getPoiList();
TtelifeLog.i(TAG, "這裏的值:" + poiInfos);
if (poiInfos != null && !"".equals(poiInfos)) {
PoiAdapter poiAdapter = new PoiAdapter(MoreAddressActivity.this, poiInfos);
lv_near_address.setAdapter(poiAdapter);
lv_near_address.setOnItemClickListener(new OnItemClickListener() {


@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String name = poiInfos.get(position).name.toString();
Intent intent = new Intent();
intent.putExtra("selectAddress", name);
setResult(RESULT_OK, intent);
finish();
}
});
}
}


class PoiAdapter extends BaseAdapter {
private Context context;
private List<PoiInfo> pois;
private LinearLayout linearLayout;


PoiAdapter(Context context, List<PoiInfo> pois) {
this.context = context;
this.pois = pois;
}


@Override
public int getCount() {
return pois.size();
}


@Override
public Object getItem(int position) {
return pois.get(position);
}


@Override
public long getItemId(int position) {
return position;
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.locationpois_item, null);
linearLayout = (LinearLayout) convertView.findViewById(R.id.locationpois_linearlayout);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if (position == 0) {
holder.iv_gps.setImageDrawable(getResources().getDrawable(R.drawable.gps_orange));
holder.locationpoi_name.setTextColor(Color.parseColor("#FF9D06"));
holder.locationpoi_address.setTextColor(Color.parseColor("#FF9D06"));
}
if (position == 0 && linearLayout.getChildCount() < 2) {
ImageView imageView = new ImageView(context);
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(32, 32);
imageView.setLayoutParams(params);
imageView.setBackgroundColor(Color.TRANSPARENT);
imageView.setImageResource(R.drawable.gps_grey);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
linearLayout.addView(imageView, 0, params);
holder.locationpoi_name.setTextColor(Color.parseColor("#FF5722"));
}
PoiInfo poiInfo = pois.get(position);
holder.locationpoi_name.setText(poiInfo.name);
holder.locationpoi_address.setText(poiInfo.address);
return convertView;
}


class ViewHolder {
ImageView iv_gps;
TextView locationpoi_name;
TextView locationpoi_address;


ViewHolder(View view) {
locationpoi_name = (TextView) view.findViewById(R.id.locationpois_name);
locationpoi_address = (TextView) view.findViewById(R.id.locationpois_address);
iv_gps = (ImageView) view.findViewById(R.id.iv_gps);
}
}
}
}



3.後面的兩個佈局文件R.layout.activity_poi_search_item和R.layout.locationpois_item,分別是自動提示檢索的item界面和listview的item界面

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="5dp" >


    <LinearLayout
        android:id="@+id/locationpois_linearlayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:orientation="horizontal" >


        <ImageView
            android:id="@+id/iv_gps"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="4dp"
            android:src="@drawable/gps_grey" />


        <TextView
            android:id="@+id/locationpois_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="6dp"
            android:text="威盛大廈"
            android:textColor="#4A4A4A"
            android:textSize="14sp" />
    </LinearLayout>


    <TextView
        android:id="@+id/locationpois_address"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="24dp"
        android:layout_marginTop="4dp"
        android:text="威盛大廈"
        android:textColor="@color/darkgray"
        android:textSize="12sp" />


</LinearLayout>

點擊下載源碼:點擊打開鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章