2016-04-23 9 views
0

Я работаю над динамическим миниатюрным сервисом на основе thumbor, который предоставит миниатюру любого размера для данного изображения и будет кэшировать его. В идеале я хотел бы ограничить размеры миниатюр, чтобы кеш был эффективным, и я могу предварительно кэшировать эти размерные изображения. В идеале различные типы размеров изображений, которые должны быть предварительно кэшированы, должны рассчитываться на основе плотности экрана, размера экрана и скорости сети, чтобы андроид запросил подходящий размер изображения.Размер динамического миниатюры для Android, основанный на размере и плотности экрана

Я хотел бы знать, как рассчитать несколько измерений изображений, которые нужно предварительно кэшировать, и как определить андроид, какой размер изображения получить.

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

На основе диаграммы конфигурации экрана в этом документе url я могу кэшировать изображения всех ширины, указанные в этой диаграмме. На время выполнения, я могу рассчитать, какая строку и столбец в этой диаграмме текущего устройства приспосабливает на основе этих ссылок Get screen size, Get screen dpi

ответ

1

Вы можете использовать Пикассо или Glide для вашей цели они обрабатывают изменения размера и это библиотеки автоматически обрабатывать кэширование изображения. Например, для миниатюры размером 600x200: -

Loading and caching thumbnail with Picasso of exact imageView size

Picasso 
    .with(context) 
    .load("your_image_your") 
    .resize(600, 200) // resizes the image to these dimensions (in pixel) 
    .centerCrop() 
    .into(imageViewThumbnail); 

Loading and caching thumbnail with Glide of exact imageView Size

Glide 
    .with(context) 
    .load("your_image_your") 
    .override(600, 200) // resizes the image to these dimensions (in pixel) 
    .centerCrop() // this cropping technique scales the image so that it fills the requested bounds and then crops the extra. 
    .into(imageViewThumbnail); 

вещь, чтобы отметить здесь, хотя обе библиотеки делает изменение размера изображения, но кэширование отличается: -

wha tever размер, Picasso будет кэшировать только один размер изображения, полноразмерный.

Glide действует по-разному, кэширует отдельный файл для каждого размера ImageView. Хотя изображение уже загружено после , но если вам нужно загрузить другой размер с тем же изображением, оно должно быть загружено еще раз, прежде чем изменять его до нужного разрешения и затем добавить .

Так что для вашего случая использования я предлагаю вам использовать Glide (more about Glide vs Picasso)

+0

Я уже использую скольжение. Однако по-прежнему необходимо выполнить сетевой запрос для полноразмерного изображения, чего я хочу избежать. Также отображается первое изображение в первый раз, также потребуется время для получения изображения размера заливки, что приведет к более медленной загрузке изображений. – pratsJ

+0

Также я говорю о кеше на стороне сервера, а не стороне андроида – pratsJ

1

Две вещи помогут вам:

  1. определить высоту и ширину вашего ImageView, который будет содержать thumbnail как ресурсы измерения
  2. Когда приходит время определить размер изображения для извлечения, преобразуйте эти размерные ресурсы в значения пикселей

Так, например, если вы используете ImageView для отображения миниатюр размером 64х64 дп, определяют размерные ресурсы, как это:

<dimen name="thumbnail_height">64dp</dimen> 
<dimen name="thumbnail_width">64dp</dimen> 

Используйте эти значения в макете, который содержит ImageView:

<ImageView 
    .... 
    android:layout_height="@dimen/thumbnail_height" 
    android:layout_width="@dimen/thumbnail_width" 
    /> 

Затем, во время выполнения, чтобы включить эту в сырые значения пикселей для устройства:

int height = getResources().getDimensionPixelSize(R.dimen.thumbnail_height); 
int width = getResources().getDimensionPixelSize(R.dimen.thumbnail_width); 

Теперь вы можете использовать высоту и ширину, чтобы сообщить службе динамических миниатюр, как создать эскиз, который наилучшим образом подходит для устройства под рукой.

+0

. Большинство изображений - это изображения ширины заливки, поэтому ширина изображения равна ширине экрана. Но поскольку в андроиде существует так много фрагментации устройств, кешу службы эскизов нужно хранить изображения всех возможных ширины, поскольку в худшем случае нет устройств Android, что я пытаюсь избежать, поэтому создаю ведро с горсткой фиксированной ширины и во время выполнения я могу рассчитать, какой из этих ковшей мое текущее устройство подходит и может спросить эскиз такого размера. – pratsJ

+0

Так что нужен хороший алгоритм для определения возможных значений ширины для хранения и расчета времени выполнения, из которых текущее устройство ковша падает в зависимости от плотности экрана и размера. – pratsJ

+0

«Миниатюра» и «полноэкранное изображение» кажутся мне противоречивыми. Если вы пытаетесь заполнить экран, это не похоже на миниатюру. Во всяком случае, есть ли у вас особое абсолютное требование, чтобы загруженное изображение было абсолютно точно размером экрана в необработанных пикселях? Если у кого-то есть это требование, вы можете захотеть взглянуть на то, чтобы расслабиться, чтобы вы могли приблизиться к этому с более разумной точки зрения. –