我的应用程序将图像存储在FirebaseFirestore中;它们可以是jpg或png格式。我有一个在Canvas
上绘制网格的活动,我想将图像放入网格中。整个网格+图像称为ImageGrid,其定义如下(为便于阅读,省略了一些内容):
public class ImageGrid extends View {
private final Context mContext;
private int mNumRows, mNumCols;
private float canvas_height, canvas_width;
private final Paint mPaint;
private float image_cell_size;
private String[][] image_urls;
public ImageGrid(Context thisContext, AttributeSet attrs) {
super(thisContext, attrs);
mContext = getContext();
mPaint = new Paint();
}
public void setSize(int numRows, int numCols) {
mNumRows = numRows;
mNumSts = numCols;
invalidate();
}
public void setImages(String[][] images) {
image_urls = images;
}
// DRAW GRID FUNCTIONS set up the grid and add the images
protected void onDraw(Canvas canvas) {
canvas_height = canvas.getHeight();
canvas_width = canvas.getWidth();
get_cell_size(); // Get the size of the cells
// image_cell_size has now been set by get_cell_size
// Draw axes & chart
draw_images(canvas); // Draw the images
}
// Draw images
private void draw_images(final Canvas canvas) {
if (mChart == null) return;
final Resources resources = mContext.getResources();
FirebaseStorage mStorage = FirebaseStorage.getInstance();
final StorageReference mStorageRef = mStorage.getReference();
for (int rr = 0; rr < mNumRows; rr++) {
for (int cc = 0; cc < mNumSts; cc++) {
String drawableUrl = image_urls[rr][cc];
if(drawableUrl != null) {
* THIS IS WHERE I NEED TO GET THE IMAGE AND DISPLAY IT *
}
}
}
}
}
因此,在网上寻找如何获取图像然后将其绘制在画布上之后,我有了:
mStorageRef.child(drawableUrl)
.getDownloadUrl()
.addOnSuccessListener(
new OnSuccessListener<Uri>() {
public void onSuccess(Uri uri) {
Glide.with(getContext())
.asBitmap()
.load(uri)
.into(new CustomTarget<Bitmap>() {
public void onResourceReady(
Bitmap resource,
Transition<? super Bitmap> transition) {
Drawable d = new BitmapDrawable(getResources(), resource);
d.setBounds(
cc * cell_size,
rr * cell_size,
(cc + 1)*cell_size,
(rr + 1) * cell_size);
d.draw(canvas);
}}});
这将从数据库中检索图像;当我检查调试器时,d
看起来不错-它包含正确的图像。然后,我使用setBounds设置图像的角点-再次,与画布的大小和适合的图像数量相比,此处计算的值看起来正确。最后,应在画布上绘制图像-没有错误消息,但没有任何显示。
我真的不知道接下来要检查什么,还是要尝试其他什么。谁能提出任何可行的建议?
答案 0 :(得分:0)
好,我知道了。问题是canvas
必须在draw_images
中声明为final,因为它是从内部类内部访问的。这意味着内部类无法更新它。
因此,我创建了一个名为mDrawables
的类变量,它是Drawables
的数组。然后,我一次在Drawables
中检索一个setImages
,并将它们存储在mDrawables
中。每次检索时,我都会更新到目前为止已检索的数量;一旦这等于图像总数,我将使ImageGrid
无效。
然后在draw_images
中,当在单元格上循环时,我已经在mDrawables
中具有可绘制对象,并且可以从那里直接使用它们。