Пока делал приложение узнал и проверил на практике утверждение что нужно скачивать фото уже нужного размера для экрана, а не в том размере котором они находятся изначально.
До этого качал фото в размере 1280х720 с firebase storage и отображал с помощью fresco. Но уже из кеша они появлялись с задержкой секунда +- К тому же нужно платить за "ненужные пиксели", и размер кеша ...
Теперь я хочу переделать все, и у меня появились вопросы. Фото теперь будут на imgix(предварительно) и там можно скачать их указывая высоту и ширину.
Вопрос 1. Как я могу определить высоту и ширину для данного экрана? Пока что я написал так:
private int getImageW(){
float density = context.getResources().getDisplayMetrics().density;
int baseW = 480;
return (int) (baseW * density);
}
private int getImageH(){
float density = context.getResources().getDisplayMetrics().density;
int baseH = 320;
return (int) (baseH * density);
}
Следуя за этим постом https://stackoverflow.com/questions/28507609/image-resolution-for-mdpi-hdpi-xhdpi-and-xxhdpi
В итоге размер на моем тестовом устройстве получился 1440x960 от исходного 1280х720, хотя вполне хорошо выглядит уже размер 480х320(и работает быстро).
ПС: я понимаю что все зависит от разрешений и тд, но у меня 5,5 дюймовый экран и fullHD разрешение, и не вижу никакой разницы между 1280х720 и 480х320 в 99% случаев!!
В общем как правильно найти эти значения?
Вопрос 2. Я специально изначально хочу скачивать фото в зависимости от экрана, а нет от размера view, потому что оно, как я думаю кеширует исходя из url, а дубликаты мне не нужны. И поэтому вопрос 2 звучит так Как мне найти высоту и ширину картинки для view, что бы потом уменьшить ее уже используя fresco(вопрос не о fresco, а о размерах)?
Скорее всего вам подойдет решение с разными ресурсами для разных разрешений. Например: создаете файлы integers.xml
для каждого размера экрана и в них задаете высоту и ширину. И отправлять будете данные из этих файлов.
В итоге вот к чему удалось прийти:
Пикселей в картинке должно быть не меньше чем во view которое ее отображает - иначе потеря качества неизбежна. А значит нужно запрашивать картинку по размеру view.
Можно сократить размер иначе - изменив формат и качество.
Можно и нужно уменьшать уже загруженные картинки до размеров view.
Пример на моем случае:
Все мои активности в портретном режиме, одна и та же картинка может отображаться почти во всю ширину экрана и в более маленьком view (~90dp) в listView.
По этому я скачиваю картини размером во всю ширину экрана(портретную). Размер экрана можно получить так:
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
int w = metrics.widthPixels;
Затем если надо подгоняю их под view (Я использую fresco)
ImageRequest request = ImageRequestBuilder
.newBuilderWithSource(uri)// сборный адрес который указывает на картинку, ее размер, формат, и качество.
.setResizeOptions(new ResizeOptions(width,height)//ширина и высота view.
.build();
mImage.setImageRequest(request);
В итоге благодаря проделанным операциям удалось снизить размер файла(1280х720.webp) где то на 40% в среднем 15kb. и теперь нет никаких задержек при загрузки картинки во view(не считая холодного старта, когда картинки скачиваються на устройство, но и тут меньше секунды). При этом визуальное качество ничуть не изменилось.
Если есть еще какие-то идеи пишите.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Нужно подключиться к GA c помощью JavaВ данный момент нашел один рабочий способ - это создание сервисного аккаунта, далее добавляем сгенеренную...
У меня есть объект ролей в котором есть Set названий ролей, я хочу сделать проверку, по наличию у пользователя той или иной ролиПодскажите как...
У меня есть уже несколько вопросов связанных с этой задачей, вот например этот Как заполнить массив числами long которые получаются при выборе...