Как поменять маркер для наложения на тап на андроид? - PullRequest
12 голосов
/ 12 августа 2011

Я сделал приложение, в котором мне нужно изменить рисование оверлейного элемента, когда пользователь нажимает на него. я использую следующий код для достижения этого эффекта:

        protected boolean onTap(int index) {
        OverlayItem item = mOverlays.get(index);
        if(item.getTitle().equals("true")){
            if(item.getMarker(OverlayItem.ITEM_STATE_FOCUSED_MASK).equals(greenMarker)){
                item.setMarker(orangeMarker);
                view1ComplainPoleList.add(item.getSnippet());
                Log.i("adding",item.getSnippet());
                map.invalidate();
            }
            else{
                item.setMarker(greenMarker);
                view1ComplainPoleList.remove(item.getSnippet());
                Log.i("removing",item.getSnippet());
                map.invalidate();
            }
        }
        return true;
    }

Но, похоже, это не работает. всякий раз, когда я нажимаю на оверлейный элемент, он исчезает из поля зрения. что не так?

UPDATE:

Не могли бы вы также сказать мне, как загружать новые виды при прокрутке карты ...?

Заранее спасибо.

Ответы [ 4 ]

13 голосов
/ 24 августа 2011

Это очень просто сделать :

protected boolean onTap(int index) {
    OverlayItem item = mOverlays.get(index);
    //Get the new Drawable
    Drawable marker = mContext.getResources().getDrawable(R.drawable.icon);
    //Set its bounds
    marker.setBounds(0,0,marker.getIntrinsicWidth(),marker.getIntrinsicHeight());
    //Set the new marker
    item.setMarker(marker);
    //Return true! Do not invalidate
    return true;
}
3 голосов
/ 30 июля 2012

Я вижу много ответов, делающих это трудным путем.Если у вас есть 2 изображения, и вы хотите перевернуть их в зависимости от фокуса, сделайте это простым способом:

Шаг 1. Скопируйте оба изображения в папку drawables:

Пример: mycon_focused.png,mycon.png

Шаг 2: Создание XML-файла селектора в drawables: Пример "marker.xml"

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:state_focused="true" android:drawable="@drawable/mycon_focused"/>
     <item android:state_focused="false" android:drawable="@drawable/mycon" />
</selector>

Шаг 3: Когда вы создаете свой ItemOverlay и добавляете Drawable OverlayItems, используйте

getResources().getDrawable(R.drawable.marker);

вместо

getResources().getDrawable(R.drawable.mycon);

, а затем программно изменить его в методе касания.Прочитав много ответов и не увидев этого нигде, я просто попробовал сам, и он отлично работал.

Большое спасибо предыдущим авторам, без вашей помощи у меня не было бы отправной точки.

Еще одно примечание: если вы используете код, предложенный Шерифом эль-Хатибом, и ваша позиция маркера не установлена, попробуйте:

int width = marker.getIntrinsicWidth();
int height = marker.getIntrinsicHeight();
marker.setBounds(-(width/2),-height,(width/2),0);

вместо

marker.setBounds(0,0,marker.getIntrinsicWidth(),marker.getIntrinsicHeight());

Это должно идеально отцентрировать его.

2 голосов
/ 24 августа 2011

Используйте Setbounds api, чтобы установить границы следующим образом: отредактировал исходный код

protected boolean onTap(int index) {
    OverlayItem item = mOverlays.get(index);
    if(item.getTitle().equals("true")){
        if(item.getMarker(OverlayItem.ITEM_STATE_FOCUSED_MASK).equals(greenMarker)){
            orangeMarker.setBounds(0,0,orangeMarker.getIntrinsicWidth(),orangeMarker.getIntrinsicHeight());
            item.setMarker(orangeMarker);
            view1ComplainPoleList.add(item.getSnippet());
            Log.i("adding",item.getSnippet());
            map.invalidate();
        }
        else{
            greenMarker.setBounds(0,0,greenMarker.getIntrinsicWidth(),greenMarker.getIntrinsicHeight());
            item.setMarker(greenMarker);
            view1ComplainPoleList.remove(item.getSnippet());
            Log.i("removing",item.getSnippet());
            map.invalidate();
        }
    }
    return true;
}
2 голосов
/ 12 августа 2011

Понятия не имею, что такое view1ComplainPoleList и влияет ли это на вопросы. Я обработал это, создав подкласс OverlayItem и переопределив getMarker(), чтобы получить правильное изображение. Вот пример проекта , в котором я использую эту технику.

...