package baidumapsdk.demo.radar;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TabHost;
import android.widget.TabHost.OnTabChangeListener;
import android.widget.TextView;
import android.widget.Toast;
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.OnMapClickListener;
import com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.MapPoi;
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.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.radar.RadarNearbyInfo;
import com.baidu.mapapi.radar.RadarNearbyResult;
import com.baidu.mapapi.radar.RadarNearbySearchOption;
import com.baidu.mapapi.radar.RadarSearchError;
import com.baidu.mapapi.radar.RadarSearchListener;
import com.baidu.mapapi.radar.RadarSearchManager;
import com.baidu.mapapi.radar.RadarUploadInfo;
import com.baidu.mapapi.radar.RadarUploadInfoCallback;
import java.util.ArrayList;
import java.util.List;
import baidumapsdk.demo.R;
/**
* 演示周边雷达的业务场景使用
*/
public class RadarDemo extends Activity implements RadarUploadInfoCallback,
RadarSearchListener, BDLocationListener, OnMarkerClickListener, OnMapClickListener {
// 界面空间相关
private CustomViewPager mPager; // 自定义viewPager,目的是禁用手势滑动
private List<View> listViews;
private TabHost mTabHost;
private EditText userId;
private EditText userDes;
private Button uploadOnece;
private Button uploadContinue;
private Button stopUpload;
private Button switchBtn;
private Button searchNearbyBtn;
private Button clearRstBtn;
private Button clearInfoBtn;
private int index = 0;
private Button listPreBtn;
private Button listNextBtn;
private TextView listCurPage;
private Button mapPreBtn;
private Button mapNextBtn;
private TextView mapCurPage;
// 定位相关
LocationClient mLocClient;
private int pageIndex = 0;
private int curPage = 0;
private int totalPage = 0;
private LatLng pt = null;
// 周边雷达相关
RadarNearbyResult listResult = null;
ListView mResultListView = null;
RadarResultListAdapter mResultListAdapter = null;
private String userID = "";
private String userComment = "";
private boolean uploadAuto = false;
// 地图相关
private MapView mMapView;
private BaiduMap mBaiduMap;
private TextView popupText = null; // 泡泡view
BitmapDescriptor ff3 = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_radartablayout);
// 初始化UI和地图
initUI();
// 周边雷达设置监听
RadarSearchManager.getInstance().addNearbyInfoListener(this);
// 周边雷达设置用户,id为空默认是设备标识
RadarSearchManager.getInstance().setUserID(userID);
// 定位初始化
mLocClient = new LocationClient(this);
mLocClient.registerLocationListener(this);
LocationClientOption option = new LocationClientOption();
option.setOpenGps(false); // 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(1000);
mLocClient.setLocOption(option);
mLocClient.start();
}
private void initUI() {
mTabHost = (TabHost) findViewById(R.id.tabhost);
mTabHost.setup();
mTabHost.addTab(mTabHost.newTabSpec("tabUpload")
.setIndicator(composeLayout("上传位置", 0))
.setContent(R.id.tabUpload));
mTabHost.addTab(mTabHost.newTabSpec("tabGet")
.setIndicator(composeLayout("检索周边", 0))
.setContent(R.id.tabGet));
mTabHost.setCurrentTab(0);
mTabHost.setOnTabChangedListener(new OnTabChangeListener() {
@Override
public void onTabChanged(String tabId) {
// TODO Auto-generated method stub
for (int i = 0; i < mTabHost.getTabWidget().getChildCount(); i++) {
mTabHost.getTabWidget().getChildAt(i).setBackgroundDrawable(null);
}
mTabHost.getTabWidget().getChildAt(mTabHost.getCurrentTab())
.setBackgroundColor(Color.parseColor("#B0E2FF"));
}
});
mPager = (CustomViewPager) findViewById(R.id.viewpager);
listViews = new ArrayList<View>();
LayoutInflater mInflater = getLayoutInflater();
View layout = mInflater.inflate(R.layout.activity_radarlist, null);
View mapLayout = mInflater.inflate(R.layout.activity_radarmap, null);
// 地图初始化
mMapView = (MapView) mapLayout.findViewById(R.id.map);
mBaiduMap = mMapView.getMap();
mBaiduMap.setOnMarkerClickListener(this);
mBaiduMap.setOnMapClickListener(this);
mBaiduMap.setMyLocationEnabled(true);
listViews.add(layout);
listViews.add(mapLayout);
mPager.setAdapter(new MyPagerAdapter(listViews));
mPager.setCurrentItem(0);
mPager.setOnPageChangeListener(new MyOnPageChangeListener());
userId = (EditText) findViewById(R.id.id);
userDes = (EditText) findViewById(R.id.des);
uploadOnece = (Button) findViewById(R.id.uploadonece);
uploadContinue = (Button) findViewById(R.id.uploadcontinue);
stopUpload = (Button) findViewById(R.id.stopupload);
switchBtn = (Button) findViewById(R.id.switchButton);
searchNearbyBtn = (Button) findViewById(R.id.searchNearByButton);
clearRstBtn = (Button) findViewById(R.id.clearResultButton);
clearInfoBtn = (Button) findViewById(R.id.clearInfoButton);
listPreBtn = (Button) layout.findViewById(R.id.radarlistpre);
listNextBtn = (Button) layout.findViewById(R.id.radarlistnext);
listCurPage = (TextView) layout.findViewById(R.id.radarListPage);
mapPreBtn = (Button) mapLayout.findViewById(R.id.radarmappre);
mapNextBtn = (Button) mapLayout.findViewById(R.id.radarmapnext);
mapCurPage = (TextView) mapLayout.findViewById(R.id.radarMapPage);
uploadContinue.setEnabled(true);
stopUpload.setEnabled(false);
clearRstBtn.setEnabled(false);
clearInfoBtn.setEnabled(false);
listPreBtn.setVisibility(View.INVISIBLE);
listNextBtn.setVisibility(View.INVISIBLE);
mapPreBtn.setVisibility(View.INVISIBLE);
mapNextBtn.setVisibility(View.INVISIBLE);
listCurPage.setVisibility(View.INVISIBLE);
mapCurPage.setVisibility(View.INVISIBLE);
mTabHost.getTabWidget().getChildAt(0).setBackgroundColor(Color.DKGRAY);
ArrayList<RadarNearbyInfo> infos = new ArrayList<RadarNearbyInfo>();
mResultListAdapter = new RadarResultListAdapter(null);
mResultListView = (ListView) layout.findViewById(R.id.radar_list);
mResultListView.setAdapter(mResultListAdapter);
mResultListAdapter.notifyDataSetChanged();
TextWatcher textWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
userID = userId.getText().toString();
userComment = userDes.getText().toString();
RadarSearchManager.getInstance().setUserID(userID);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
};
// 用户ID和用户描述监听文本框变化
userId.addTextChangedListener(textWatcher);
userDes.addTextChangedListener(textWatcher);
}
/**
* 上传一次位置
*
* @param v
*/
public void uploadOnceClick(View v) {
if (pt == null) {
Toast.makeText(RadarDemo.this, "未获取到位置", Toast.LENGTH_LONG).show();
return;
}
RadarUploadInfo info = new RadarUploadInfo();
info.comments = userComment;
info.pt = pt;
RadarSearchManager.getInstance().uploadInfoRequest(info);
clearInfoBtn.setEnabled(true);
}
/**
* 开始自动上传
*
* @param v
*/
public void uploadContinueClick(View v) {
if (pt == null) {
Toast.makeText(RadarDemo.this, "未获取到位置", Toast.LENGTH_LONG).show();
return;
}
uploadAuto = true;
RadarSearchManager.getInstance().startUploadAuto(this, 5000);
uploadContinue.setEnabled(false);
stopUpload.setEnabled(true);
clearInfoBtn.setEnabled(true);
}
/**
* 停止自动上传
*
* @param v
*/
public void stopUploadClick(View v) {
uploadAuto = false;
RadarSearchManager.getInstance().stopUploadAuto();
stopUpload.setEnabled(false);
uploadContinue.setEnabled(true);
}
/**
* 清除自己当前的信息
*
* @param v
*/
public void clearInfoClick(View v) {
RadarSearchManager.getInstance().clearUserInfo();
}
/**
* 查找周边的人
*
* @param v
*/
public void searchNearby(View v) {
if (pt == null) {
Toast.makeText(RadarDemo.this, "未获取到位置", Toast.LENGTH_LONG)
.show();
return;
}
pageIndex = 0;
searchRequest(pageIndex);
}
/**
* 上一页
*
* @param v
*/
public void preClick(View v) {
if (pageIndex < 1) {
return;
}
// 上一页
pageIndex--;
searchRequest(pageIndex);
}
/**
* 下一页
*
* @param v
*/
public void nextClick(View v) {
if (pageIndex >= totalPage - 1) {
return;
}
// 下一页
pageIndex++;
searchRequest(pageIndex);
}
private void searchRequest(int index) {
curPage = 0;
totalPage = 0;
RadarNearbySearchOption option = new RadarNearbySearchOption()
.centerPt(pt).pageNum(pageIndex).radius(2000).pageCapacity(11);
RadarSearchManager.getInstance().nearbyInfoRequest(option);
listPreBtn.setVisibility(View.INVISIBLE);
listNextBtn.setVisibility(View.INVISIBLE);
mapPreBtn.setVisibility(View.INVISIBLE);
mapNextBtn.setVisibility(View.INVISIBLE);
listCurPage.setText("0/0");
mapCurPage.setText("0/0");
mBaiduMap.hideInfoWindow();
}
/**
* 清除查找结果
*
* @param v
*/
public void clearResult(View v) {
parseResultToList(null);
parseResultToMap(null);
clearRstBtn.setEnabled(false);
listPreBtn.setVisibility(View.INVISIBLE);
listNextBtn.setVisibility(View.INVISIBLE);
mapPreBtn.setVisibility(View.INVISIBLE);
mapNextBtn.setVisibility(View.INVISIBLE);
listCurPage.setVisibility(View.INVISIBLE);
mapCurPage.setVisibility(View.INVISIBLE);
mBaiduMap.hideInfoWindow();
}
// viewPager切换
public void switchClick(View v) {
if (index == 0) {
// 切换为地图
index = 1;
switchBtn.setText("列表");
} else {
// 切换为列表
index = 0;
switchBtn.setText("地图");
}
mPager.setCurrentItem(index);
}
/**
* 更新结果列表
*
* @param res
*/
public void parseResultToList(RadarNearbyResult res) {
if (res == null) {
if (mResultListAdapter.list != null) {
mResultListAdapter.list.clear();
mResultListAdapter.notifyDataSetChanged();
}
} else {
mResultListAdapter.list = res.infoList;
mResultListAdapter.notifyDataSetChanged();
if (curPage > 0) {
listPreBtn.setVisibility(View.VISIBLE);
}
if (totalPage - 1 > curPage) {
listNextBtn.setVisibility(View.VISIBLE);
}
if (totalPage > 0) {
listCurPage.setVisibility(View.VISIBLE);
listCurPage.setText(String.valueOf(curPage + 1) + "/" + String.valueOf(totalPage));
}
}
}
/**
* 更新结果地图
*
* @param res
*/
public void parseResultToMap(RadarNearbyResult res) {
mBaiduMap.clear();
if (res != null && res.infoList != null && res.infoList.size() > 0) {
for (int i = 0; i < res.infoList.size(); i++) {
MarkerOptions option = new MarkerOptions().icon(ff3).position(res.infoList.get(i).pt);
Bundle des = new Bundle();
if (res.infoList.get(i).comments == null || res.infoList.get(i).comments.equals("")) {
des.putString("des", "没有备注");
} else {
des.putString("des", res.infoList.get(i).comments);
}
option.extraInfo(des);
mBaiduMap.addOverlay(option);
}
}
if (curPage > 0) {
mapPreBtn.setVisibility(View.VISIBLE);
}
if (totalPage - 1 > curPage) {
mapNextBtn.setVisibility(View.VISIBLE);
}
if (totalPage > 0) {
mapCurPage.setVisibility(View.VISIBLE);
mapCurPage.setText(String.valueOf(curPage + 1) + "/" + String.valueOf(totalPage));
}
}
/**
* 实现上传callback,自动上传
*/
@Override
public RadarUploadInfo onUploadInfoCallback() {
// TODO Auto-generated method stub
RadarUploadInfo info = new RadarUploadInfo();
info.comments = userComment;
info.pt = pt;
Log.e("hjtest", "OnUploadInfoCallback");
return info;
}
@Override
public void onGetNearbyInfoList(RadarNearbyResult result,
RadarSearchError error) {
// TODO Auto-generated method stub
if (error == RadarSearchError.RADAR_NO_ERROR) {
Toast.makeText(RadarDemo.this, "查询周边成功", Toast.LENGTH_LONG)
.show();
// 获取成功
listResult = result;
curPage = result.pageIndex;
totalPage = result.pageNum;
// 处理数据
parseResultToList(listResult);
parseResultToMap(listResult);
clearRstBtn.setEnabled(true);
} else {
// 获取失败
curPage = 0;
totalPage = 0;
Toast.makeText(RadarDemo.this, "查询周边失败", Toast.LENGTH_LONG)
.show();
}
}
@Override
public void onGetUploadState(RadarSearchError error) {
// TODO Auto-generated method stub
if (error == RadarSearchError.RADAR_NO_ERROR) {
// 上传成功
if (!uploadAuto) {
Toast.makeText(RadarDemo.this, "单次上传位置成功", Toast.LENGTH_LONG)
.show();
}
} else {
// 上传失败
if (!uploadAuto) {
Toast.makeText(RadarDemo.this, "单次上传位置失败", Toast.LENGTH_LONG)
.show();
}
}
}
@Override
public void onGetClearInfoState(RadarSearchError error) {
// TODO Auto-generated method stub
if (error == RadarSearchError.RADAR_NO_ERROR) {
// 清除成功
Toast.makeText(RadarDemo.this, "清除位置成功", Toast.LENGTH_LONG)
.show();
} else {
// 清除失败
Toast.makeText(RadarDemo.this, "清除位置失败", Toast.LENGTH_LONG)
.show();
}
}
@Override
public void onMapClick(LatLng point) {
// TODO Auto-generated method stub
mBaiduMap.hideInfoWindow();
}
@Override
public boolean onMapPoiClick(MapPoi poi) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onMarkerClick(Marker marker) {
// TODO Auto-generated method stub
mBaiduMap.hideInfoWindow();
if (marker != null) {
popupText = new TextView(RadarDemo.this);
popupText.setBackgroundResource(R.drawable.popup);
popupText.setTextColor(0xFF000000);
popupText.setText(marker.getExtraInfo().getString("des"));
mBaiduMap.showInfoWindow(new InfoWindow(popupText, marker.getPosition(), -47));
MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(marker.getPosition());
mBaiduMap.setMapStatus(update);
return true;
} else {
return false;
}
}
@Override
protected void onPause() {
mMapView.onPause();
super.onPause();
}
@Override
protected void onResume() {
mMapView.onResume();
super.onResume();
mTabHost.getTabWidget().getChildAt(0).setBackgroundColor(Color.parseColor("#B0E2FF"));
}
@Override
protected void onDestroy() {
// 退出时销毁定位
mLocClient.stop();
// 释放周边雷达相关
RadarSearchManager.getInstance().removeNearbyInfoListener(this);
RadarSearchManager.getInstance().clearUserInfo();
RadarSearchManager.getInstance().destroy();
// 释放地图
ff3.recycle();
mMapView.onDestroy();
mBaiduMap = null;
super.onDestroy();
}
// 定位SDK回调
@Override
public void onReceiveLocation(BDLocation arg0) {
// TODO Auto-generated method stub
if (arg0 == null || mBaiduMap == null) {
return;
}
pt = new LatLng(arg0.getLatitude(), arg0.getLongitude());
MyLocationData locData = new MyLocationData.Builder()
.accuracy(arg0.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(100).latitude(arg0.getLatitude())
.longitude(arg0.getLongitude()).build();
if (mBaiduMap != null) {
mBaiduMap.setMyLocationData(locData);
}
}
public class MyOnPageChangeListener implements OnPageChangeListener {
@Override
public void onPageSelected(int arg0) {
if (arg0 == 0) {
// 切换为列表
index = 0;
switchBtn.setText("地图");
} else {
// 切换为地图
index = 1;
switchBtn.setText("列表");
}
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
}
/**
* ViewPager适配器
*/
public class MyPagerAdapter extends PagerAdapter {
public List<View> mListViews;
public MyPagerAdapter(List<View> mListViews) {
this.mListViews = mListViews;
}
@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
((ViewPager) arg0).removeView(mListViews.get(arg1));
}
@Override
public void finishUpdate(View arg0) {
}
@Override
public int getCount() {
return mListViews.size();
}
@Override
public Object instantiateItem(View arg0, int arg1) {
((ViewPager) arg0).addView(mListViews.get(arg1), 0);
return mListViews.get(arg1);
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == (arg1);
}
@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void startUpdate(View arg0) {
}
}
/**
* 结果列表listview适配器
*/
private class RadarResultListAdapter extends BaseAdapter {
public List<RadarNearbyInfo> list;
public RadarResultListAdapter(List<RadarNearbyInfo> res) {
super();
this.list = res;
}
@Override
public View getView(int index, View convertView, ViewGroup parent) {
convertView = View.inflate(RadarDemo.this,
R.layout.demo_info_item, null);
TextView title = (TextView) convertView.findViewById(R.id.title);
TextView desc = (TextView) convertView.findViewById(R.id.desc);
title.setTextColor(Color.parseColor("#0000FF"));
desc.setTextColor(Color.parseColor("#0000FF"));
if (list == null || list.size() == 0 || index >= list.size()) {
desc.setText("");
title.setText("");
} else {
if (list.get(index).comments == null || list.get(index).comments.equals("")) {
desc.setText(String.valueOf(list.get(index).distance) + "米" + "_没有备注");
} else {
desc.setText(String.valueOf(list.get(index).distance) + "米" + "_" + list.get(index).comments);
}
title.setText(list.get(index).userID);
}
return convertView;
}
@Override
public int getCount() {
if (list == null || (list != null && list.size() < 10)) {
return 10;
} else {
return list.size();
}
}
@Override
public Object getItem(int index) {
if (list == null) {
return new RadarNearbyInfo();
} else {
return list.get(index);
}
}
@Override
public long getItemId(int id) {
return id;
}
}
public View composeLayout(String s, int i) {
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
ImageView iv = new ImageView(this);
iv.setImageResource(i);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
lp.setMargins(0, 5, 0, 0);
// layout.addView(iv, lp);
TextView tv = new TextView(this);
tv.setGravity(Gravity.CENTER);
tv.setSingleLine(true);
tv.setText(s);
tv.setTextColor(Color.parseColor("#0000FF"));
tv.setTextSize(20);
layout.addView(tv, new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.FILL_PARENT));
return layout;
}
}