Создание MapView с ContextMenu без наложений - PullRequest
0 голосов
/ 27 октября 2010

У меня есть вид карты, и я хочу отображать ContextMenu при длинном клике, но пока самое близкое решение, которое я нашел, это здесь, на anddev , основная причина, по которой мне не нравится этот метод, заключается в том, что любой щелчок активируйте ContextMenu вместо длинного щелчка.

Вопрос:

Есть ли способ отобразить ContextMenu карты без использования оверлеев? Почему?

Ответы [ 3 ]

2 голосов
/ 05 ноября 2010

Это подход, который я использовал. Я создал класс AbstractMap, который расширил MapActivity. Отсюда я расширил класс AbstractMap для создания Map, которая отвечала моим требованиям. Примечание. Я использовал этот подход только потому, что мне требовалось несколько карт с различными свойствами для моего приложения. Вы можете просто удалить ключевое слово Abstract из AbstractMap, напрямую переопределить методы OnGestureListener в этом классе и создать его экземпляр.

Вот класс AbstractMap

public abstract class AbstractMap extends MapActivity implements OnGestureListener, OnDoubleTapListener {

public MapView mapView;
public MapController mapController;
public List<Overlay> mapOverlays;
private GestureDetector detector;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    try {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.mapp);
        detector = new GestureDetector(this, this);
        mapView = (MapView) findViewById(R.id.mapview);
        mapView.setOnTouchListener(otl);
        mapController = mapView.getController();
        mapOverlays = mapView.getOverlays();
    } catch (Exception e) {
        Log.e("Error", "Exception", e);
    }
}

public OnTouchListener otl = new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        if (detector.onTouchEvent(event))
            return true;
        else
            return false;

    }
};

}

Вот LongPressMap

public class LongPressMap extends AbstractMap {


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}



@Override
public boolean onDown(MotionEvent event) {  

    return false;
}


public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {


    return false;
}


@Override
public void onLongPress(MotionEvent e) {        

}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
        float distanceY) {
    //Log.d("Debug","On Scrtoll");
    // TODO Auto-generated method stub
    return false;
}

@Override
public void onShowPress(MotionEvent e) {


}

@Override
public boolean onSingleTapUp(MotionEvent e) {

    return false;
}

@Override
public boolean onDoubleTap(MotionEvent e) {

    return false;
}

@Override
public boolean onDoubleTapEvent(MotionEvent e) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
    // TODO Auto-generated method stub
    return false;
}


@Override
protected boolean isRouteDisplayed() {
    // TODO Auto-generated method stub
    return false;
}

}

Надеюсь, это поможет.

0 голосов
/ 05 ноября 2010

onKeyLongPress означает именно это. Ключ был удержан. То, что вы хотите сделать, это реализовать GestureListener. Вот пример того, как заставить это работать:

Пример GestureListener

Конечно, вся информация, которую вы получите, будет в пикселях, поэтому вам нужно спроецировать ее в пространство карты, чтобы получить длину в длину.

0 голосов
/ 02 ноября 2010

Возможно, стоит попробовать написать метод onKeyLongPress для mapView. Для этого вам нужно создать еще один класс, который расширяет MapView, а затем использовать новый класс вместо вашего MapView. Просто есть конструктор по умолчанию, который относится к супер-конструктору. Eclipse создаст это автоматически для вас, если вы позволите ему создавать конструкторы суперкласса.

Оттуда переопределите onKeyLongPress, пусть он вызывает любые методы, которые вы обычно используете для отображения меню.

...