如何延迟毕加索图像加载?
How to delay Picasso image loading?
我在 MainActivity (GridView) 和 DetailActivity 之间实现了共享元素 activity 过渡动画。当item被点击时,Grid item中的图片会放大成为DetailActivity中的背景图片。我通过将 MainActivity 上的图像保存到文件中,然后在通过 picasso 下载更高质量的图像之前将其用作 DetailActivity 中的占位符图像,使过渡非常顺利。当毕加索完成任务后,更高质量的图像将非常整齐地替换占位符。
来自 DetailActivityFragment.java
中 onCreateView() 的代码
ImageView iv = (ImageView) mRootview.findViewById(R.id.movie_poster);
try {
// Prepare "InterimPoster" jpeg file to be placeholder image
Bitmap bitmap = BitmapFactory.decodeStream(c.openFileInput("InterimPoster"));
Picasso.with(c).load("http://image.tmdb.org/t/p/w780" + mMovieInfo[2])
.placeholder(new BitmapDrawable(getResources(), bitmap))
.fit()
.centerCrop()
.noFade()
.into(iv);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
至于动画,我在 link 这里的步骤 1-3 https://guides.codepath.com/android/Shared-Element-Activity-Transition
中实现了它
但是,当较高质量的图像在过渡动画完成之前完成下载时,有时会出现闪烁。放大图片在移动时会被新图片替换,这是一个令人不愉快的动画。
所以我想知道如何解决此闪烁问题?我能想到的一件事是延迟图像下载,因为我已经有较低质量的图像作为占位符。我怎样才能做到这一点?
Here the video。
通常,在我的测试设备上它有 80% 的时间是平滑的,但幸运的是在这个视频中它大部分时间都在闪烁。
什么是动画?动画结束时加载图像
TranslateAnimation translateAnimation = new TranslateAnimation(0,1.5f,0,1.5f);
translateAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
//load image when animation end
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
和
LayoutTransition.TransitionListener transitionListener = new LayoutTransition.TransitionListener() {
@Override
public void startTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) {
}
@Override
public void endTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) {
//load image when animation end
}
};
现在我找到了延迟 Picasso 图像加载(或任何其他任务)的方法。使用 Handler and Runnable.
真的很简单
现在我的代码看起来像这样。无论如何,现在图像替换非常顺利。
// Set Background Poster in Try-catch in case file cannot be open
try {
// Get/Prepare "InterimPoster" jpeg file to be placeholder image
final ImageView iv = (ImageView) mRootview.findViewById(R.id.movie_poster);
final Bitmap bitmap = BitmapFactory.decodeStream(c.openFileInput("InterimPoster"));
final Drawable lowResPoster = new BitmapDrawable(getResources(), bitmap);
iv.setImageDrawable(lowResPoster);
// Download higher resolution image with 0.8 sec delay to avoid load complete before
// animation finishes (causing some flicker/overflow image problem).
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
Picasso.with(c).load("http://image.tmdb.org/t/p/w780" + mMovieInfo[2])
// still need placeholder here otherwise will flash of white image
.placeholder(lowResPoster)
.error(lowResPoster)
.fit()
.centerCrop()
.noFade() // without this image replacement will not be smooth
.into(iv);
}
};
handler.postDelayed(runnable, 800);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
试试下面的代码:
首先正常使用picasso将placeholder加载到imageview中
iv.setImageBitmap(bitmap);
然后像这样使用SharedElement Listener
Transition sharedElementEnterTransition = getWindow().getSharedElementEnterTransition();sharedElementEnterTransition.addListener(new TransitionListenerAdapter() {
@Override
public void onTransitionEnd(android.support.transition.Transition transition) {
super.onTransitionEnd(transition);
Picasso.with(c).load("http://image.tmdb.org/t/p/w780" + mMovieInfo[2])
.placeholder(new BitmapDrawable(getResources(), bitmap))
.fit()
.centerCrop()
.noFade()
.into(iv);
}
});
要延迟某些进程,您可以使用 Handler()。
例子。
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// write your codes here.. this will delay 2 seconds...
startActivity(new Intent(this,MySecondActivity.class);
}
},2000);
我在 MainActivity (GridView) 和 DetailActivity 之间实现了共享元素 activity 过渡动画。当item被点击时,Grid item中的图片会放大成为DetailActivity中的背景图片。我通过将 MainActivity 上的图像保存到文件中,然后在通过 picasso 下载更高质量的图像之前将其用作 DetailActivity 中的占位符图像,使过渡非常顺利。当毕加索完成任务后,更高质量的图像将非常整齐地替换占位符。
来自 DetailActivityFragment.java
中 onCreateView() 的代码ImageView iv = (ImageView) mRootview.findViewById(R.id.movie_poster);
try {
// Prepare "InterimPoster" jpeg file to be placeholder image
Bitmap bitmap = BitmapFactory.decodeStream(c.openFileInput("InterimPoster"));
Picasso.with(c).load("http://image.tmdb.org/t/p/w780" + mMovieInfo[2])
.placeholder(new BitmapDrawable(getResources(), bitmap))
.fit()
.centerCrop()
.noFade()
.into(iv);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
至于动画,我在 link 这里的步骤 1-3 https://guides.codepath.com/android/Shared-Element-Activity-Transition
中实现了它但是,当较高质量的图像在过渡动画完成之前完成下载时,有时会出现闪烁。放大图片在移动时会被新图片替换,这是一个令人不愉快的动画。
所以我想知道如何解决此闪烁问题?我能想到的一件事是延迟图像下载,因为我已经有较低质量的图像作为占位符。我怎样才能做到这一点?
Here the video。 通常,在我的测试设备上它有 80% 的时间是平滑的,但幸运的是在这个视频中它大部分时间都在闪烁。
什么是动画?动画结束时加载图像
TranslateAnimation translateAnimation = new TranslateAnimation(0,1.5f,0,1.5f);
translateAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
//load image when animation end
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
和
LayoutTransition.TransitionListener transitionListener = new LayoutTransition.TransitionListener() {
@Override
public void startTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) {
}
@Override
public void endTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) {
//load image when animation end
}
};
现在我找到了延迟 Picasso 图像加载(或任何其他任务)的方法。使用 Handler and Runnable.
真的很简单现在我的代码看起来像这样。无论如何,现在图像替换非常顺利。
// Set Background Poster in Try-catch in case file cannot be open
try {
// Get/Prepare "InterimPoster" jpeg file to be placeholder image
final ImageView iv = (ImageView) mRootview.findViewById(R.id.movie_poster);
final Bitmap bitmap = BitmapFactory.decodeStream(c.openFileInput("InterimPoster"));
final Drawable lowResPoster = new BitmapDrawable(getResources(), bitmap);
iv.setImageDrawable(lowResPoster);
// Download higher resolution image with 0.8 sec delay to avoid load complete before
// animation finishes (causing some flicker/overflow image problem).
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
Picasso.with(c).load("http://image.tmdb.org/t/p/w780" + mMovieInfo[2])
// still need placeholder here otherwise will flash of white image
.placeholder(lowResPoster)
.error(lowResPoster)
.fit()
.centerCrop()
.noFade() // without this image replacement will not be smooth
.into(iv);
}
};
handler.postDelayed(runnable, 800);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
试试下面的代码:
首先正常使用picasso将placeholder加载到imageview中
iv.setImageBitmap(bitmap);
然后像这样使用SharedElement Listener
Transition sharedElementEnterTransition = getWindow().getSharedElementEnterTransition();sharedElementEnterTransition.addListener(new TransitionListenerAdapter() {
@Override
public void onTransitionEnd(android.support.transition.Transition transition) {
super.onTransitionEnd(transition);
Picasso.with(c).load("http://image.tmdb.org/t/p/w780" + mMovieInfo[2])
.placeholder(new BitmapDrawable(getResources(), bitmap))
.fit()
.centerCrop()
.noFade()
.into(iv);
}
});
要延迟某些进程,您可以使用 Handler()。
例子。
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// write your codes here.. this will delay 2 seconds...
startActivity(new Intent(this,MySecondActivity.class);
}
},2000);