Как изменить маркер для наложения на кран для 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, он исчезает из вида. Что происходит не так?

ОБНОВИТЬ:

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

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

Solutions Collecting From Web of "Как изменить маркер для наложения на кран для Android?"

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

 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 изображения, и вы хотите перевернуть их на основе фокуса, сделайте это простым способом:

Шаг 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. Прочитав много ответов и не увидев этого нигде, я просто попробовал это сам, и он работал отлично.

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

Другое примечание: если вы используете предложенный Sherif 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()); 

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

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

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