Codejie's C++ Space

Using C++

Android DEV : Show a window on Baidu Map

 

    周末同学说想弄个基于Baidu地图的应用, 于是就开始研究这个SDK来. 其中应用有个需求, 需要点击地图上的标记时, 显示一组按钮. 于是按照常规的作法失业了InfoWindow, 如下.

    //panel is a view, some buttons in it.
    final InfoWindow iw = new InfoWindow(panel, marker.getPosition(), null);
    //getMap() return BaiduMap
    activity.getMap().showInfoWindow(iw);
 

 

    倒是不难, 但处理点击事件时发现有问题了. 根据文档, 此时显示出来的InfoWindow实际是View的Bitmap图片, 也就意味着根本没法区分View上的Buttons了, 更别说能处理Button的点击事件了. 怪不得, 文档中对于整个InfoWindow只有一个ClickListener, 还不含有View信息.

    这样只能"曲线救国"了, InfoWindow不能用, 那就直接在MapView中弹出个PopupWindow吧. (顺手敲打测试代码, 就记录用)

 

    final View panel = UserPanel.make(activity);
    Point p = activity.getMap().getProjection().toScreenLocation(marker.getPosition());

    final PopupWindow pw = new PopupWindow(panel);
    pw.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
    pw.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
    pw.setFocusable(true);
    pw.setOutsideTouchable(true);
    //getMapView() return MapView, not BaiduMap any more
    pw.showAtLocation(activity.getMapView(), Gravity.LEFT | Gravity.BOTTOM,p.x, p.y );

    final Button btn = (Button) panel.findViewById(R.id.button2);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            pw.dismiss();
        }
    });

 

    搞定,人长个脑袋总是有用的...

 

    测试中发现个问题, 如果地图发生放缩, Window弹出的位置会不准确, 很是奇怪, 按理MapView发生变化时, 其Projection应该能够实时跟随变化的, 这个问题回头需要再看看.

    <---- 回过头的分割线 ---->
    位置不准确的问题是由于View和Screen坐标系不同, 以及MapView自身size共同影响的, 错怪了Projection了..

posted on 2014-06-18 20:22 codejie 阅读(2387) 评论(0)  编辑 收藏 引用 所属分类: G7


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


公告

Using C++

导航

统计

留言簿(73)

随笔分类(513)

积分与排名

最新评论

阅读排行榜

评论排行榜