ピカソのアニメーション読み込み画像


105

次のコードを使用して、画像のダウンロード中にプレースホルダーのドローアブルを表示し、ピカソに画像をロードします。私が欲しいのは、ほとんどのプロのアプリで見られるように、画像の読み込み中に何度もアニメーションする、回転するプログレスバースタイルのスピナーです。Picassoはこれをサポートしていないようで、静的なイメージドローアブルのみです。ピカソで動作させる方法はありますか、それとも何か別のことをする必要がありますか?

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

回答:


252

ピカソのプレースホルダーを使用して読み込みの進行状況のアニメーション画像を作成する方法:

これはanimated-rotate xmlオブジェクトを使用して簡単に解決できました。

手順:

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.with( context )
        .load( your_path )
        .error( R.drawable.ic_error )
        .placeholder( R.drawable.progress_animation )
        .into( image_view );

32
@DBragionはうまく機能しますが、大きな画像の場合は呼び出されます。それの幅と高さを32x32ピクセルのような数に固定できますか?
m3hdi

9
これは機能せず、アニメーションは表示されません。単純な画像
Joe Maher

4
それは動作していますが、imageviewサイズのローダーではなく小さなローダーが必要です
Ganpat

2
正常に動作し、ダウンロードされた画像が表示される前の数ミリ秒までアニメーションは小さいままです。アニメーションは最大化され、数ミリ秒間引き伸ばされてから画像が表示されます。何か解決策はありますか?
tinyCoder 2017年

2
使用romannurik.github.io/AndroidAssetStudio/index.html( "ランチャーアイコンジェネレータ"を選択)などMDPI、hdpi、xhdpiを作成する
CoolMind

73

画像のダウンロードとその非常に簡単なまで、進行状況ダイアログを実装しました。ImageViewを相対レイアウトで取得し、進行状況ローダーを同じ画像ビューに配置します。以下のコードを適用して、進行状況ダイアログの表示のみを処理します。

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

                }
            });
        }

楽しい。:)


ありがとう..これは私をたくさん助けてくれました:)
Zohair

2
すごい!これまでのところ最高のソリューションは、さまざまな状況で使用できます。:)
VVZen 2016年

7
実際に、あなたは弱参照に注意を払うと宣言する必要がありますコールバックオブジェクトを、このように回避ガベージコレクションするために、(そうでなければするonSuccessが呼び出されることはありません飽きない可能性):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

専門用語に混乱している人は誰でも、Progress LoaderはProgress Badです
Joe Maher

2
RoundedTransformationクラスの追加に失敗しました。このクラスはこちらgist.github.com/aprock/6213395
Ms. Sajedul Karim

3

Picassoは残念ながらアニメーションのプレースホルダーをサポートしていません。

これを回避できる1つの方法は、ImageViewをアニメーション化されたドローアブルを下にしてFrameLayoutに配置することです。このようにして、ピカソが画像をロードすると、アニメーション化されたプレースホルダーの上にロードされ、ユーザーに意図した効果を与えます。

または、ターゲットにイメージをロードすることもできます。すると、デフォルトで進行状況バーが表示され、onBitmapLoadedメソッドが呼び出されると、それを非表示にして画像を表示できます。これの基本的な実装をここで見ることができます


3
ピカソアニメーションプレースホルダーをサポートしています。アニメーションのドローアブルファイルを作成します(アニメーションの各画像を表すいくつかのアイテムを含むアニメーションリストが含まれます)。そのファイルを新しいAnimationDrawableオブジェクトにフィードし、それをPicassoローダーコンストラクターのplaceHolder()に渡します。
Odaym

1

以下のようにDBragionの回答に形状属性を追加するだけで、魅力のように機能します。ハッピーコーディング。

<?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.with(activity).load(url)
                    .apply(RequestOptions.centerInsideTransform())
                    .placeholder(R.drawable.progress_animation)
                    .into(imageview);

1

この質問への回答が見つかりました。

参照:https : //github.com/square/picasso/issues/427#issuecomment-266276253

@DBragionの回答に加えて、以下をお試しください。

これで高さと幅を修正できます!

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

二つのポイントがあると思います。

  1. noFade()を使用

  2. image_viewのscaleTypeを "CENTER_INSIDE"に設定します


0

私はそれを次のように機能させました:

  1. ドローアブルを作成し(インターネットのどこかにあります)、それをres / drawableに配置します。

    <?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の私のアイテムにProgressBar要素を追加しました:

    <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. アダプターでは、次のパラメーターでターゲットオブジェクトを追加しました。ここで、ポスターとスピナーはImageViewとProgressBarへの参照です。

    // ImageViewでProgressBarを表示/非表示にするターゲット

    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. ロード時の結果は次のようになります-円が回転しています(このスクリーンショットでは申し訳ありませんが、画像の表示が速すぎます): ScreenShot


0

DBragionのテクニックを使用しようとしている人のために:最新バージョンのPicassoを使用しているか、回転しないことを確認してください。私はバージョン2.5.2を使用するまで機能しませんでした。

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

6
これは、上記の回答の下のコメントである必要があります
Ojonugwa Jude Ochalifu 2017

0

このリンクの中で、ジェイクウォートンは次のように述べています。

いいえ。すべての画像のデコードにはAndroid BitmapFactoryを使用しており、アニメーションGIFはサポートされていません(残念ながら)。

その後、できません


0

ピカソプレイスホルダーを使うだけ

  Picasso.get()
        .load(datas[position].artist?.image)
        .placeholder(R.drawable.music_image)
        .error(R.drawable.music_image)
        .into(holder.cardViewImage)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.