Как изменить маркер для наложения на кран для 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:
Вы могли бы также рассказать мне, как загружать новые представления при прокрутке карты...?
благодарим вас заранее.
Ответы
Ответ 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;
}