2016-03-31 37 views
1

Bir MapsView uygulayan bir uygulama oluşturduk. Ve işaretleyiciyi tıklattığımda, bana veriyi veritabanından picasso kullanarak çektiği bilgi penceresini göstereceğim. İyi çalışıyor, ama sorun şu ki, bilgi penceresindeki görüntü bana ihtiyacım olan görüntüyü göstermiyor, hala bana yer tutucu görüntüsünü gösteriyor. Fakat haritayı tıklayıp işaretleyiciye tekrar tıkladığımda, bana ihtiyacım olan resmi gösterir. Ama eğer haritayı tıklamıyorsam (hala işaretleyiciyi tıklatıyorsam), yine de her zaman bana yer tutucu işaretini gösterir. İhtiyacım olan görüntüyü (ihtiyaç duyduğum görüntü ile yer tutucu görüntüsü değiştirilecek) bir süre içinde nasıl görüntüleyebilirim?Resimde bilgi nasıl edinilirWindows'da Google Maps ile haritalar - Android

Burada bilgi penceresi temelde nüfuslu görünümler yakalanan bir bitmap, benim kod

public void plotMarkers(ArrayList<MyMarker> markers) { 
    if(markers.size() > 0) { 
     for (MyMarker myMarker : markers) 
     { 
      dest = new LatLng(myMarker.getmLatitude(), myMarker.getmLongitude()); 
      markerOption = new MarkerOptions().position(dest); 
      location_marker = mMap.addMarker(markerOption); 
      Target target = new PicassoMarker(location_marker); 
      targets.add(target); 

      ImageView image = new ImageView(this); 
      image.setImageResource(R.mipmap.marker); 
      int width = image.getDrawable().getIntrinsicWidth(); 
      int height = image.getDrawable().getIntrinsicHeight(); 

      Picasso.with(MapsActivity.this).load(myMarker.getmIcon()).resize(width, height).onlyScaleDown().into(target); 
      mMarkersHashMap.put(location_marker, myMarker); 

      i = getIntent(); 
      if(i.getBooleanExtra("maps", true)) { 
       location_marker.setTitle(i.getStringExtra("nama")); 
       mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(dest, 16)); 
      } 
      else { 
       mMap.setInfoWindowAdapter(new MarkerInfoWindowAdapter()); 
      } 
     } 
    } 
} 

public class MarkerInfoWindowAdapter implements GoogleMap.InfoWindowAdapter 
{ 
    @Override 
    public View getInfoWindow(Marker marker) { 
     return null; 
    } 

    @Override 
    public View getInfoContents(Marker marker) { 
     View v = getLayoutInflater().inflate(R.layout.info_windowlayout, null); 

     MyMarker myMarker = mMarkersHashMap.get(marker); 

     TextView markerLabel = (TextView) v.findViewById(R.id.marker_label); 
     markerLabel.setText(myMarker.getmLabel()); 

     ImageView foto = (ImageView) v.findViewById(R.id.foto); 
     Picasso.with(getApplicationContext()).load(myMarker.getmImage()).placeholder(R.layout.progress).error(R.mipmap.error).into(foto); 

     TextView anotherLabel = (TextView) v.findViewById(R.id.another_label); 
     anotherLabel.setText("Baca selengkapnya..."); 

     return v; 
    } 
} 
+0

Buna [http://stackoverflow.com/questions/24528482/image-not-loading-from-url-in-custom-infowindow-using-picasso-image-loading-libr) yanıtınız var. . Güzel bir çözüm değil, ama işe yarıyor. –

cevap

8

bu. Sonuç olarak, ImageView 'u eşzamansız olarak güncelleştiren Picasso gibi — görünümlerindeki değişiklikler bilgi penceresini güncelleştirmez.

Buradaki bir çözüm, Picasso'nun görüntüyü alması ve önbelleğe almasının ardından Marker numaralı telefona showInfoWindow() numaralı telefonu aramaktır. Örneğin, this sample app bilgi pencerelerini doldurmak için Picasso kullanır ve showInfoWindow() aramak için bir Picasso Callback kullanır: Picasso görüntü aldığında, bilgi penceresi hala Marker ilişkili için açıksa

/*** 
    Copyright (c) 2013-2014 CommonsWare, LLC 
    Licensed under the Apache License, Version 2.0 (the "License"); you may not 
    use this file except in compliance with the License. You may obtain a copy 
    of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required 
    by applicable law or agreed to in writing, software distributed under the 
    License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
    OF ANY KIND, either express or implied. See the License for the specific 
    language governing permissions and limitations under the License. 

    From _The Busy Coder's Guide to Android Development_ 
    https://commonsware.com/Android 
*/ 

package com.commonsware.android.mapsv2.imagepopups; 

import android.annotation.SuppressLint; 
import android.content.Context; 
import android.net.Uri; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.widget.ImageView; 
import android.widget.TextView; 
import java.util.HashMap; 
import com.google.android.gms.maps.GoogleMap.InfoWindowAdapter; 
import com.google.android.gms.maps.model.Marker; 
import com.squareup.picasso.Callback; 
import com.squareup.picasso.Picasso; 

class PopupAdapter implements InfoWindowAdapter { 
    private View popup=null; 
    private LayoutInflater inflater=null; 
    private HashMap<String, Uri> images=null; 
    private Context ctxt=null; 
    private int iconWidth=-1; 
    private int iconHeight=-1; 
    private Marker lastMarker=null; 

    PopupAdapter(Context ctxt, LayoutInflater inflater, 
       HashMap<String, Uri> images) { 
    this.ctxt=ctxt; 
    this.inflater=inflater; 
    this.images=images; 

    iconWidth= 
     ctxt.getResources().getDimensionPixelSize(R.dimen.icon_width); 
    iconHeight= 
     ctxt.getResources().getDimensionPixelSize(R.dimen.icon_height); 
    } 

    @Override 
    public View getInfoWindow(Marker marker) { 
    return(null); 
    } 

    @SuppressLint("InflateParams") 
    @Override 
    public View getInfoContents(Marker marker) { 
    if (popup == null) { 
     popup=inflater.inflate(R.layout.popup, null); 
    } 

    if (lastMarker == null 
     || !lastMarker.getId().equals(marker.getId())) { 
     lastMarker=marker; 

     TextView tv=(TextView)popup.findViewById(R.id.title); 

     tv.setText(marker.getTitle()); 
     tv=(TextView)popup.findViewById(R.id.snippet); 
     tv.setText(marker.getSnippet()); 

     Uri image=images.get(marker.getId()); 
     ImageView icon=(ImageView)popup.findViewById(R.id.icon); 

     if (image == null) { 
     icon.setVisibility(View.GONE); 
     } 
     else { 
     Picasso.with(ctxt).load(image).resize(iconWidth, iconHeight) 
       .centerCrop().noFade() 
       .placeholder(R.drawable.placeholder) 
       .into(icon, new MarkerCallback(marker)); 
     } 
    } 

    return(popup); 
    } 

    static class MarkerCallback implements Callback { 
    Marker marker=null; 

    MarkerCallback(Marker marker) { 
     this.marker=marker; 
    } 

    @Override 
    public void onError() { 
     Log.e(getClass().getSimpleName(), "Error loading thumbnail!"); 
    } 

    @Override 
    public void onSuccess() { 
     if (marker != null && marker.isInfoWindowShown()) { 
     marker.showInfoWindow(); 
     } 
    } 
    } 
} 

Temelde, ben showInfoWindow() çağrı . Görsel efekt normal Picasso davranışını andırır: bir yer tutucu, ardından yer tutucunun yerini alan gerçek görüntü.

+0

Kodu bana verebilir misin? Koduma hangi kodu düzenlemeniz veya eklemem gerekir? –

+0

Harika bir açıklama ve örnek. –

+0

Teşekkürler. Şimdi Picasso 'callback' –