2016-09-17 9 views
1

私はプログラムでカスタムインフォウィジェットをレイアウトしようとしています。 Picasaを使用してstreetViewプレビュー画像を読み込みたいのですが、画像が表示されないのはなぜですか?ピカソ画像がカスタムinfoWindowに読み込まれない理由は何ですか?

private View prepareInfoView(Marker marker){ 
    //prepare InfoView programmatically 
    LinearLayout infoView = new LinearLayout(EarthquakeActivity.this); 
    LinearLayout.LayoutParams infoViewParams = new LinearLayout.LayoutParams(
      LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
    infoView.setOrientation(LinearLayout.VERTICAL); 
    // attach the above layout to the infoView 
    infoView.setLayoutParams(infoViewParams); 

    //create street view preview @ top 
    ImageView streetViewPreviewIV = new ImageView(EarthquakeActivity.this); 
    // this scales the image to match parents WIDTH?, but retain image's height?? 
    LinearLayout.LayoutParams streetViewImageViewParams = new LinearLayout.LayoutParams(
      LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
    streetViewPreviewIV.setLayoutParams(streetViewImageViewParams); 

    String imageURL = "https://maps.googleapis.com/maps/api/streetview?size=200x200&location="; 
    String markerLongitude = Double.toString(marker.getPosition().longitude); 
    String markerLatitude = Double.toString(marker.getPosition().latitude); 
    imageURL += markerLatitude + "," + markerLongitude + "&fov=120&heading=0&pitch=0"; 
    Log.wtf("prepareInfoView", imageURL); 

    Picasso.with(this).load(imageURL).into(streetViewPreviewIV); 
    infoView.addView(streetViewPreviewIV); 

uriを追加するapiキーの有無にかかわらず試しました。

キーを使用しないで数回クリックするだけで動作しましたが、それ以降はありません。あまりにも遅いため、Androidはそれを使わずに情報ウィンドウを放棄して読み込むことができるからですか?これを行うクラスの方法で最高ですか?

別の画像読み込みライブラリがうまく機能しますか? Googleのボレーですか?

は、また

LinearLayout.LayoutParams

と私はすなわちmatch_parent情報ウィンドウの幅を横切ってストレッチする画像のようにしたい、と元の縦横比を維持するために、垂直方向に拡張しますどうすればいいですか?

これは私がこのフラグを追加私の答えcommonsWare新しいクラスで

です:

@Override 
public void onSuccess() { 
    Log.i(TAG, "image got, should rebuild window"); 
    if (marker != null && marker.isInfoWindowShown()) { 
     Log.i(TAG, "conditions met, redrawing window"); 
     marker.setTag(new Boolean("True")); 
     marker.showInfoWindow(); 
    } 
} 

そしてprepareInfoViewで、私は旗の欠如のためにテストします。

if (marker.getTag() == null) { 
     Log.i("prepareInfoView", "fetching image"); 
     Picasso.with(this).load(imageURL).fetch(new MarkerCallback(marker)); 
    } 
    else { 
     Log.wtf("prepareInfoView", "building info window"); 

パーティー! :)

答えて

5

Androidがあまりにも遅いので、Androidはそれを使わずに情報ウィンドウを放棄して読み込むためですか?

Picassoは、イメージがキャッシュされていない限り、非同期にロードされます。そして、地図V2の仕組みはViewが返され、Bitmapに変換されてレンダリングされます。その結果、PicasaとMaps V2の競合状態が発生します(Bitmapが作成される前にイメージが読み込まれるのですか?)、特定の情報ウィンドウが機能するかどうかは不確定です。

ピカソに画像が読み込まれた後にMarkershowInfoWindow()と電話すると、ピカソのキャッシュからImageViewを入力できます。 Markerで呼び出されたshowInfoWindow()は、Maps V2を起動して情報ウィンドウを再生成します。例えば

、あなたのようなMarkerCallbackで、into(streetViewPreviewIV, new MarkerCallback(marker))に既存のinto()コールを変更することができます:

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(); 
     } 
    } 
    } 

は別の画像をより良い図書館の仕事をロードしますか? Googleのボレーですか?

これらはすべて同じ問題を抱えています。私は非同期であり、アウト ピカソロードイメージを考え出し、そのマーカーは、それが情報ウィンドウだ示したときに、内部メソッドにgetInfoContentsを呼び出すことにより、クリックした後、または

public class MarkerCallback implements Callback { 
    Marker marker=null; 
    String URL; 
    ImageView userPhoto; 


    MarkerCallback(Marker marker, String URL, ImageView userPhoto) { 
     this.marker=marker; 
     this.URL = URL; 
     this.userPhoto = userPhoto; 
    } 

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

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

      Picasso.with(getActivity()) 
        .load(URL)       
        .into(userPhoto); 

      marker.showInfoWindow(); 
     } 
    } 
} 
+0

おかげCommonsWare、非常に有益を必要とするかどうかを確認するためにそれを使用するよう、最新の画像を追跡します。私はあなたのソリューションが好きで、それを実装しましたが、無限ループを引き起こします!それは画像を何度も繰り返し取得し続けます。あまりにもあなたの注意のためにありがとうございます:) –

+0

@トニースターク:ああ、ええ、おそらくこれを回避する私の全体的なアダプタのいくつかのビットがあります。ここでは、サンプルプロジェクト全体です:https://github.com/commonsguy/cw-omnibus/tree/master/MapsV2/ImagePopups – CommonsWare

+0

ありがとうCommonsWare、私は実際に元のコードが働いて、ちょうど、ブールを転送するために、marker.setTagを使用している旗を横切って私は答えに質問を更新し、あなたに信用します。ある日私はcommonsWare masterfulになりたい:) –

4

はこれですgetInfoWindowメソッド 画像がPicassoによってまだダウンロードまたはキャッシュされていない場合、infoWindowには表示されません。 Picasaは、infoWindowの画像ビューに画像を読み込もうとしますが、GoogleマップV2によると、インフォメーションウィンドウが読み込まれた後は操作できませんので、画像はUIで更新されません。 しかし、インフォウィンドウビューは実際には更新されましたが、制限のために表示されませんでした。infowindowを非表示にして表示すると、更新され、更新されたinfoWindowに表示されます。

マーカー参照を保持する必要がありますが、これをアクティビティー/フラグメントのメンバー変数として保持することができます。私もこれで苦労し

Picasso.with(context) 
         .load(marker.getSnippet()) 
         .placeholder(R.drawable.ic_placeholder) 
         .into(imageView, new Callback() { 
         @Override 
         public void onSuccess() { 

          if (currentClickedMarker != null && currentClickedMarker.isInfoWindowShown()) { 
//toggle the marker's infoWindow 
           currentClickedMarker.hideInfoWindow(); 

           currentClickedMarker.showInfoWindow(); 
          } 
         } 

         @Override 
         public void onError() { 

         } 
        }); 
1

すべて:私のために働いている何

0

、ここでは受け入れ答えからインスピレーションを得たグライドとソリューションです。 このソリューションは、画像を適切なサイズにリサイズせずに私のために働かなかった。 override()(とcenterCrop)とはやっていました。

private String previousImageUrl = null; 

そして、あなたは現在の画像のリフレッシュに

googleMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() { 
    @Override 
    public View getInfoWindow(Marker marker) { 
     return null; 
    } 

    @Override 
    public View getInfoContents(final Marker marker) { 
     View view = LayoutInflater.from(getContext()).inflate(R.layout.layout_map_info_window, null); 
     MyObject myObject = (MyObject) marker.getTag(); 
     final String url = myObject.getImageUrl(); 
     final ImageView imageView = (ImageView) view.findViewById(R.id.image_view); 
     GlideApp.with(getContext()).load(url) 
       .override(imageWidth, imageHeight) // made the difference 
       .centerCrop() 
       .into(new SimpleTarget<Drawable>() { 
        @Override 
        public void onResourceReady(Drawable resource, Transition<? super Drawable> transition) { 
         imageView.setImageDrawable(resource); 
         if (!TextUtils.equals(url, previousImageUrl)) { 
          previousImageUrl = url; 
          marker.showInfoWindow(); 
         } 
        } 
       }); 
     return view; 
    } 
}); 
関連する問題