【问题标题】:Google Maps - Set an different image for a each marker using a drawable resource imageGoogle Maps - 使用可绘制资源图像为每个标记设置不同的图像
【发布时间】:2015-04-16 23:37:45
【问题描述】:

我希望使用可绘制资源图像为每个标记设置不同的图像。

我有的是这个。

public View getInfoContents(Marker marker) {
                        View v = getLayoutInflater().inflate(R.layout.windowlayout, null);
                        TextView tv1 = (TextView) v.findViewById(R.id.tv1);
                        TextView tv2 = (TextView) v.findViewById(R.id.tv2);
                        Button btn = (Button) findViewById(R.id.button);

                        LatLng pos = marker.getPosition();
                        tv1.setText(marker.getTitle());
                        tv2.setText(marker.getSnippet());   

                        ImageView image = ((ImageView) findViewById(R.id.image42));

                        return v;
                    }

这会为标记设置图像,但我希望它是每个标记的不同图像。

我正在考虑这样的 if/else 语句..

public View getInfoContents(Marker marker) {
                        View v = getLayoutInflater().inflate(R.layout.windowlayout, null);
                        TextView tv1 = (TextView) v.findViewById(R.id.tv1);
                        TextView tv2 = (TextView) v.findViewById(R.id.tv2);
                        Button btn = (Button) findViewById(R.id.button);

                        LatLng pos = marker.getPosition();
                        tv1.setText(marker.getTitle());
                        tv2.setText(marker.getSnippet());   

                        ImageView image = ((ImageView) findViewById(R.id.image42));
                        if (marker == OldMellifontAbbey){
                            image= image.setBackground(BitmapDescriptorFactory.fromResource(R.drawable.oldmellifont));
                        }

                        else{


                        }
                        return v;
                    }
                });

欢迎提出任何建议。 谢谢。

好的,所以我想我正在做某事,但我仍然无法弄清楚。 我编辑的代码如下。

    @Override
                    public View getInfoContents(Marker marker) {
                        View v = getLayoutInflater().inflate(R.layout.windowlayout, null);
                        TextView tv1 = (TextView) v.findViewById(R.id.tv1);
                        TextView tv2 = (TextView) v.findViewById(R.id.tv2);
                        Button btn = (Button) findViewById(R.id.button);

                        LatLng pos = marker.getPosition();
                        tv1.setText(marker.getTitle());
                        tv2.setText(marker.getSnippet());   

                        ImageView image = ((ImageView) findViewById(R.id.image42));
                        try{
                            Drawable drawable = getResources().getDrawable(R.drawable.oldmellifont);


                            image.setBackground(drawable);



                        }
                        catch(Exception e){
                            Toast.makeText(getApplicationContext(), "Hairy ball sack!!!", Toast.LENGTH_LONG).show();
                        }
                        return v;
                    }
                });

【问题讨论】:

标签: android google-maps google-maps-android-api-2


【解决方案1】:

getInfoContents 方法属于 InfoWindowAdapter,所以我猜“每个标记的不同图像”是指每个 InfoWindow。如果是这种情况,那么我的建议是:

每次创建和添加标记时,都可以调用它的 getId() 方法,并使用此唯一 ID 作为 HashMap<String, Drawable> 或 HashMap<String, Integer> 中的键(稍后存储资源 ID)。然后在 InfoWindowAdapter 中,您将再次调用 marker.getId() 并将其映射到正确的可绘制对象。

如果您尝试设置标记自己的图像,那么您应该使用 BitmapDescriptorFactory 的方法之一,如下所示:

private Marker melbourne = mMap.addMarker(new MarkerOptions()
    .icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow)));

【讨论】:

    【解决方案2】:

    您必须使用 BitmapDescriptor 类才能将可绘制资源中的图像设置为标记。

    试试这个代码:

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        // Initialize the HashMap for Markers and MyMarker object
        mMarkersHashMap = new HashMap<Marker, MyMarker>();
    
        mMyMarkersArray.add(new MyMarker("Brasil", "icon1", Double.parseDouble("-28.5971788"), Double.parseDouble("-52.7309824")));
        mMyMarkersArray.add(new MyMarker("United States", "icon2", Double.parseDouble("33.7266622"), Double.parseDouble("-87.1469829")));
        mMyMarkersArray.add(new MyMarker("Canada", "icon3", Double.parseDouble("51.8917773"), Double.parseDouble("-86.0922954")));
        mMyMarkersArray.add(new MyMarker("England", "icon4", Double.parseDouble("52.4435047"), Double.parseDouble("-3.4199249")));
        mMyMarkersArray.add(new MyMarker("España", "icon5", Double.parseDouble("41.8728262"), Double.parseDouble("-0.2375882")));
        mMyMarkersArray.add(new MyMarker("Portugal", "icon6", Double.parseDouble("40.8316649"), Double.parseDouble("-4.936009")));
        mMyMarkersArray.add(new MyMarker("Deutschland", "icon7", Double.parseDouble("51.1642292"), Double.parseDouble("10.4541194")));
        mMyMarkersArray.add(new MyMarker("Atlantic Ocean", "icondefault", Double.parseDouble("-13.1294607"), Double.parseDouble("-19.9602353")));
    
        setUpMap();
    
        plotMarkers(mMyMarkersArray);
    }
    
    private void plotMarkers(ArrayList<MyMarker> markers)
    {
        if(markers.size() > 0)
        {
            for (MyMarker myMarker : markers)
            {
    
                // Create user marker with custom icon and other options
                MarkerOptions markerOption = new MarkerOptions().position(new LatLng(myMarker.getmLatitude(), myMarker.getmLongitude()));
                markerOption.icon(BitmapDescriptorFactory.fromResource(R.drawable.currentlocation_icon));
    
                Marker currentMarker = mMap.addMarker(markerOption);
                mMarkersHashMap.put(currentMarker, myMarker);
    
                mMap.setInfoWindowAdapter(new MarkerInfoWindowAdapter());
            }
        }
    }
    
    private int manageMarkerIcon(String markerIcon)
    {
        if (markerIcon.equals("icon1"))
            return R.drawable.icon1;
        else if(markerIcon.equals("icon2"))
            return R.drawable.icon2;
        else if(markerIcon.equals("icon3"))
            return R.drawable.icon3;
        else if(markerIcon.equals("icon4"))
            return R.drawable.icon4;
        else if(markerIcon.equals("icon5"))
            return R.drawable.icon5;
        else if(markerIcon.equals("icon6"))
            return R.drawable.icon6;
        else if(markerIcon.equals("icon7"))
            return R.drawable.icon7;
        else
            return R.drawable.icondefault;
    }
    
    private void setUpMap()
    {
        // Do a null check to confirm that we have not already instantiated the map.
        if (mMap == null)
        {
            // Try to obtain the map from the SupportMapFragment.
            mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
    
            // Check if we were successful in obtaining the map.
    
            if (mMap != null)
            {
                mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener()
                {
                    @Override
                    public boolean onMarkerClick(com.google.android.gms.maps.model.Marker marker)
                    {
                        marker.showInfoWindow();
                        return true;
                    }
                });
            }
            else
                Toast.makeText(getApplicationContext(), "Unable to create Maps", Toast.LENGTH_SHORT).show();
        }
    }
    
    public class MarkerInfoWindowAdapter implements GoogleMap.InfoWindowAdapter
    {
        public MarkerInfoWindowAdapter()
        {
        }
    
        @Override
        public View getInfoWindow(Marker marker)
        {
            return null;
        }
    
        @Override
        public View getInfoContents(Marker marker)
        {
            View v  = getLayoutInflater().inflate(R.layout.infowindow_layout, null);
    
            MyMarker myMarker = mMarkersHashMap.get(marker);
    
            ImageView markerIcon = (ImageView) v.findViewById(R.id.marker_icon);
    
            TextView markerLabel = (TextView)v.findViewById(R.id.marker_label);
    
            markerIcon.setImageResource(manageMarkerIcon(myMarker.getmIcon()));
    
            markerLabel.setText(myMarker.getmLabel());
    
            return v;
        }
    }
    

    }

    【讨论】:

    • 你永远不会将 BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.drawable.oldmellifont) 添加到 ImageView image = ((ImageView) findViewById(R.id.image42));
    • 我想我误解了你的问题。查看编辑后的答案!
    • 谢谢伙计。明天我会尝试使用它,现在让你知道我的进展情况。 :-)
    • 对不起,这对我不起作用。我已经为答案提供了 50 个代表点的奖励。
    【解决方案3】:

    在您的getInfoContents 方法中,从标记中获取Icon:

    public View getInfoContents(Marker marker) {
    
         ... ...
    
         ImageView image = ((ImageView) findViewById(R.id.image42));
         image.setImageDrawable(marker.getIcon()); 
    
         return v;
    }
    

    对于每个Marker,您应该为其设置特定的图标。然后当你打电话时:

    marker.showInfoWindow();
    

    每个标记都应该显示自己的图像/图标。

    【讨论】:

    • 嗨@Derek MC,你试过我的解决方案了吗?工作还是不工作?
    • @Derek MC 如果我的解决方案有误,请告知,如果正确请告知,对吗?
    【解决方案4】:

    试试这个设置图片资源

    image.setBackgroundResource(drawable);
    

    【讨论】:

      【解决方案5】:

      您似乎正在尝试在信息窗口中添加更改图像,而不是更改标记图标。为此,您可以在添加标记时创建一个 Marker 类型引用,假设将此引用创建为类的字段,以便所有内部函数都可以访问它,为该标记创建一个相应的 Drawable 引用为

      marker1 = myMap.addMarker(new MarkerOptions().position(yourLatLng1).icon(BitmapDescriptorFactory.fromResource(R.drawable.yourmarkericon)));
      drawable1 = getResources().getDrawable(R.drawable.drawable1);
      
      marker2 = myMap.addMarker(new MarkerOptions().position(yourLatLng2).icon(BitmapDescriptorFactory.fromResource(R.drawable.yourmarkericon)));
      drawable2 = getResources().getDrawable(R.drawable.drawable2);
      //and so on
      

      确保marker1和drawable1可以被所有必需的方法访问,所以让它们成为类的字段,然后你的getInfoContents方法就这样做

      Override
                      public View getInfoContents(Marker marker) {
                          View v = getLayoutInflater().inflate(R.layout.windowlayout, null);
                          TextView tv1 = (TextView) v.findViewById(R.id.tv1);
                          TextView tv2 = (TextView) v.findViewById(R.id.tv2);
                          Button btn = (Button) findViewById(R.id.button);
      
                          LatLng pos = marker.getPosition();
                          tv1.setText(marker.getTitle());
                          tv2.setText(marker.getSnippet());   
      
                          ImageView image = ((ImageView) findViewById(R.id.image42));
                          if(marker.equals(marker1){
                              image= image.setBackground(drawable1);
                          } else if((marker.equals(marker2)){
                              image= image.setBackground(drawable2);
                          } //and so on
                          return v;
                      }
                  });
      

      【讨论】:

        猜你喜欢
        • 2020-05-09
        • 2014-06-21
        • 1970-01-01
        • 2012-02-01
        • 2018-02-07
        • 1970-01-01
        • 1970-01-01
        • 2020-07-14
        • 1970-01-01
        相关资源
        最近更新 更多