5

ImageView の背景をクロスフェードする次のコードがあります。

private void setWithCrossfade(Bitmap bitmap) {
    //create drawable vector
    Drawable backgrounds[] = new Drawable[2];
    //getting first image
    backgrounds[0] = mImageView.getDrawable();
    backgrounds[1] = new BitmapDrawable(mImageView.getResources(), bitmap);

    TransitionDrawable transitionDrawable = new TransitionDrawable(backgrounds);
    transitionDrawable.setCrossFadeEnabled(true);

    mImageView.setAdjustViewBounds(false);
    mImageView.setImageDrawable(transitionDrawable);
    //it is needed to reset scale type
    mImageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
    //start crossfading
    transitionDrawable.startTransition(250);
}

ImageViewはXML レイアウトで にscaleType設定されます。centerCropただし、クロスフェードが終了すると、新しいビットマップは に設定されfitXYます。他のスレッドでは、をリセットすることで解決できると言われていますがscaleType、機能していません。ビットマップのサイズを変更することは、メモリの観点からは適切な解決策ではありません。これを実装するための回避策はありますか? どうもありがとうございました。

PS: 2 つの ImageView のクロスフェードや、ViewSwitcher の使用を提案しないでください。

4

1 に答える 1

3

私も同じ問題を抱えていました。問題はTransitionDrawable、同じサイズの 2 つのドローアブルが必要なことです。同じサイズでない場合は、最初の画像のサイズに引き伸ばされます。ピカソはすでにこれを扱っています。そこで、 Picasso からPicassoDrawableを取得し、最初にプレースホルダーを設定し、次にビットマップを設定しました。

PicassoDrawable.setPlaceholder(imageView, placeholderDrawable);
PicassoDrawable.setBitmap(imageView, context, bitmap);

クラスとそれらのメソッドをパブリックに設定する必要がある場合があります。また、ピカソにのみ関連するいくつかのメソッドを削除しました。これで、さまざまな画像サイズで正しくフェードするはずです。

于 2015-06-22T09:19:58.627 に答える