使用ImageView的ScaleType设置TransitionDrawable

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);
}

在XML布局中,ImageView的scaleType设置为centerCrop。然而,当交叉淡化完成后,新位图被设置为fitXY。在其他线程中,他们说可以通过重新设置scaleType来解决,但这也不起作用。调整位图大小在内存方面不是一个适当的解决方案。有没有任何解决方法来实现这个?非常感谢。
附注:请不要建议交叉淡化2个ImageView,或使用ViewSwitcher,谢谢。

scaleType 自己改变了?怎么回事? - pskink
还有:transitionDrawable.getIntrinsic*() 返回什么?这些尺寸可以吗? - pskink
我不确定你的意思。这些图片尺寸不同。 - Quark
1个回答

3
我遇到了同样的问题。问题在于,一个 TransitionDrawable 需要两个相同大小的 drawable。如果它们不是相同的大小,它会拉伸至第一张图片的大小。Picasso 已经处理了这个问题。所以我从 Picasso 中取出 PicassoDrawable,先设置占位符,然后再设置位图。
PicassoDrawable.setPlaceholder(imageView, placeholderDrawable);
PicassoDrawable.setBitmap(imageView, context, bitmap);

你可能需要将类和这些方法设置为public。我还删除了一些仅适用于Picasso的方法。现在,它应该能够正确地淡入淡出不同尺寸的图像。


这实际上是有效的;然而,在过渡运行之前,当前占位符会缩小一秒钟。因此,这只是扭转了问题而没有解决它。 - Mohamed Salah
1
如果纵横比不同,那么它的大小确实会改变。但这并没有解决第二张图片纵横比错误的问题。实际上,它会改变可绘制对象的固有大小,因为加载的可绘制对象大小不同。不幸的是,我还没有在任何地方看到过这个处理方式。PicassoDrawable 是我找到的最接近的方法。 - Kevin van Mierlo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接