2015-09-14 13 views
5

Picasso kütüphanesini kullanarak bir URL'den bir Bitmap'e bir görüntü yüklemek için uğraşıyorum, ancak bulduğum örneklerin çoğu bir Bitmap'i bir ImageView'a veya benzeri bir .Bir görüntüyü bir bitmap'e yüklemek için Picasso kullanma

Kod, belgelere göre böyle bir şey olmalıdır.

public void loadImage() { 

     Picasso.with(getBaseContext()).load("image url").into(new Target() { 

      @Override 
      public void onPrepareLoad(Drawable arg0) { 
      } 
      @Override 
      public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom arg1) { 
       Bitmap bitImage = Bitmap(getApplicationContext(),bitmap); 
      } 
      @Override 
      public void onBitmapFailed(Drawable arg0) { 
      } 
     }); 
    } 

Ama Bitmap bitImage = Bitmap(getApplicationContext(),bitmap); i`m bir yöntem çağrısı beklenen hatası alıyorum beri, doğru görünmüyor.

cevap

2

düzgün Bitmap yaratmak değildir gibi görünüyor, ama ben senin yerinde olsaydım şöyle bir ölçekli bitmap oluşturmak olacaktır: Sonra

public Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight) { 
    int width = bm.getWidth(); 
    int height = bm.getHeight(); 
    float scaleWidth = ((float) newWidth)/width; 
    float scaleHeight = ((float) newHeight)/height; 
    // CREATE A MATRIX FOR THE MANIPULATION 
    Matrix matrix = new Matrix(); 
    // RESIZE THE BIT MAP 
    matrix.postScale(scaleWidth, scaleHeight); 

    // "RECREATE" THE NEW BITMAP 
    Bitmap resizedBitmap = Bitmap.createBitmap(
    bm, 0, 0, width, height, matrix, false); 
    bm.recycle(); 
    return resizedBitmap; 
} 

şöyle bir imageView ayarlayın:

mImg.setImageBitmap(img); 

Genel olarak şu şekilde görünecektir:

public void loadImage() { 

    Picasso.with(getBaseContext()).load("image url").into(new Target() { 
      // .... 

      @Override 
      public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom arg1) { 
       // Pick arbitrary values for width and height 
       Bitmap resizedBitmap = getResizedBitmap(bitmap, newWidth, newHeight); 
       mImageView.setBitmap(resizedBitmap); 
      } 

      // .... 
     }); 
    } 
} 

public Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight) { 
    int width = bm.getWidth(); 
    int height = bm.getHeight(); 
    float scaleWidth = ((float) newWidth)/width; 
    float scaleHeight = ((float) newHeight)/height; 
    // CREATE A MATRIX FOR THE MANIPULATION 
    Matrix matrix = new Matrix(); 
    // RESIZE THE BIT MAP 
    matrix.postScale(scaleWidth, scaleHeight); 

    // "RECREATE" THE NEW BITMAP 
    Bitmap resizedBitmap = Bitmap.createBitmap(
    bm, 0, 0, width, height, matrix, false); 
    bm.recycle(); 
    return resizedBitmap; 
} 

Amakullanarak sorutamamen, genellikle çok özel bir durum içindir. Görüntüleri gösterecek aynı sınıfta Picasso'un tekil numarasını aramalısınız.

Picasso.with(mContext) 
    .load("image url") 
    .into(mImageView); 
+0

sayesinde zaten boyutlandırma için yerinde yöntemleri (var http://developer.android.com/training/displaying-bitmaps/load-bitmap: Genellikle bu bir Adapter (RecyclerView Adaptörü belki) şöyle içindedir .html). Sadece bir URL'den bir görüntüyü Bitmap'e (doğrudan bir ImageView'a değil) yüklemem gerekiyordu, bu da yukarıdaki yorumlardan anlaşılıyordu. Çok teşekkürler. – Alex

+0

Görüntüyü yüklemek için neden zaman uyumsuz bir görev kullanıyorsunuz? Sadece .into (mImageView, yeni Geri Arama <> {...}) bir geri çağırma uygulayabilirsiniz; – AndyRoid

+0

Aslında, bir resim bir bitmap'e yüklemek için hızlı bir yol deniyordu, bu da gerçekten kaynak klasöründen yüklemek yerine bir Bağdaştırıcıya (RecycleView) geçirilecek. Http://stackoverflow.com/questions/32554358/encountering-lag-when-updating-a-cardview-item-in-a-recycleview adresinde açıklanan bir sorunu ayıklamaya çalışıyorum. Resmi, görüntülenecekleri sınıfta yüklemeyi deneyeceğim. Ama Picasso'nun sadece bir etkinlik sınıfında kullanılabileceğini ya da en azından bazı mesajlardan anladığım kadarıyla. Bağlamı Bağdaştırıcı sınıfına iletmem gerektiğini düşünüyorum. – Alex

İlgili konular