Android 使用.asBitmap()加载图像时,淡入淡出动画不起作用
我有这个密码Android 使用.asBitmap()加载图像时,淡入淡出动画不起作用,android,android-animation,android-imageview,android-glide,Android,Android Animation,Android Imageview,Android Glide,我有这个密码 Glide .with(this) .load(mUrl) .asBitmap() .thumbnail(Glide .with(this) .load(mPreviewUrl) .asBitmap() .animate(R.an
Glide
.with(this)
.load(mUrl)
.asBitmap()
.thumbnail(Glide
.with(this)
.load(mPreviewUrl)
.asBitmap()
.animate(R.anim.fade_in))
.listener(new RequestListener<String, Bitmap>() {
@Override
public boolean onException(Exception e, String model, Target<Bitmap> target, boolean isFirstResource) {
mProgressBar.setVisibility(View.GONE);
return false;
}
@Override
public boolean onResourceReady(Bitmap resource, String model, Target<Bitmap> target, boolean isFromMemoryCache, boolean isFirstResource) {
mProgressBar.setVisibility(View.GONE);
return false;
}
})
.into(new SimpleTarget<Bitmap>(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
mWallpaperImageView.setImageBitmap(resource);
createPaletteAsync(resource);
}
});
然后图像淡入淡出,但我没有位图
对象 根据
不幸的是,没有一种内置的方式来交叉淡入淡出位图。你
但是,可以使用自定义BitmapImageViewTarget,并使用
将onResourceReady()中的TransitionDrawable转换为交叉淡入淡出
幸运的是,有一个技巧可以启用
为此,你需要两门课
淡入淡出
final public class FadingDrawable extends BitmapDrawable {
// Only accessed from main thread.
private static final float FADE_DURATION = 200; //ms
private final float density;
Drawable placeholder;
long startTimeMillis;
boolean animating;
int alpha = 0xFF;
FadingDrawable(Context context, Bitmap bitmap, Drawable placeholder) {
super(context.getResources(), bitmap);
this.density = context.getResources().getDisplayMetrics().density;
this.placeholder = placeholder;
animating = true;
startTimeMillis = SystemClock.uptimeMillis();
}
/**
* Create or update the drawable on the target {@link android.widget.ImageView} to display the supplied bitmap
* image.
*/
static public void setBitmap(ImageView target, Context context, Bitmap bitmap) {
if (bitmap != null && !bitmap.isRecycled()) {
Drawable placeholder = target.getDrawable();
if (placeholder instanceof AnimationDrawable) {
((AnimationDrawable) placeholder).stop();
}
FadingDrawable drawable = new FadingDrawable(context, bitmap, placeholder);
//this will avoid OverDraw
//target.setBackgroundDrawable(null);
//target.setBackgroundColor(0);
target.setImageDrawable(drawable);
}
}
/**
* Create or update the drawable on the target {@link android.widget.ImageView} to display the supplied
* placeholder image.
*/
static void setPlaceholder(ImageView target, Drawable placeholderDrawable) {
target.setImageDrawable(placeholderDrawable);
if (target.getDrawable() instanceof AnimationDrawable) {
((AnimationDrawable) target.getDrawable()).start();
}
}
@Override
public void draw(Canvas canvas) {
if (!animating) {
super.draw(canvas);
} else {
float normalized = (SystemClock.uptimeMillis() - startTimeMillis) / FADE_DURATION;
if (normalized >= 1f) {
animating = false;
placeholder = null;
super.draw(canvas);
} else {
if (placeholder != null) {
placeholder.draw(canvas);
}
int partialAlpha = (int) (alpha * normalized);
super.setAlpha(partialAlpha);
super.draw(canvas);
super.setAlpha(alpha);
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) {
invalidateSelf();
}
}
}
}
@Override
public void setAlpha(int alpha) {
this.alpha = alpha;
if (placeholder != null) {
placeholder.setAlpha(alpha);
}
super.setAlpha(alpha);
}
@Override
public void setColorFilter(ColorFilter cf) {
if (placeholder != null) {
placeholder.setColorFilter(cf);
}
super.setColorFilter(cf);
}
@Override
protected void onBoundsChange(Rect bounds) {
if (placeholder != null) {
placeholder.setBounds(bounds);
}
super.onBoundsChange(bounds);
}
}
现在将您的mWallpaperImageView从ImageView
更改为
<com.yourpackage.GlideImageView
android:id="@+id/mWallpaperImageView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
最后从Glide配置中移除所有外部动画效果
Glide
.with(this)
.load(mUrl)
.asBitmap()
.thumbnail(Glide
.with(this)
.load(mPreviewUrl)
.asBitmap()
.listener(new RequestListener<String, Bitmap>() {
@Override
public boolean onException(Exception e, String model, Target<Bitmap> target, boolean isFirstResource) {
mProgressBar.setVisibility(View.GONE);
return false;
}
@Override
public boolean onResourceReady(Bitmap resource, String model, Target<Bitmap> target, boolean isFromMemoryCache, boolean isFirstResource) {
mProgressBar.setVisibility(View.GONE);
return false;
}
})
.into(new SimpleTarget<Bitmap>(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
mWallpaperImageView.setImageBitmap(resource);
createPaletteAsync(resource);
}
});
Glide
.与(此)
.负载(mUrl)
.asBitmap()
.缩略图(滑动)
.与(此)
.负载(mPreviewUrl)
.asBitmap()
.listener(新的RequestListener(){
@凌驾
公共布尔onException(异常e、字符串模型、目标、布尔isFirstResource){
mProgressBar.setVisibility(View.GONE);
返回false;
}
@凌驾
公共布尔值onResourceReady(位图资源、字符串模型、目标、布尔值isFromMemoryCache、布尔值isFirstResource){
mProgressBar.setVisibility(View.GONE);
返回false;
}
})
.into(新SimpleTarget(Target.SIZE_原始,Target.SIZE_原始){
@凌驾
public void onResourceReady(位图资源、GlideAnimation){
mWallpaperImageView.setImageBitmap(资源);
CreatePaletteSync(资源);
}
});
已测试且工作正常!您可以使用图像的alpha值创建淡入或淡出效果: 在爪哇
yourimage.animate().setAlpha(0f).setDuration(2000);
假设图像的alpha以alpha=1开始(不透明)。
因此,图像将在2秒内消失(透明)我不能同时使用.crossFade和.asBitmap,它给出了一个错误。谢谢,但它不起作用,请参阅我用实际代码更新了我的问题。可能是因为它应用于缩略图吗?Glide.clear(此)方法不推荐使用,那么现在哪种方法可用(对于4.4.0版本)?@prokashsarkart两件事:我希望图像淡入而不是淡出,其次,我应该把什么称为“你的图像”?谢谢。@user11230 1。在制作动画之前,请将图像的alpha设置为0f。使用“动画”时,请将alpha设置为1f。2.A图像view@RimaIbrahim如果从0 alpha开始设置动画,则会立即丢失占位符。因此占位符将闪烁到空白处,然后新位图淡入。这看起来不太好。
Glide
.with(this)
.load(mUrl)
.asBitmap()
.thumbnail(Glide
.with(this)
.load(mPreviewUrl)
.asBitmap()
.listener(new RequestListener<String, Bitmap>() {
@Override
public boolean onException(Exception e, String model, Target<Bitmap> target, boolean isFirstResource) {
mProgressBar.setVisibility(View.GONE);
return false;
}
@Override
public boolean onResourceReady(Bitmap resource, String model, Target<Bitmap> target, boolean isFromMemoryCache, boolean isFirstResource) {
mProgressBar.setVisibility(View.GONE);
return false;
}
})
.into(new SimpleTarget<Bitmap>(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
mWallpaperImageView.setImageBitmap(resource);
createPaletteAsync(resource);
}
});
yourimage.animate().setAlpha(0f).setDuration(2000);