【问题标题】:Turning a view into a drawable as a map overlay item将视图转换为可绘制作为地图叠加项
【发布时间】:2012-07-25 17:48:22
【问题描述】:

我有一个可以正常工作并已设置的 MapView,正在绘制的覆盖项目(当简单地引用为可绘制对象时)工作得很好。但是,每个可绘制项都需要在其上包含一个数值(例如,叠加项 1,需要在其上显示 #1)。我创建了布局样式 R.layout.map_bubble_standard。我正在尝试将该视图转换为位图,并将该位图转换为要在地图上显示的可绘制对象。但是,当地图加载时,什么都没有显示。这就是我正在做的事情......

        LayoutInflater inflater = (LayoutInflater) _context.getSystemService(     Context.LAYOUT_INFLATER_SERVICE );
        LinearLayout bubbleView = (LinearLayout)inflater.inflate(R.layout.map_bubble_standard, null);

        bubbleView.setDrawingCacheEnabled(true);
        bubbleView.buildDrawingCache();

        //drawable = _context.getResources().getDrawable(R.drawable.map_pin_48);
        drawable = new BitmapDrawable(_context.getResources(), bubbleView.getDrawingCache());
        bubbleView.setDrawingCacheEnabled(false);

    OverlayItem oi = _overlays.get(whichOne); 
    oi.setMarker(boundCenterBottom(drawable));

我的代码很好地完成了该方法,但地图上没有绘制任何内容。谁能帮助确定我做错了什么?

[编辑] - 已解决

我使用了我找到的另一个链接,该链接提供了解决此问题的建议: Here

希望这也可以在未来帮助其他人。作为参考,我还将视图的充气机和充气机对象本身移到了逐项叠加类的默认构造函数中。

_bubbleLayout.setDrawingCacheEnabled(true);

        _bubbleLayout.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
                    MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
        _bubbleLayout.layout(0, 0, _bubbleLayout.getMeasuredWidth(), _bubbleLayout.getMeasuredHeight()); 

        _bubbleLayout.buildDrawingCache(true);
        Bitmap b = Bitmap.createBitmap(_bubbleLayout.getDrawingCache());
        _bubbleLayout.setDrawingCacheEnabled(false); // clear drawing cache 

        //drawable = _context.getResources().getDrawable(R.drawable.map_pin_48);
        drawable = (Drawable) new BitmapDrawable(_context.getResources(),b);



    OverlayItem oi = _overlays.get(whichOne); 
    oi.setMarker(boundCenterBottom(drawable));

【问题讨论】:

    标签: android bitmap android-mapview drawable


    【解决方案1】:

    不确定这是否正确,但根据documentation

    要从缓存中受益,您必须通过调用 getDrawingCache() 请求绘图缓存,如果返回的位图不为空,则将其绘制到屏幕上。

    对我来说,这意味着您必须在屏幕上绘制一次View,然后才能得到任何东西。如果它从未被实际绘制过,那么它就没有缓存可供提取。您是先在屏幕上显示它吗?

    【讨论】:

    • 目前没有,我可以将它添加到地图视图布局中并将其隐藏在屏幕下方,然后从那里使用绘图缓存吗?
    • @RyanInBinary 那么为什么不将视图本身添加到您想要的坐标中的 MapView 中呢?什么需要使它成为位图?你想制造泡泡吗?如果是这样,我建议放弃位图的想法并使用:github.com/jgilfelt/android-mapviewballoons 它非常易于使用,并且有很多示例/SO 帖子回答了有关它的问题...
    • 我已经有叠加气泡,我正在考虑让实际的地图图钉对象在地图上绘制(在点击之前)比它们... XML 布局。这个库在以自定义方式创建弹出气泡方面做得很好(我已经在这样做了)......我需要初始引脚更专业一些。
    • 嗯,这很公平。我猜这些太复杂了,以至于你的文件夹中只有三个或四个可绘制对象(即不仅仅是一个蓝色、红色和绿色标记)。好吧,既然 MapView 扩展了 ViewGroup,我的猜测是你可以跳过可绘制对象并使用 MapView#addView() 函数并使用 MapView.LayoutParams ,它需要一个 GeoPoint 在地图上放置标记。不过,维护它们可能需要一些工作。 developers.google.com/maps/documentation/android/reference/com/…
    • 看起来你也可以在屏幕外生成它:stackoverflow.com/a/4858154/960048
    猜你喜欢
    • 2011-07-18
    • 2012-05-30
    • 2012-10-14
    • 2012-02-01
    • 2014-05-31
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    相关资源
    最近更新 更多