Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在地图上创建信息气泡(不是谷歌api)_Java_Android_Maps - Fatal编程技术网

Java 如何在地图上创建信息气泡(不是谷歌api)

Java 如何在地图上创建信息气泡(不是谷歌api),java,android,maps,Java,Android,Maps,在我的android应用程序中,我有一个自定义视图,其功能类似于地图。当用户触摸特定位置时,我希望能够以一种信息气泡的形式显示更多信息。这与GoogleMapsAPI的工作原理非常相似,但我不想使用他们的api 到目前为止,我已经尝试直接在画布上绘制一个圆角矩形,并在指定位置在顶部绘制文本。但这有相当大的缺点: 1) 我不知道如何计算矩形相对于文本的长度和大小应该有多大 2) 绘制一个矩形没有为视图的强大留下空间(内置onTouch事件,并为轻松自定义视图留出空间) 我也尝试过使用视图(按钮)来

在我的android应用程序中,我有一个自定义视图,其功能类似于地图。当用户触摸特定位置时,我希望能够以一种信息气泡的形式显示更多信息。这与GoogleMapsAPI的工作原理非常相似,但我不想使用他们的api

到目前为止,我已经尝试直接在画布上绘制一个圆角矩形,并在指定位置在顶部绘制文本。但这有相当大的缺点:

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

2) 绘制一个矩形没有为视图的强大留下空间(内置onTouch事件,并为轻松自定义视图留出空间)

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

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


有人对不使用google maps api创建这样的信息泡沫的最佳方法有什么建议吗?

我绝对不能100%肯定我提出的方法是正确的,但我会这样解决这个问题:

在计算文本将位于的框的大小之前,首先需要计算文本的大小。若要执行此操作,请使用以下方法,前提是已创建用于绘制文本的绘制对象

//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()
在绘制地图和信息泡沫方面,我会这样做:

整个地图图像将成为基本框,视图中的部分将成为视图框。因此,如果用户在地图上平移和缩放,基本上就是使用我们的视图框仅显示地图的一部分。根据视图框,确定在何处绘制气泡是非常棘手的,但是如果将其设置为相对于基础框,则非常容易。基本上,您将绘制整个地图,包括气泡,并仅将其裁剪到视图中的部分

这纯粹是我将如何进行的,但我认为实施起来并不困难。您只需跟踪视图框与基础框左上角的偏移量,就可以很容易地找到需要放置气泡的位置

如果我没有解释清楚,请告诉我

最好的


Ignus

一种方法是通过扩展布局来创建引出序号-例如LinearLayout,并覆盖dispathDraw()以实际绘制引出序号。然后可以从布局xml配置和使用气球,并为内容添加文本视图。例如:

<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>
然后,要更改活动中的文本,请执行以下操作:

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

您还可以为clickListeners等将ImageView或其他内容添加到气球中。

如果我能够在滚动地图时将PopupBallon视图移动到特定的x-y位置,这将是理想的解决方案。有什么想法吗?@james在不知道所有细节的情况下,当你将弹出窗口添加到父视图(map?)时,你基本上可以将其固定到一个特定的位置。类似这样的东西:map.addView(popup,Layoutparams),其中Layoutparams将指定放置弹出窗口的位置。感谢您的帮助。我应该解释一下,显示地图的视图实际上并没有移动,它只是在画布上绘制了一个偏移图像。谢谢,您的解决方案很有效。下面是我用来绘制图像的代码,该图像根据一些文本调整大小:int padding=10;bmpLength=textPaint.measureText((字符串)this.getText());bmpHeight=textPaint.getFontSpacing();drawBitmap(mImage,null,new Rect(x,y,(int)(x+bmpLength+(padding*4)),(int)(y+bmpHeight+2*padding)),mpain);drawText((字符串)this.getText(),x+(padding*2),(float)(y+(bmpHeight/2)+1.5*padding),textPaint);
 // Remove any previous Popups from the holding View  
 mView.removeView(mPopUp);
 mPopUp.setVisibility(View.VISIBLE);
 ((TextView) mPopUp.findViewById(R.id.title)).setText("Hello World");