在本章教程中,将一起学习长按地图收藏该点,这本章中,将设计到的内容有
1.长按时间
2.生成marker
3.地理编码搜索(用地址检索坐标)、反地理编码搜索(用坐标检索地址)
4.收藏点
5.删除点等操作
先上效果图
长按地图,生成地图的点,地理编码搜索得到地标名,点击底部的收藏,将对应的点收藏。
做好了,我们开车咯!
首先看一下布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.kowalski.MainActivity">
<com.baidu.mapapi.map.MapView
android:id="@+id/activity_main_mv_map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"/>
<!-- 收藏界面 -->
<LinearLayout
android:id="@+id/activity_main_favo_ll_favo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:animateLayoutChanges="true"
android:clickable="true"
android:focusable="true"
android:background="@android:color/white"
android:focusableInTouchMode="true"
android:orientation="vertical"
android:padding="10dp"
android:visibility="gone">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:text="地标名:"
android:textSize="18sp"/>
<EditText
android:id="@+id/activity_main_favo_et_address"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_vertical"
android:textColor="@android:color/secondary_text_dark_nodisable"
android:textSize="18sp"/>
</LinearLayout>
<TextView
android:id="@+id/activity_main_favo_tv_latlng"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:lineSpacingMultiplier="1.3"
android:text="经度:\n纬度:"
android:textSize="18sp"/>
<TextView
android:id="@+id/activity_main_favo_tv_favorite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="20dp"
android:gravity="center"
android:padding="10dp"
android:text="收藏"/>
</LinearLayout>
<Button
android:id="@+id/activity_main_favo_bt_favoList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="收藏列表"/>
</RelativeLayout>
收藏界面是隐藏的,仅当点击收藏点的时候才会显示出来。下面重点看类:
声明,都加了注释,后面代码看不懂可以翻到这里查看
private MapView mv_map;
private BaiduMap mBaiduMap;
private LinearLayout ll_favo; // 收藏Layout
GeoCoder mSearch = null; // 搜索模块,也可去掉地图模块独立使用
private Marker mFavoMarker; // 收藏的点
private LatLng mFavoLatlng; // 收藏点的经纬度
private InfoWindow mInfoWindow;
private EditText et_address; // 收藏点的做表明
private TextView tv_latlng, tv_favorite; // 收藏点的经纬度
private Button bt_favoList; // 跳转收藏列表的按钮
private BitmapDescriptor mFavoIcon; // 生成marker的点的图片
private Activity activity = MainActivity.this;
别忘了SDKInitializer.initialize(getApplicationContext());
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
initWidget();
}
/**
* 初始化控件
*/
private void initWidget()
{
mv_map = (MapView) findViewById(R.id.activity_main_mv_map);
ll_favo = (LinearLayout)findViewById(R.id.activity_main_favo_ll_favo);
et_address = (EditText)findViewById(R.id.activity_main_favo_et_address);
tv_latlng = (TextView)findViewById(R.id.activity_main_favo_tv_latlng);
tv_favorite = (TextView)findViewById(R.id.activity_main_favo_tv_favorite);
tv_favorite.setOnClickListener(this);
bt_favoList = (Button)findViewById(R.id.activity_main_favo_bt_favoList);
bt_favoList.setOnClickListener(this);
mBaiduMap = mv_map.getMap(); // 通过控件获取地图对象
mv_map.setLogoPosition(LogoPosition.logoPostionRightTop); // 设置Logo方位
mBaiduMap.setViewPadding(0, 20, 20, 0); // LOGO边距
mSearch = GeoCoder.newInstance();// 初始化搜索模块,注册事件监听
mSearch.setOnGetGeoCodeResultListener(this);
mBaiduMap.setOnMapLongClickListener(this);
mBaiduMap.setOnMarkerClickListener(this);
FavoriteManager.getInstance().init(); // 初始化收藏夹
}
首先初始化控件,在Activity中,实现了
implements View.OnClickListener, BaiduMap.OnMarkerClickListener, BaiduMap.OnMapLongClickListener,OnGetGeoCoderResultListener
这些方法。
/**
* 地图长按事件
*/
@Override
public void onMapLongClick(LatLng latLng)
{
if (mFavoMarker != null)
{
mFavoMarker.remove();
}
mFavoIcon = BitmapDescriptorFactory
.fromResource(R.mipmap.ic_pin);
MarkerOptions mFavoOptions = new MarkerOptions()
.position(latLng) //设置marker的位置
.icon(mFavoIcon) //设置marker图标
.zIndex(1) //设置marker所在层级
.draggable(true); //设置手势拖拽
Bundle b = new Bundle();
b.putString("favo", "favo");
mFavoOptions.extraInfo(b);
// 将marker添加到地图上
mFavoMarker = (Marker) (mBaiduMap.addOverlay(mFavoOptions));
}
在地图长按事件中,我们先判断marker点是否存在,如果存在,则删掉它,以我们当前长按的点为新的收藏点.
/**
* marker点击事件
*/
@Override
public boolean onMarkerClick(Marker marker)
{
TextView tv = new TextView(getApplicationContext());
tv.setBackgroundResource(R.mipmap.location_tips);
tv.setPadding(80, 30, 80, 80);
tv.setTextColor(getResources().getColor(android.R.color.white));
InfoWindow.OnInfoWindowClickListener listener = null;
if (marker == null)
{
return false;
} else if (marker.getExtraInfo().get("favo") != null)
{
tv.setText("移除");
tv.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
mFavoMarker.remove();
mFavoMarker = null;
mBaiduMap.hideInfoWindow();
ll_favo.setVisibility(View.GONE);
}
});
// 反Geo搜索,根据经纬度获取地标名
mFavoLatlng = new LatLng(marker.getPosition().latitude, marker.getPosition().longitude);
mSearch.reverseGeoCode(new ReverseGeoCodeOption().location(mFavoLatlng));
mInfoWindow = new InfoWindow(tv, marker.getPosition(), -50);
tv_latlng.setText("经度:" + marker.getPosition().longitude + "\n" + "纬度:" + marker.getPosition().latitude);
// 设置详细信息到布局
ll_favo.setVisibility(View.VISIBLE); // 显示详情布局
mBaiduMap.showInfoWindow(mInfoWindow); // 显示弹窗
return true;
}
return false;
}
在这段代码中,用到了我博客之前的一些知识点,marker的弹窗事件,这里就不复述了,这些是很基础的东西,一定要会用。在点击marker以后,我们使用反Geo搜索,并根据当前的marker对应的经纬度,获取当前地标名。在完成获取以后,将经纬度显示到布局上并将布局显示出来。具体获取地标名的实现请看以下代码。
/**
* 根据经纬度获取地名
*/
@Override
public void onGetGeoCodeResult(GeoCodeResult geoCodeResult)
{}
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result)
{
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR)
{
Toast.makeText(activity, "抱歉,未能找到地标名,请手动输入", Toast.LENGTH_SHORT);
return;
}
et_address.setText(result.getAddress());
}
这里实现了两个方法,因为我项目没用到第一个方法,没实际用过也不敢误人子弟,如果想了解更详细请上官网文档查看,这里我们只看第二个方法。
在这个方法中,result就是回调回来的地标名,做一个简单的判断后,将获取到的坐标显示在输入框中。在实际开发中,这里应该加入一个进度条等待获取成功,否则会给用户带来很差的体验。接下来,就应该将这个点收藏起来了。
/**
* 单击事件
*/
@Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.activity_main_favo_tv_favorite:
FavoritePoiInfo info = new FavoritePoiInfo();
info.poiName(et_address.getText().toString().trim());// 获取地标名
LatLng pt = new LatLng(mFavoLatlng.latitude, mFavoLatlng.longitude);
info.pt(pt);
if (FavoriteManager.getInstance().add(info) == 1)
{
Toast.makeText(activity,"收藏成功,您可打开我的收藏查看。", Toast.LENGTH_SHORT);
et_address.setText("");
tv_latlng.setText("");
mBaiduMap.hideInfoWindow();
if (mFavoMarker != null)
{
mFavoMarker.remove();
}
} else
{
Toast.makeText(activity,"添加失败,请检查做表明是否重复." , Toast.LENGTH_SHORT);
}
ll_favo.setVisibility(View.GONE);
break;
case R.id.activity_main_favo_bt_favoList:
List<FavoritePoiInfo> list= FavoriteManager.getInstance().getAllFavPois();
for (int i = 0; i < list.size(); i++)
{
Log.w("ddd", list.get(i).getPoiName());
}
break;
}
}
FavoritePoiInfo这个类是API给我们用的,这里我们将获取到的地标名作为poiName,将经纬度传入,
再调用 FavoriteManager.getInstance().add(info)就可以添加了,注意看它返回的是int类型,根据文档判断当前返回值为1,就是保存成功了。这里做一个判断,就添加成功了。
注意一下,我在写博客的Demo的时候,保存成功或失败,Toast并不会弹出,由于时间紧迫,暂时忽略掉这些细节,如果能帮我找出问题,感激不尽,谢谢
如何查看添加了那些收藏的点呢。
我们写一个循环将点打印出来查看一下就知道了。暂时将收藏列表的点击时间加入以下代码:
List<FavoritePoiInfo> list= FavoriteManager.getInstance().getAllFavPois();
for (int i = 0; i < list.size(); i++)
{
Log.w("ddd", list.get(i).getPoiName());
}
如果没有问题的话,打印出来的是以下格式:
11-27 12:11:57.411 4515-4515/com.kowalski W/ddd: 北京市海淀区大慧寺路20号
11-27 12:11:57.411 4515-4515/com.kowalski W/ddd: 北京市西城区老墙根街14号
11-27 12:11:57.411 4515-4515/com.kowalski W/ddd: 北京市通州区G4501(北京六环高速)
11-27 12:11:57.411 4515-4515/com.kowalski W/ddd: 北京市丰台区马家堡路
11-27 12:11:57.411 4515-4515/com.kowalski W/ddd: 北京市东城区马家堡路1号-1001室
11-27 12:11:57.411 4515-4515/com.kowalski W/ddd: 北京市西城区长椿街45号
ok,得知收藏成功以后,我们就要实现对收藏点的删除,跳转地图的操作了。
博客写太长,看着累,我自己也累,所以我将在下一篇博客中继续介绍使用,谢谢大家。
Demo地址:
http://download.csdn.net/detail/u012552275/9694853