百度地图4.1_1开发教程(6)点收藏(1)

在本章教程中,将一起学习长按地图收藏该点,这本章中,将设计到的内容有
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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值