我正在创建一个自定义View
,用于显示Picasso框架加载的Bitmap
图片。要成功初始化,我需要位图和视图测量。我正在努力使用线程,因为我无法预测哪个线程会提前完成。
该视图在其构造函数中以自定义Target
启动Picasso。它会在onSizeChanged
中保存视图的宽度和大小。
public class FigureView extends View {
public FigureView(Context context) {
super(context);
target = new LoadPictureTarget();
Picasso.with(getContext()).load(R.drawable.amalka).into(target);
}
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
tilesRect.set(0, 0, w, h);
}
目标设置位图并计算调整大小的图片尺寸以适合视图的可用空间:
class LoadPictureTarget implements Target {
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
baseBitmap = bitmap;
origPictureRect = new Rect(0, 0, baseBitmap.getWidth(), baseBitmap.getHeight());
scaledPictureRect = Misc.centerHorizontally(tilesRect.width(), tilesRect.height(), baseBitmap.getWidth(), baseBitmap.getHeight()); invalidate();
}
public void onBitmapFailed(Drawable errorDrawable) { }
public void onPrepareLoad(Drawable placeHolderDrawable) { }
}
问题是有时onBitmapLoaded
的调用时间早于onSizeChanged
。但并非总是如此,所以我也无法在那里进行新的维度计算。现在我把它移到了onPaint()
,但这不是一个解决方案,因为我需要在我有位图和可用空间尺寸后执行密集位图操作。
当我需要视图大小时,使用Picasso实现自定义视图的正确方法是什么?