2013-05-03 233 views
26

右侧我对Android的集成谷歌地图API V2。我想在My Marker的Onclick上有一个自定义信息窗口。直到它没事。我已经整合了它。Android的谷歌地图API V2:打开自定义信息窗口上标记

我想要的是:我想在标记的右侧显示我的自定义信息窗口而不是标记的顶部。

下面是我使用的代码:

public class MainActivity extends FragmentActivity { 

    private MainMapFragement mapFragment; 
    private HashMap<Marker, EventInfo> eventMarkerMap; 


    Marker ThirdMarker; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mapFragment = new MainMapFragement(); 
     // FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.add(R.id.map, mapFragment); 
     ft.commit(); 

    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     setUpEventSpots(); 
    } 

    private void setUpEventSpots() { 
     // I'm going to make 2 EventInfo objects and place them on the map 
     EventInfo firstEventInfo = new EventInfo(new LatLng(50.154, 4.35), 
       "Right now - event", new Date(), "Party"); 
     EventInfo secondEventInfo = new EventInfo(new LatLng(51.25, 4.15), 
       "Future Event", new Date(1032, 5, 25), "Convention"); 

     EventInfo thirdEventInfo = new EventInfo(new LatLng(23.25, 72.15), 
       "Our Next Event", new Date(), "Ahmedabad-India"); 
     // this date constructor is deprecated but it's just to make a simple 
     // example 

     Marker firstMarker = mapFragment.placeMarker(firstEventInfo); 
     Marker secondMarker = mapFragment.placeMarker(secondEventInfo); 
     ThirdMarker = mapFragment.placeMarker(thirdEventInfo); 
     eventMarkerMap = new HashMap<Marker, EventInfo>(); 
     eventMarkerMap.put(firstMarker, firstEventInfo); 
     eventMarkerMap.put(secondMarker, secondEventInfo); 
     eventMarkerMap.put(ThirdMarker, thirdEventInfo); 

     // add the onClickInfoWindowListener 
     mapFragment.getMap().setOnInfoWindowClickListener(
       new OnInfoWindowClickListener() { 

        @Override 
        public void onInfoWindowClick(Marker marker) { 
         EventInfo eventInfo = eventMarkerMap.get(marker); 
         Toast.makeText(
           getBaseContext(), 
           "The date of " 
             + eventInfo.getName() 
             + " is " 
             + eventInfo.getSomeDate() 
               .toLocaleString(), 
           Toast.LENGTH_LONG).show(); 

        } 
       }); 



     // Custom Bhavesh 
     mapFragment.getMap().setInfoWindowAdapter(new InfoWindowAdapter() { 

      private final View window = getLayoutInflater().inflate(
        R.layout.ballonoverlly, null); 

      @Override 
      public View getInfoWindow(Marker marker) { 
       EventInfo eventInfo = eventMarkerMap.get(marker); 

       String title = marker.getTitle(); 
       TextView txtTitle = ((TextView) window 
         .findViewById(R.id.textview_name)); 
       if (title != null) { 
        // Spannable string allows us to edit the formatting of the 
        // text. 
        SpannableString titleText = new SpannableString(title); 
        titleText.setSpan(new ForegroundColorSpan(Color.RED), 0, 
          titleText.length(), 0); 
        txtTitle.setText(titleText); 
       } else { 
        txtTitle.setText(""); 
       } 

       // TextView txtType = ((TextView) window 
       // .findViewById(R.id.textview_aboutme)); 
       // if (eventInfo.getType() != null) 
       // txtType.setText(eventInfo.getType()); 

       return window; 
      } 

      @Override 
      public View getInfoContents(Marker marker) { 
       // this method is not called if getInfoWindow(Marker) does not 
       // return null 
       return null; 
      } 
     }); 
    } 

} 

XML文件:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/RlMain" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" > 


    <LinearLayout 
     android:id="@+id/imageview_comment" 
     android:layout_width="150dp" 
     android:layout_height="62dp" 
     android:background="@drawable/map_comment_back" 
     android:gravity="center_vertical" 
     android:orientation="vertical" 
     android:scaleType="fitXY" 
     android:visibility="visible" > 

     <TextView 
      android:id="@+id/textview_name" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerVertical="true" 
      android:layout_marginLeft="10dp" 
      android:text="Bhavesh Patadiya" 
      android:textColor="#FFFFFF" 
      android:textStyle="bold" /> 

     <TextView 
      android:id="@+id/textview_aboutme" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerVertical="true" 
      android:layout_marginLeft="10dp" 
      android:maxLines="2" 
      android:text="How&apos;s Going?" 
      android:textColor="#FFFFFF" 
      android:textStyle="normal" /> 
    </LinearLayout> 
</LinearLayout> 

下面是我所得到的屏幕截图: enter image description here

现在,我想将我的自定义InfoWindow放在标记的右侧而不是顶部。

所有帮助表示赞赏。

在此先感谢。

+0

试试这个:根据u - >创建一个图像(背景),左半边空白和右半边,然后在右侧添加内容(TextView)。我希望,因为左侧看起来空白 – Maddy 2013-06-05 11:20:01

回答

0

您可以通过简单的转换marker.getPosition()做screenPosition像下面的代码

Projection projection = map.getProjection(); 
LatLng markerLocation = marker.getPosition(); 
Point screenPosition = projection.toScreenLocation(markerLocation); 

int x = screenPosition.x +marker. markerImage.getWidth(); 

您可以参考以下链接查看详细信息(其转化为getPosition投影):

How to get screen coordinates from marker in google maps v2 android

+0

@BhaveshPatadiya,你这个做将需要标记的吧?我想尝试将信息窗口放置在屏幕顶部。 – andrefadila 2013-08-26 00:56:34

+0

我如何在地图上放置一个视图?当我使用的代码'inflater.inflate(R.id.overlay_layout,(ViewGroup中)myViewGroup)'它确实表明对标记的看法,但我也有一个问题,当布局沿线两侧放置在地图上的一个片段屏幕视图获取包梁也就是说,如果TextView的是有文字textview1然后一些文本是在一行和一些文字是在第2 line.Can有人能帮我解决这个 – JAPS 2014-08-21 06:50:07

6

编辑2:

从九月更新(V12或65年2月3日)开始Google地图Android API v2 MarkerOptions.infoWindowAnchor已添加。有相当多的新功能,所以请release notes了。

编辑3:

可惜的是这除了没有解决你的问题呢。为此增加了new issue


这当前不可能。

如果不允许用户移动地图,试图通过将View设置为MapFragment来解决此问题可以是一个很好的解决方案。如果可以的话,你会使用或者“推理工科” onCameraChange或轮询Handlermap.getCameraPosition()当看到重新定位一些不好的滞后。

同样的问题,如果您尝试使用额外的标记与透明的图标显示在单击时可见的信息窗口,但它会更有趣地看到它实际上执行。

如果能够正常右边信息窗口生活,现在,我会建议主演this feature already requested和等待。

编辑:

作为3.1.36(REV。7)可以更改API v2的标记图标。这意味着您可以制作两个图标:一个正常,另一个看起来像右侧打开了一个信息窗口。禁用打开默认信息窗口并使用它可能适用于您。