在我的Android应用程序中,我有一个自定义视图,其功能类似于地图。当用户触摸特定位置时,我希望能够在某种信息泡泡中显示更多信息。这与谷歌地图api的工作方式非常相似,但我不想使用他们的api。
到目前为止,我已尝试将圆角矩形直接绘制到画布上,并在指定位置的顶部绘制文本。但这有很多缺点:
1)我不知道如何计算矩形相对于文本长度和大小的大小。
2)绘制一个矩形不会留下任何视野的空间(内置onTouch事件,并且可以轻松自定义视图)
我也尝试使用视图(按钮)来显示信息,但没有成功。据我所知,我无法指定视图应显示的位置(因为信息气泡需要根据地图的滚动位置移动)。
总之,我需要两种方法中的最佳方法,其中图像应根据显示的文本量轻松调整大小,并且信息气泡应该能够根据滚动的位置在屏幕上移动。
有没有人建议在不使用谷歌地图API的情况下创建这样的信息泡泡的最佳方法是什么?
答案 0 :(得分: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");
你也可以为气球添加ImageViews或其他任何东西以获得clickListeners等......
答案 1 :(得分: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()
在绘制地图和信息泡沫方面,我就是这样做的:
您的整个地图图片将成为您的基本框,视图中的部分将成为您的视图框。因此,如果用户平移并放大地图,基本上发生的情况是您使用我们的视图框仅显示地图的一部分。根据视图框计算绘制气泡的位置非常棘手,但如果相对于基本框进行绘制,则变得非常容易。基本上,您将绘制整个地图,包括气泡,并将其裁剪为仅在视图中的部分。
这纯粹是我如何去做,但我认为实施起来并不是很难。您需要做的就是跟踪视图框从基本框的左上角偏移了多少,并且您可以非常轻松地获取与基本框相关的位置需要种植的气泡。
如果我没有很好地解释这一点,请告诉我。
最佳,
Ignus