Picasso'da animasyonlu yükleme resmi


105

Resim indirilirken görüntülemek için yer tutucunun bir çekilebilir dosyası kullanarak Picasso'da bir resim yüklemek için aşağıdaki koda sahibim. Yine de istediğim şey, çoğu profesyonel uygulamada gördüğüm gibi, görüntü yüklenirken etrafta ve etrafında hareket eden animasyonlu bir dönen ilerleme çubuğu stili döndürücü. Picasso bunu desteklemiyor gibi görünüyor, sadece statik resim çekmeceleri. Picasso ile çalışmasını sağlamanın bir yolu var mı yoksa farklı bir şey yapmam mı gerekiyor?

Picasso.with(context).load(url)             
                    .placeholder(R.drawable.loading)
                    .error(R.drawable.image_download_error)
                    .into(view);

Yanıtlar:


252

Picasso yer tutucusunu kullanarak yükleme ilerleme animasyon görüntüsüne nasıl sahip olunur:

Bunu animasyonlu döndürmeli bir xml nesnesi kullanarak kolayca çözdüm.

Adımlar:

progress_image.png

progress_image.png

/res/drawable/progress_animation.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

<item android:gravity="center">
    <animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
        android:drawable="@drawable/progress_image"
        android:pivotX="50%"
        android:pivotY="50%" />
    </item>
</layer-list>

Picasso yükleniyor:

Picasso.with( context )
        .load( your_path )
        .error( R.drawable.ic_error )
        .placeholder( R.drawable.progress_animation )
        .into( image_view );

32
@DBragion harika çalışıyor, ancak büyük görüntüler için tarandı. genişliğini ve yüksekliğini 32x32 piksel gibi bir sayıya sabitleyebilir miyiz?
m3hdi

9
Bu çalışmıyor, animasyon gösterilmiyor. Sadece sade bir resim
Joe Maher

4
Çalışıyor ama küçük yükleyici istiyorum, görüntü boyutu yükleyicim değil
Ganpat Kaliya

2
İyi çalıştı, animasyon, indirilen görüntü görünmeden önce birkaç milisaniyeye kadar küçük kalıyor, maksimize ediliyor ve birkaç milisaniye için uzatılıyor, ardından görüntü beliriyor. Herhangi bir çözüm var mı?
tinyCoder

2
Kullanım romannurik.github.io/AndroidAssetStudio/index.html mdpi oluşturmak vb hdpi, xhdpi ( "Launcher ikonu jeneratör" seçin)
CoolMind

73

İlerleme iletişim kutusunu görüntü indirene kadar uyguladım ve çok basit. ImageView'unuzu göreceli düzende alın ve ilerleme yükleyiciyi aynı görüntü görünümüne yerleştirin. Aşağıdaki kodu uygulayın ve yalnızca ilerleme iletişim kutusu görünürlüğünü yönetin.

holder.loader.setVisibility(View.VISIBLE);
            holder.imageView.setVisibility(View.VISIBLE);
         final ProgressBar progressView = holder.loader;
            Picasso.with(context)
            .load(image_url)
            .transform(new RoundedTransformation(15, 0))
            .fit()
            .into(holder.imageView, new Callback() {
                @Override
                public void onSuccess() {
                    progressView.setVisibility(View.GONE);
                }

                @Override
                public void onError() {
                    // TODO Auto-generated method stub

                }
            });
        }

Zevk almak. :)


Teşekkürler .. bu bana çok yardımcı oldu :)
Zohair

2
Harika! Şimdiye kadarki en iyi çözüm, birçok farklı bağlamda kullanılabilir. :)
VVZen

7
Aslında, zayıf referanslara dikkat etmeli ve çöp toplamayı önlemek için bu şekilde bir Geri Arama nesnesi bildirmelisiniz (aksi takdirde, Başarı asla çağrılamaz):final Callback loadedCallback = new Callback() { @Override public void onSuccess() { // your code } @Override public void onError() { // your code } }; imageView.setTag(loadedCallback); Picasso.with(context).load(url).into(imageView, loadedCallback);
VVZen

Dilin kafası karışmışsa, Progress Loader bir Progress
Joe Maher

2
RoundedTransformation sınıfını eklemeyi kaçırdınız. Bu ders burada gist.github.com/aprock/6213395
Md. Sajedul Karim

3

Picasso maalesef animasyonlu yer tutucuları desteklemiyor.

Bunu aşmanın bir yolu, ImageView'unuzu, altında animasyonlu çizim ile birlikte bir FrameLayout'a yerleştirmektir. Bu şekilde Picasso, görüntüyü yüklediğinde, animasyonlu yer tutucunun üstüne yükleyerek kullanıcıya istenen efekti verir.

Alternatif olarak, görüntüyü bir Hedefe yükleyebilirsiniz . Ardından, ilerleme çubuğunun varsayılan olarak gösterilir ve onBitmapLoaded yöntemi çağrıldığında bunu gizleyebilir ve görüntüyü görüntüleyebilirsiniz. Bunun temel bir uygulamasını burada görebilirsiniz


3
Picasso , animasyonlu yer tutucuları destekler. Çizilebilir animasyon dosyasını yazarsınız (animasyondaki her bir görüntüyü temsil eden birkaç öğe içeren animasyon listesini içerir). Bu dosyayı yeni bir AnimationDrawable nesnesine besler ve ardından bunu Picasso yükleyici yapıcısındaki placeHolder () öğesine iletirsiniz.
Odaym

1

DBragion'un cevabına aşağıdaki gibi şekil özniteliğini ekleyin ve cazibe gibi çalışacaktır. Mutlu kodlamalar.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>

        <shape
            android:shape="rectangle">

            <size
                android:width="200dp"
                android:height="200dp"/>

            <solid
                android:color="#00FFFFFF"/>
        </shape>
    </item>

    <item android:gravity="center">
        <animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
            android:drawable="@drawable/spinner"
            android:pivotX="50%"
            android:pivotY="50%" />
    </item>
</layer-list>

Glide'ı da kullanabilirsiniz:

Glide.with(activity).load(url)
                    .apply(RequestOptions.centerInsideTransform())
                    .placeholder(R.drawable.progress_animation)
                    .into(imageview);

1

Bu sorunun cevabını buldum!

Bakınız: https://github.com/square/picasso/issues/427#issuecomment-266276253

@DBragion cevabına ek olarak, aşağıyı deneyin.

Şimdi yüksekliği ve genişliği sabitleyebiliriz!

image_view.scaleType = ImageView.ScaleType.CENTER_INSIDE
picasso.load(your_path)
        .fit()
        .centerCrop()
        .noFade()
        .placeholder(R.drawable. progress_animation)
        .into(image_view)

Bence iki kilit nokta var.

  1. noFade () kullan

  2. image_view'un scaleType değerini "CENTER_INSIDE" olarak ayarlayın


0

Bunu şu şekilde çalıştırdım:

  1. Bir çekilebilir öğe oluşturdu (İnternette bir yerde bulundu) ve res / çekilebilir dosyaya koy:

    <?xml version="1.0" encoding="utf-8"?>
    <rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="90"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toDegrees="360">
    
    <shape
        android:innerRadiusRatio="3"
        android:shape="ring"
        android:thicknessRatio="7.0">
    
        <gradient
            android:angle="0"
            android:centerColor="#007DD6"
            android:endColor="#007DD6"
            android:startColor="#007DD6"
            android:type="sweep"
            android:useLevel="false" />
    </shape>

  2. GridView eklenen ProgressBar öğesi için öğemde:

    <ProgressBar
        android:id="@+id/movie_item_spinner"
        android:layout_width="@dimen/poster_width"
        android:layout_height="@dimen/poster_height"
        android:progressDrawable="@drawable/circular_progress_bar"/>
  3. Bağdaştırıcıda, poster ve döndürücünün ImageView ve ProgressBar'a referans olduğu aşağıdaki parametrelere sahip Hedef Nesne eklendi:

    // ImageView'da ProgressBar'ı gösterme / gizleme hedefi

    final Target target = new Target() {
    
            @Override
            public void onPrepareLoad(Drawable drawable) {
                poster.setBackgroundResource(R.color.white);
                spinner.setVisibility(View.VISIBLE);
            }
    
            @Override
            public void onBitmapLoaded(Bitmap photo, Picasso.LoadedFrom from) {
                poster.setBackgroundDrawable(new BitmapDrawable(photo));
                spinner.setVisibility(View.GONE);
            }
    
            @Override
            public void onBitmapFailed(Drawable drawable) {
                poster.setBackgroundResource(R.color.white);
            }
        };
  4. Sonuçlar yüklenirken böyle olacak - daire dönüyor (bu ekran görüntüsü için üzgünüz, ancak görüntüler çok hızlı görünüyor): ScreenShot


0

DBragion'un tekniğini kullanmaya çalışan herkes için: Picasso'nun en son sürümüne sahip olduğunuzdan emin olun, aksi takdirde dönmeyecektir. 2.5.2 sürümünü kullanana kadar benimki çalışmadı.

compile 'com.squareup.picasso:picasso:2.5.2'

6
Bu, söz konusu cevabın altında bir yorum olmalı
Ojonugwa Jude Ochalifu

0

Bu bağlantıda Jake Wharton şunları söyledi:

Hayır! Tüm görüntü kod çözme işlemleri için Android BitmapFactory'yi kullanıyoruz ve animasyonlu GIF desteği yok (ne yazık ki).

O zaman yapamazsın


0

Picasso PlaceHolder'ı kullanın

  Picasso.get()
        .load(datas[position].artist?.image)
        .placeholder(R.drawable.music_image)
        .error(R.drawable.music_image)
        .into(holder.cardViewImage)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.