首页 文章

如何在 Map 上创建信息泡泡(不是谷歌API)

提问于
浏览
0

在我的Android应用程序中,我有一个自定义视图,其功能类似于 Map . 当用户触摸特定位置时,我希望能够在某种信息泡泡中显示更多信息 . 这与谷歌 Map api的工作方式非常相似,但我不想使用他们的api .

到目前为止,我已经尝试将圆角矩形直接绘制到画布上,并在指定位置的顶部绘制文本 . 但这有很多缺点:

1)我不知道如何计算矩形相对于文本的长度和大小应该有多大 .

2)绘制一个矩形不会留下视图的强大空间(内置onTouch事件,并且可以轻松自定义视图)

我也尝试使用视图(按钮)来显示信息,但没有成功 . 据我所知,我无法指定视图应显示的位置(因为信息气泡需要根据 Map 滚动的位置移动) .

总之,我需要两种方法中的最佳方法,其中图像应根据显示的文本量轻松调整大小,并且信息气泡应该能够根据滚动的位置在屏幕上移动 .

有没有人对如何在不使用谷歌 Map API的情况下创建这样的信息泡泡的最佳方法有任何建议?

2 回答

  • 0

    我绝不是100%确定我提出的方法是正确的方法,但这就是我如何处理这个问题:

    在计算文本大小之前,首先需要计算文本的大小,为此,请使用以下方法,前提是您已创建了用于绘制文本的Paint对象 .

    //This will give you the width of the text
    textPaint.measureText("Text to render")
    
    //This will give you the height of the text
    textPaint.getFontSpacing()
    

    在绘制 Map 和信息泡沫方面,我就是这样做的:

    您的整个 Map 图像将成为您的基本框,视图中的部分将成为您的视图框 . 因此,如果用户平移并放大 Map ,基本上发生的情况是您使用我们的视图框仅显示 Map 的一部分 . 根据视图框计算绘制气泡的位置非常棘手,但如果相对于基本框进行绘制,则变得非常容易 . 基本上,您将绘制整个 Map ,包括气泡,并将其裁剪为仅在视图中的部分 .

    这纯粹是我如何去做,但我认为实施起来并不是很难 . 您需要做的就是跟踪您的视图框从基本框的左上角偏移了多少,并且您可以非常轻松地获取与需要种植气泡的基本框相关的位置 .

    如果我没有很好地解释这一点,请告诉我 .

    最好,

    Ignus

  • 1

    一种方法是通过扩展布局来创建气球 - 例如LinearLayout并覆盖dispathDraw()以实际绘制气球 . 然后,您可以从布局xml配置和使用Ballon,并为内容添加textView . 例如:

    <mycustom.PopUpBalloon
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/transparent_panel"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:padding="5px">
        <RelativeLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            >
            <TextView
                android:id="@+id/title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:text="default"
                android:textColor="#ffffffff"
                android:textStyle="bold"
                />
    
        </RelativeLayout>
    </mycustom.PopUpBalloon>
    

    从您的活动中,您可以加载弹出窗口:

    mPopUp = (PopUpBalloon) layoutInflater.inflate(R.layout.popup, null);
    

    然后更改活动中的文本:

    // Remove any previous Popups from the holding View  
     mView.removeView(mPopUp);
     mPopUp.setVisibility(View.VISIBLE);
     ((TextView) mPopUp.findViewById(R.id.title)).setText("Hello World");
    

    您还可以将ClickViews或其他任何内容添加到气球中以获取clickListeners等...

相关问题