2011-01-26 12 views
0

私のアンドロイドアプリケーションでは、マップのように機能するカスタムビューがあります。ユーザーが特定の場所に触れると、一種の情報バブルでより多くの情報を表示できるようにしたいと考えています。これは、Googleマップのapiの仕組みと非常によく似ていますが、APIを使用したくありません。マップ(GoogleのAPIではなく)に情報バブルを作成する方法

これまでのところ、キャンバスに直接丸みのある四角形を描画し、指定した位置の上にテキストを描画しようとしました。しかし、これにはかなりの欠点があります:

1)テキストの長さと大きさに対する矩形の大きさを計算する方法はわかりません。

2)四角形を描画するonTouchイベントが組み込まれて(ビューのパワーのための余地を残さない、と簡単にビューをカスタマイズする余地)

私はまた、情報を表示するビュー(ボタン)を使用して試してみました成功しなかった。私が知る限り、ビューを表示する座標を指定することはできません(情報のバブルはマップのスクロール位置に従って移動する必要があるため)。

要約すると、表示されるテキストの量に応じてイメージのサイズを簡単に変更する必要があり、マップがスクロールされる場所に応じて情報バブルが画面上を移動できるようにする必要があります。

GoogleマップのAPIを使用せずに、このような情報のバブルを作成するのに最適な方法は何ですか?

答えて

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() 

、これは私がそれを行うだろうかです:

あなたの全体マップイメージは、あなたのベースボックスになり、ビューにある部分は、あなたのビューになりますボックス。したがって、ユーザーが地図をパ​​ンしたりズームしたりする場合、基本的にはビューボックスを使用して地図の一部のみを表示していることです。ビューボックスの観点からバブルを描く場所を考えるのは非常に難しいですが、ベースボックスを基準にすると非常に簡単になります。本質的には、バブルを含む地図全体を描画し、表示中の部分だけにクロップします。

これは純粋に私がどうやって行っているかですが、実装することはそれほど難しくないと思います。あなたのビューボックスがあなたのベースボックスの左上隅からどのくらいオフセットされているかを追跡するだけで済みます。ベースボックスに関してバブルを植え付ける必要がある場所を簡単に取り出せます。

私はこれを非常にうまく説明していないかどうか教えてください。たとえばのLinearLayoutと(dispathDrawをオーバーライドする)実際にはバルーンを描画する -

ベスト、

Ignus

+0

ありがとうございます、あなたのソリューションは動作します。ここでは、テキストに基づいてサイズ変更された画像を描画するために使用したコードを示します。 int padding = 10; bmpLength = textPaint.measureText((String)this.getText()); bmpHeight = textPaint.getFontSpacing(); (x + bmpLength +(パディング* 4))、(int)(y + bmpHeight + 2 *パディング))、mPaint);canvas.drawBitmap(mImage、null、new Rect(x、y、(int)canvas.drawText((String)this.getText()、x +(パディング* 2)、(float)(y +(bmpHeight/2)+ 1.5 *パディング)、textPaint); – James

1

一つのアプローチは、レイアウトを拡張することにより、バルーンを作成することです。レイアウトXMLからBallonを設定して使用し、コンテンツ用のtextViewを追加することができます。あなたの活動のテキストを変更する次に

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

:あなたはその後、ポップアップをロードすることができ、あなたの活動から

<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"); 

またImageViewsを追加したり、何でも可能性がありclickListenersなどのためのバルーンへ...

+0

マップがスクロールされたときにPopUpBalloonビューを特定のx-y位置に移動させることができれば、これは理想的な解決策になります。何か案は? – James

+0

@jamesすべての詳細を知らなくても、親ビュー(マップ?)に追加すると、基本的にポップアップを特定の場所に固定できます。だから、このようなもの:map.addView(popup、Layoutparams)ここで、Layoutparamsはポップアップを配置する場所*を指定します。 – dbryson

+0

ありがとうございます。地図を表示するビューは実際には動かず、キャンバスにオフセット画像を描画するだけであることを説明しておきます。 – James