2015-05-03 65 views
2

我想實現一個Google地圖標記與infoWindow,如果有人點擊這個infoWindow,它播放歌曲,如果再次點擊,它會停止。爲了想象這個,我寫了一個自定義的infoWindow佈局。在infoWindow中,您可以通過按鈕查看用戶和跟蹤信息。如果曲目還沒有開始播放,此按鈕顯示播放圖標,如果按下(按下infoWindow,而不是按鈕),我希望它將其圖標從「播放」更改爲「停止」。不過,根據infoWindowClickListener活動,我無法更改自定義infoWindow的視圖。我試圖更改infoWindowAdapter,但我不想更改所有其他infoWindows的視圖,也想立即查看更改。這樣,當我再次點擊標記後,infoWindow刷新它的視圖。換句話說,它不會與我的點擊操作同時改變視圖。更改infoWindow視圖取決於點擊監聽器

在這裏你可以看到我在說什麼。停止狀態在左邊,右邊播放狀態:

enter image description here

這裏是我的適配器徒勞的努力:

public class OrangeInfoWindowAdapter implements GoogleMap.InfoWindowAdapter { 

    Context context; 
    ImageButton playButton; 
    boolean onPlay; 

    public OrangeInfoWindowAdapter(Context context, boolean onPlay) { 
     this.context = context; 
     this.onPlay = onPlay; 
    } 

    @Override 
    public View getInfoWindow(Marker arg0) { 

     LayoutInflater inflater = LayoutInflater.from(context); 
     View v = inflater.inflate(R.layout.orange_infowindow, null); 

     v.setMinimumWidth(280); 
     v.setMinimumHeight(120); 

     TextView tvUsername = (TextView) v.findViewById(R.id.tv_username); 
     TextView tvTrack = (TextView) v.findViewById(R.id.tv_track); 

     int index = arg0.getTitle().indexOf("*"); 

     try { 
      tvUsername.setText(arg0.getTitle().substring(0, index - 1) + "\n" + arg0.getTitle().substring(index + 2)); 
     } catch (StringIndexOutOfBoundsException e) { 
     } 

     tvUsername.setTextSize(10); 
     tvUsername.setTextColor(Color.rgb(70, 70, 70)); 

     index = arg0.getSnippet().indexOf("*"); 

     try { 
      tvTrack.setText(arg0.getSnippet().substring(0, index - 1) + "\n" + arg0.getSnippet().substring(index + 2)); 
     } catch (StringIndexOutOfBoundsException e) { 
     } 

     tvTrack.setTextSize(10); 
     tvTrack.setTextColor(Color.rgb(230, 92, 1)); 

     playButton = (ImageButton) v.findViewById(R.id.playButton); 

     if (onPlay) 
      onPlay(); 

     return v; 

    } 

    public void onPlay() { 
     playButton.setBackgroundResource(R.drawable.info_stop_button); 
    } 

    public void onStop() { 
     playButton.setBackgroundResource(R.drawable.info_play_button); 
    } 

    @Override 
    public View getInfoContents(Marker arg0) { 
     return null; 
    } 
} 

這是我onInfoWindowClick():

@Override 
public void onInfoWindowClick(Marker marker) { 
    if (!infoWindowPlayerActive) { 
     int index = findMarkerIndex(marker); 
     OrangeInfoWindowAdapter infoWindowAdapter2 = new OrangeInfoWindowAdapter(getActivity().getApplicationContext(), true); 
     googleMap.setInfoWindowAdapter(infoWindowAdapter2); 
     new InfoWindowPlayerTask(mainActivity).execute(activities.get(index).getTrackId()); 
     infoWindowPlayerActive = true; 
    } 

    else { 
     // same thing... 
     infoWindowPlayerActive = false; 
    } 
} 

如果你需要更多的信息來清楚地瞭解問題,請問我。

+1

好看的佈局 – peresisUser

回答

1

除了打開和關閉它之外,GoogleMap API v.2不支持InfoWindow上的任何交互。

然而,有一個驚人的黑客實施in this answer,你應該如何建立你的信息窗口內的互動觀。請記住,相同的技術也適用於碎片。

official documentation

注意:繪製的信息窗口不是實時取景。該視圖在返回時呈現爲圖像(使用View.draw(Canvas))。這意味着對視圖的任何後續更改都不會反映在地圖上的信息窗口中。稍後更新信息窗口(例如,在圖像加載後),請調用showInfoWindow()。此外,信息窗口不會考慮任何典型的普通視圖的交互性,例如觸摸或手勢事件。但是,您可以在整個信息窗口中收聽通用點擊事件,如下面的部分所述。

+0

我之前檢查過,看起來非常好。但是,映射的觸摸包裝將導致ViewPager中出現膨脹錯誤。附加新的適配器後,我試圖調用「marker.showInfoWindow()」,它的工作原理。我知道這是骯髒的解決方案,但如果它有效,在這種情況下是很好的。 –

+0

我也在我的應用程序裏面實施了這個黑客技巧,它像一個魅力。由於API不支持任何本地方式,我認爲這是唯一的選擇。 –

+0

我可以問你一些事嗎?這似乎是完全錯誤的原因不明,但我不知道在更改適配器如此糟糕後究竟調用「showInfoWindow()」是什麼?頻繁切換infoWindow會導致性能問題嗎? –

0

我發現了一個稀鬆但工作溶液:

@Override 
public void onInfoWindowClick(Marker marker) { 
    if (!infoWindowPlayerActive) { 
     googleMap.setInfoWindowAdapter(infoWindowAdapterOnPlay); 
     marker.showInfoWindow(); 
     newClickedInfoWindowIndex = findMarkerIndex(marker); 

     if (lastClickedInfoWindowIndex != newClickedInfoWindowIndex) { 
      new InfoWindowPlayerTask(mainActivity).execute(activities.get(newClickedInfoWindowIndex).getTrackId()); 
     } 
     else { 
      mainActivity.getPlayerManager().clickPlayPause(); 
     } 

     lastClickedInfoWindowIndex = newClickedInfoWindowIndex; 
     infoWindowPlayerActive = true; 
    } 

    else { 
     googleMap.setInfoWindowAdapter(infoWindowAdapter); 
     marker.showInfoWindow(); 
     mainActivity.getPlayerManager().clickPlayPause(); 
     infoWindowPlayerActive = false; 
    } 
} 

public int findMarkerIndex(Marker marker) { 
    for (int i = 0; i < markers.size(); i++) { 
     if (marker.getPosition().equals(markers.get(i).getPosition())) { 
      return i; 
     } 
    } 
    return -1; 
} 

當然,假設infoWindowPlayerActive,lastClickedInfoWindowIndex,newClickedInfoWindowIndex在類中定義的上方。

相關問題