2012-10-06 3 views
5

これで数日間私の脳を痛めつけてしまいましたが、グーグルとSO'edが報告されていますそのような問題(それを逃したかもしれない)。ロングプレスのAndroidマップマーカーが実際にロングプレスされている領域の下にプロットされています(API 15の場合)

私はカスタマイズされたMapviewクラスを持っています。これは、longpressを聴いて、地図上にマーカーをプロットするために使用しています。それはAPI-8で大丈夫です。しかし、API-15では、ユーザーの指が長押しをしている場所の約2cm下にマーカーがオフセットされています。これは、実際のデバイス(samsung s2)とEclipseエミュレータの両方で観測されます。また、(約2cmオフセットされた)マーカー領域に対して、長押しされた指領域は、すべてのズームレベルで観察される。ここで

は私のカスタマイズされたのMapViewクラス(どこからそれをヤンク)である:

public class MyCustomMapView extends MapView { 
public interface OnLongpressListener { 
    public void onLongpress(MapView view, GeoPoint longpressLocation); 
} 

static final int LONGPRESS_THRESHOLD = 500; 
private GeoPoint lastMapCenter; 

private Timer longpressTimer = new Timer(); 
private MyCustomMapView.OnLongpressListener longpressListener; 


public MyCustomMapView(Context context, String apiKey) { 
    super(context, apiKey); 
} 

public MyCustomMapView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public MyCustomMapView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

public void setOnLongpressListener(MyCustomMapView.OnLongpressListener listener) { 
    longpressListener = listener; 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    handleLongpress(event); 

    return super.onTouchEvent(event); 
} 

private void handleLongpress(final MotionEvent event) { 

    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     // Finger has touched screen. 
     longpressTimer = new Timer(); 
     longpressTimer.schedule(new TimerTask() { 
      @Override 
      public void run() { 

       GeoPoint longpressLocation = getProjection().fromPixels((int)event.getX(), (int)event.getY()); 

       /* 
       * Fire the listener. We pass the map location 
       * of the longpress as well, in case it is needed 
       * by the caller. 
       */ 
       longpressListener.onLongpress(MyCustomMapView.this, longpressLocation); 
      } 

     }, LONGPRESS_THRESHOLD); 

     lastMapCenter = getMapCenter(); 
    } 

    if (event.getAction() == MotionEvent.ACTION_MOVE) { 

     if (!getMapCenter().equals(lastMapCenter)) { 
      // User is panning the map, this is no longpress 
      longpressTimer.cancel(); 
     } 

     lastMapCenter = getMapCenter(); 
    } 

    if (event.getAction() == MotionEvent.ACTION_UP) { 
     // User has removed finger from map. 
     longpressTimer.cancel(); 
    } 

     if (event.getPointerCount() > 1) { 
        // This is a multitouch event, probably zooming. 
      longpressTimer.cancel(); 
     } 
} 

そして、これは私が上記のクラスを呼び出す方法です:それはは、setBounds問題のように見える

custom_marker = getResources().getDrawable(R.drawable.marker3); 
custom_marker.setBounds(-custom_marker.getIntrinsicWidth(), -custom_marker.getIntrinsicHeight(), 0, 0); 
customSitesOverlay = new CustomSitesOverlay(custom_marker); 
mapView.getOverlays().add(customSitesOverlay); 
customSitesOverlay.addOverlay(new OverlayItem(longpressLocation, "User Marker", id)); 
+0

私も同じ問題に直面しています。 @Marka、あなたは解決策を見つけましたか?共有してください....ありがとう事前に –

+0

申し訳ありません@MukeshY私たちはこれをすべて断念し、コードを介して地図上の固定ピンを選択しました。 –

答えて

1

。マーカー境界をdrawableの右下隅の中央に設定しています。それは意図的な行動ですか?

custom_marker.setBounds(-custom_marker.getIntrinsicWidth()/2, -custom_marker.getIntrinsicHeight(), custom_marker.getIntrinsicWidth()/2, 0); 

幸運:

あなたがに境界を設定する(最も一般的なタイプまたはマーカーである)下部中央に中央にマーカーを設定することができます。

+0

ありがとう@ルイスしかし、あなたのソリューションを使用しても、同じ動作になります。私も答えを求める私の探求の中でこれらのパラメタを変えてみました(残念ながらそのことについては言及しませんでした)。さらに、API 8を使用して元の設定で意図された動作を得ています。この動作が現在観察されているAPI 15(他のバージョンでは試していません)。 –

+0

drawableの2つの異なる境界を設定するのと同じ動作をするべきではありません。あなたが同じ振る舞いをしているなら、間違いなく境界問題があります。私は似たような問題について報告している人物を覚えています。コールした後、ドロウアブルからの境界が失われましたが、その時までには解決策はありませんでした。 – Luis

+0

右@luis! CustomSitesOverlayクラスの設定で上書きされていました。しかし、それを取り除き、実際の長押し操作でマーカーをプロットするベアボーンを持ち、APIレベル8(およびHTCデバイス)と約2cmのオフセット(マーカーは2cm下にプロットされています領域が押された)APIレベル15(およびサムスンS2デバイス)。 2cmの誤差もすべてのズームレベルで発生します。 –