Подтвердить что ты не робот

Как изменить маркер для наложения на кран для Android?

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

        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;
    }

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

UPDATE:

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

благодарим вас заранее.

4b9b3361

Ответ 1

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

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;
}

Ответ 2

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

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

Пример: 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 и добавляете OverlayItems drawable, используйте

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

вместо

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

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

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

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

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

вместо

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

Это должно идеально сосредоточиться.

Ответ 3

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

Ответ 4

Используйте 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;
}