0

このチュートリアルを使用しました http://crazyandroidian.blogspot.com/2011/10/custom-mapview-popup-in-android.htmlバルーン タブに画像を追加する方法を教えてください。マーカー ポイント バブルに位置画像を追加したいと考えています。このコードは、テキスト メッセージを表示するだけで、画像は表示しません。

package com.readystatesoftware.mapviewballoons;
import mapviewballoons.example.R;
import java.lang.reflect.Method;
import java.util.List;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup.LayoutParams;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

public abstract class BalloonItemizedOverlay<Item> extends ItemizedOverlay<OverlayItem>  {
  private MapView mapView;
  private BalloonOverlayView balloonView;
  private View clickRegion;
  private int viewOffset;
  final MapController mc;

  public BalloonItemizedOverlay(Drawable defaultMarker, MapView mapView) {
    super(defaultMarker);
    this.mapView = mapView;
    viewOffset = 0;
    mc = mapView.getController();
  }
  public void setBalloonBottomOffset(int pixels) {
    viewOffset = pixels;
  }
  protected boolean onBalloonTap(int index) {
    return false;
  }
  @Override
  protected final boolean onTap(int index) {
    boolean isRecycled;
    final int thisIndex;
    GeoPoint point;
    thisIndex = index;
    point = createItem(index).getPoint();
    if (balloonView == null) {
      balloonView = new BalloonOverlayView(mapView.getContext(), viewOffset);
      clickRegion = (View) balloonView.findViewById(R.id.balloon_inner_layout);
      isRecycled = false;
    } else {
      isRecycled = true;
    }
    balloonView.setVisibility(View.GONE);
    List<Overlay> mapOverlays = mapView.getOverlays();
    if (mapOverlays.size() > 1) {
      hideOtherBalloons(mapOverlays);
    }
    balloonView.setData(createItem(index));
    MapView.LayoutParams params = new MapView.LayoutParams(
      LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, point,
      MapView.LayoutParams.BOTTOM_CENTER
    );
    params.mode = MapView.LayoutParams.MODE_MAP;
    setBalloonTouchListener(thisIndex);
    balloonView.setVisibility(View.VISIBLE);
    if (isRecycled) {
      balloonView.setLayoutParams(params);
    } else {
      mapView.addView(balloonView, params);
    }
    mc.animateTo(point);
    return true;
  }
  /**
    * Sets the visibility of this overlay's balloon view to GONE.
  */
  private void hideBalloon() {
    if (balloonView != null) {
      balloonView.setVisibility(View.GONE);
    }
  }
  private void hideOtherBalloons(List<Overlay> overlays) {
    for (Overlay overlay : overlays) {
      if (overlay instanceof BalloonItemizedOverlay<?> && overlay != this) {
        ((BalloonItemizedOverlay<?>) overlay).hideBalloon();
      }
    }
  }
  private void setBalloonTouchListener(final int thisIndex) {
    try {
      @SuppressWarnings("unused")
      Method m = this.getClass().getDeclaredMethod("onBalloonTap", int.class);
      clickRegion.setOnTouchListener(new OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
          View l =  ((View) v.getParent()).findViewById(R.id.balloon_main_layout);
          Drawable d = l.getBackground();
          if (event.getAction() == MotionEvent.ACTION_DOWN) {
            int[] states = {android.R.attr.state_pressed};
            if (d.setState(states)) {
              d.invalidateSelf();
            }
            return true;
          } else if (event.getAction() == MotionEvent.ACTION_UP) {
            int newStates[] = {};
            if (d.setState(newStates)) {
              d.invalidateSelf();
            }
            // call overridden method
            onBalloonTap(thisIndex);
            return true;
          } else {
            return false;
          }
        }
      });
    } catch (SecurityException e) {
      Log.e("BalloonItemizedOverlay", "setBalloonTouchListener reflection SecurityException");
      return;
    } catch (NoSuchMethodException e) {
      // method not overridden - do nothing
      return;
    }
  }
}
4

1 に答える 1

0

気球のレイアウトを作成する必要があると思います。このチュートリアルでは、作成者はバルーン ビューを作成し、balloon.xml を持っています。画像を表示するには、XML ファイルに正しい画像ビューを配置します。行のレイアウトが必要なリスト ビューにテキストと画像を表示しようとするようなものです。見逃していない限り、これを定義する必要があります R.id.balloon_main_layout

マップ上の各アイテムにはおそらく異なる画像が関連付けられているため、OverlayItem を拡張するクラスを作成する必要さえあるかもしれません。OverlayItem を拡張するアイテムを作成すると、画像を渡すか、オーバーレイの作成時に画像を取得する関数を使用できます。

編集:あなたの例は、説明どおりに機能します。コメントでリンクしたチュートリアルが問題を解決します。チュートリアルでは、ImageView横に が付いたテキストが表示されます。画像はチュートリアルの最後に表示されます。res ディレクトリの drawable という名前のフォルダーに保存する必要があります。

編集:私は実際にあなたが使っていたコードを手に入れました。APIキーを入力しなかったため、空白のマップが表示されますが、ポップアップにはテキストとその横にあるキャンセルボタンがあり、これは balloon_map_overlay.xml から膨張した画像ビューです

次のように OverlayItem を拡張できます。

import android.graphics.Rect;
import android.graphics.drawable.Drawable;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.OverlayItem;

public class MyItem extends OverlayItem{

    Drawable balloonPic = null;
    Rect mBounds = null;
    public MyItem(GeoPoint point, String title, String snippet, Drawable draw, Rect bounds) {
        super(point, title, snippet);

        mBounds = bounds;
        //0,0 position is the geopoint on the map. Positive is going right and down. negative goes left and up. setBounds accepts (leftBound, topbound, right bound, bottom bound)
        draw.setBounds(-draw.getIntrinsicWidth()/2, -draw.getIntrinsicHeight(), draw.getIntrinsicWidth()/2, 0);
        this.setBalloonPic(draw);

    }

    @Override
    public void setBalloonPic(Drawable draw) {

        balloonPic = draw;

    }
    @Override
    public Drawable getBalloonPic() {

        return balloonPic;

    }

}

バルーン オーバーレイビューでは、オーバーレイ項目が作成されたときに画像のデータを設定する必要があります。それはあなたに任せますが、例は OverlayItem の get メソッドにアクセスする方法を示しており、上記のコードは、表示したい画像のゲッターとセッターを持つことを示唆しています。そうしないと、すべてのバルーンに同じ画像が表示されます。

public void setData(OverlayItem item) {
    layout.setVisibility(VISIBLE);
    if (item.getTitle() != null) {
    title.setVisibility(VISIBLE);
    title.setText(item.getTitle());
    } else {
    title.setVisibility(GONE);
    }
    if (item.getSnippet() != null) {
    snippet.setVisibility(VISIBLE);
    snippet.setText(item.getSnippet());
    } else {
    snippet.setVisibility(GONE);
    }

PSあなたのpublic class MyItemizedOverlay extends BalloonItemizedOverlay<OverlayItem>必要性 public class MyItemizedOverlay extends BalloonItemizedOverlay<MyItem>

于 2012-11-27T06:47:40.333 に答える