Как получить изображение из FirebaseStorage и показать его на холсте? - PullRequest
0 голосов
/ 08 июля 2019

Мое приложение хранит изображения в FirebaseFirestore;они могут быть в формате jpg или png.У меня есть Activity, которая рисует сетку на 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 голосов
/ 09 июля 2019

Хорошо, я понял это.Проблема состояла в том, что canvas должен был быть объявлен окончательным в draw_images, потому что к нему обращались изнутри внутреннего класса.Это означало, что внутренний класс не мог обновить его.

Итак, я создал переменную класса с именем mDrawables, которая является массивом Drawables.Затем я извлекаю Drawables по одному в setImages и сохраняю их в mDrawables.По мере извлечения каждого из них я обновляю счет того, сколько из них было получено до сих пор;как только это становится равным общему количеству изображений, я аннулирую ImageGrid.

Затем в draw_images, когда я зацикливаюсь над ячейками, у меня уже есть элементы рисования в mDrawables, и я могу использовать их напрямуюоттуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...