如何从FirebaseStorage检索图像并将其显示在Canvas中?

时间:2019-07-08 16:32:14

标签: android-canvas firebase-storage android-drawable android-glide android-bitmap

我的应用程序将图像存储在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设置图像的角点-再次,与画布的大小和适合的图像数量相比,此处计算的值看起来正确。最后,应在画布上绘制图像-没有错误消息,但没有任何显示。

我真的不知道接下来要检查什么,还是要尝试其他什么。谁能提出任何可行的建议?

1 个答案:

答案 0 :(得分:0)

好,我知道了。问题是canvas必须在draw_images中声明为final,因为它是从内部类内部访问的。这意味着内部类无法更新它。

因此,我创建了一个名为mDrawables的类变量,它是Drawables的数组。然后,我一次在Drawables中检索一个setImages,并将它们存储在mDrawables中。每次检索时,我都会更新到目前为止已检索的数量;一旦这等于图像总数,我将使ImageGrid无效。

然后在draw_images中,当在单元格上循环时,我已经在mDrawables中具有可绘制对象,并且可以从那里直接使用它们。