Answers:
如何使用Picasso占位符获取加载进度动画图像:
我使用动画旋转的xml对象轻松解决了此问题。
脚步:
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 );
我实施了进度对话框,直到图像下载及其非常简单为止。将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
}
});
}
请享用。:)
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);
不幸的是,毕加索不支持动画占位符。
解决此问题的一种方法是将ImageView放置在FrameLayout中,并在其下方绘制动画。这样,当Picasso加载图像时,它将加载到动画占位符的顶部,从而为用户提供预期的效果。
或者,您可以将图像加载到Target中。然后,默认情况下将显示进度条,并在调用onBitmapLoaded方法时可以将其隐藏并显示图像。您可以在此处看到此的基本实现
只需在DBragion的答案中添加shape属性,如下所示,它将像charm一样工作。快乐的编码。
<?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:
Glide.with(activity).load(url)
.apply(RequestOptions.centerInsideTransform())
.placeholder(R.drawable.progress_animation)
.into(imageview);
我找到了这个问题的答案!
参见: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)
我认为有两个关键点。
使用noFade()
将image_view的scaleType设置为“ CENTER_INSIDE”
我通过以下方式使其工作:
创建了一个drawable(可以在Internet上找到)并将其放入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>
在我的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"/>
在Adapter中添加了具有以下参数的Target Object,其中poster和spinner是对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);
}
};
结果将类似于加载时-圆圈正在旋转(抱歉此屏幕截图,但是图像显示速度太快): ScreenShot
对于尝试使用DBragion的技术的任何人:确保您具有最新版本的毕加索,否则它将无法旋转。在使用2.5.2版之前,我的机器一直没有工作。
compile 'com.squareup.picasso:picasso:2.5.2'
只需使用Picasso PlaceHolder
Picasso.get()
.load(datas[position].artist?.image)
.placeholder(R.drawable.music_image)
.error(R.drawable.music_image)
.into(holder.cardViewImage)