2014-08-27 6 views
14

Używam biblioteki picasso do pobierania i ładowania obrazów do obrazu. teraz chcę wiedzieć, jak mogę uzyskać szerokość i wysokość obrazu przed załadowaniem ich w widoku obrazu?Uzyskiwanie szerokości i wysokości obrazu przy użyciu biblioteki Picasso

Mam listview z adapterem, który zawiera dwa obrazki (jeden z nich jest pionowy, a drugi poziomy). zależy od szerokości i wysokości obrazu, chcę załadować obraz do jednego z widoków obrazu.

+0

Sprawdź to http://stackoverflow.com/questions/8880376/how-to-get-height-and-width-of-a-image-used-in-android – Aniruddha

+0

Można użyć 'int finalHeight = iv.getMeasuredHeight(); int finalWidth = iv.getMeasuredWidth(); ', gdzie' iv' to twój obiekt ImageView. – Aniruddha

+0

@Airirddha to działa po załadowaniu obrazu w widoku obrazu! ale chcę wiedzieć, rozmiar obrazu przed załadowaniem, że – user2549089

Odpowiedz

28

można uzyskać wymiary bitmapy tylko po pobraniem - należy użyć synchroniczne wywołanie metody tak:

final Bitmap image = Picasso.with(this).load("http://").get(); 
int width = image.getWidth(); 
int height = image.getHeight(); 

Po tym można wywołać ponownie załadować z tej samej zawartości (zostanie pobrana z pamięci podręcznej):

Picasso.with(this).load("http://").into(imageView) 

Edit: Może lepszy sposób:

Picasso.with(this).load("http://").into(new Target() { 
      @Override 
      public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
       int width = bitmap.getWidth(); 
       int height = bitmap.getHeight(); 
       imgView.setImageBitmap(bitmap); 
      } 

      @Override 
      public void onBitmapFailed(Drawable errorDrawable) { 

      } 

      @Override 
      public void onPrepareLoad(Drawable placeHolderDrawable) { 

      } 
     }); 
+3

Tylko do zakończenia odpowiedzi: Nie można wywołaj tę rozmowę w głównym wątku, ponieważ jest to synchronizacja. Dlatego musisz uruchomić na przykład AsyncTask, który robi to w tle i wraca, gdy obraz został załadowany. – Klaus

+0

Również to nie działa dobrze z RecyclerView –

+0

To będzie działać słabo z 'RecyclerView' ze względu na asynchroniczną naturę picassa w połączeniu z faktem, że twoje' ViewHolders' będzie poddane recyklingowi (wiele obrazów wpada w niewłaściwe pozycje podczas przewijania przez kanał ponieważ są one ładowane do ich starego widoku). –

1

Pracuj dla mnie.

Picasso.with(context).load(imageLink).into(imageView, new Callback() { 
     @Override 
     public void onSuccess() { 
      Picasso.with(context).load(imageLink).into(new Target() { 
       @Override 
       public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
        int width = bitmap.getWidth(); 
        int height = bitmap.getHeight(); 
        Log.d("ComeHere ", " W : "+ width+" H : "+height); 
       } 

       @Override 
       public void onBitmapFailed(Drawable errorDrawable) { 

       } 

       @Override 
       public void onPrepareLoad(Drawable placeHolderDrawable) { 

       } 
      }); 

     } 

     @Override 
     public void onError() { 

     } 
    }); 
+0

Dlaczego ponownie załadowałbyś obraz w metodzie onSuccess? –