Страницы

Поиск по вопросам

Показаны сообщения с ярлыком picasso. Показать все сообщения
Показаны сообщения с ярлыком picasso. Показать все сообщения

воскресенье, 9 февраля 2020 г.

Как отобразить определенную часть изображения в ImageView?

#android #picasso #android_imageview


У меня есть список фотографий, который я отображаю в ListView с помощью адаптера. 

Сейчас я отображаю фото таким образом:

PhotoAdapter.ViewHolder viewHolder;
        if (view == null) {
            view = inflater.inflate(R.layout.list_view_photo_item, viewGroup, false);

            viewHolder = new PhotoAdapter.ViewHolder(view);
            view.setTag(viewHolder);
        } else {
            viewHolder = (PhotoAdapter.ViewHolder) view.getTag();
        }

        picasso.load(photo.getImageUrl())
                .placeholder(R.drawable.bg_small_11)
                .into(viewHolder.image);


Это обычное отображение. А у меня стоит задача отобразить фото по указанным координатам
(левая верхняя, правая верхняя, левая нижняя и  правая нижняя точка). То есть я не
хочу отображать всё фото, а только этот кусок фото, который пользователь раньше выбрал
как превью, и я хочу отображать именно его. Сервер мне возвращает полностью всё фото
+ координаты (в PX) этого превью. Кто, что может посоветовать? 
    


Ответы

Ответ 1



Метод transform и интерфейс Transformation позволяют изменить изображение как душе угодно: picasso.load(photo.getImageUrl()) .placeholder(R.drawable.bg_small_11) .transform(new Transformation { @Override public Bitmap transform(Bitmap source) { Bitmap result = Bitmap.createBitmap(source, x, y, width, height); if (result != source) source.recycle(); return result; } @Override public String key() { return "crop()"; } }) .into(viewHolder.image);

Ответ 2



Вам нужно получить Bitmap и создать его обрезанную версию. У вручную установить в ImageView. С Picasso это можно сделать примерно так: Picasso.with(context) .load(photo.getImageUrl()) .placeholder(R.drawable.bg_small_11) .into(new Target() { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { Bitmap croppedBitmap = Bitmap.createBitmap( bitmap, xCoord, yCoord, width, height); // Координаты, полученные с сервера viewHolder.image.setImageBitmap(croppedBitmap); } @Override public void onBitmapFailed(Drawable errorDrawable) { } @Override public void onPrepareLoad(Drawable placeHolderDrawable) { } }); }

вторник, 9 июля 2019 г.

Как установить размер заглушки ImageView не зная точных размеров получаемого изображения?

Есть LinearLayout, в который добавляется N'ое количество ImageView. Изображения загружаются с помощью библиотеки "Picasso":
Picasso.with(activity.getApplicationContext()) .load(listUrls.get(0)) .placeholder(R.drawable.img_holder) .into(postImage);
Собственно вопрос по заглушке для ImageView .placeholder(R.drawable.img_holder) - заглушка не соответствует размеру изображения, игнорирует ScaleType. Точный размер изображения до его скачивания узнать невозможно (изображения тянутся с Vk) Как в таком случае подстроить заглушку по размер изображения?


Ответ

Есть несколько вариантов. Каждый из них имеет свои особенности. Один из них - не использовать метод placeholder(int res), а установить заглушку стандартными средствами в разметке атрибутом src.
Так все параметры типа ScaleType будут задействованы.

пятница, 21 июня 2019 г.

Picasso, русские символы в названии картинки

У меня есть адаптер, который должен брать адрес картинки с объекта класса и передавать его в метод Picasso.
Но дело в том, что картинка имеет адрес с русскими символами, или в пути адреса русские символы, поэтому Picasso не хочет её грузить, как я понял. Какие пути решения можно использовать?
В пути адреса "http://" тоже добавлял, не помогло. Другие картинки грузит(проверял закомментированной строкой)
URLDecoder и URLEncoder уже методом тыка начал использовать, думал в другой кодировке сработает, нет, не сработало =(
GIF формат вроде бы поддерживается Picasso, поэтому не грешу на расширение картинки
public View getView(int position, View convertView, ViewGroup parent) { // LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); // 3 обязательные строки при создании Array адаптера View newView = vi.inflate(R.layout.item_news, parent, false); // (в Cursor адаптере метод bindview)
TextView tv1 = (TextView) newView.findViewById(R.id.textListViewZagolovok); TextView tv2 = (TextView) newView.findViewById(R.id.textListViewOpisanie); ImageView imv = (ImageView) newView.findViewById(R.id.imageListViewNovosti); String url = abc.get(position).image; // String url = "https://i.ytimg.com/vi/-DRziE7lYsk/hqdefault.jpg"; Log.e("pic in adapter", url); tv1.setText(abc.get(position).title); tv2.setText(abc.get(position).content);
try{ // вот здесь косячит Picasso.with(context).load(URLEncoder.encode(url)).placeholder(R.drawable.headeronmenu).error(R.drawable.krest).into(imv); Log.e("encode", "0 " + url); Log.e("encode", "1 " + URLEncoder.encode(url, "UTF-8")); Log.e("encode", "2 " + URLDecoder.decode(url, "UTF-8"));
}catch (UnsupportedEncodingException e){ e.printStackTrace(); }
if(position == abc.size()-4 && !flagDow){ flagDow = true; downNextPage.startDowNextPage(); }
return newView; }
Логи:
03-24 10:42:55.525 21687-21687/ru.diitcenter.lakdistrict E/pic in adapter: gazikumuh.ru/images/2016/ЦиркХури.gif 03-24 10:42:55.640 21687-21687/ru.diitcenter.lakdistrict E/encode: 0 gazikumuh.ru/images/2016/ЦиркХури.gif 03-24 10:42:55.645 21687-21687/ru.diitcenter.lakdistrict E/encode: 1 gazikumuh.ru%2Fimages%2F2016%2F%D0%A6%D0%B8%D1%80%D0%BA%D0%A5%D1%83%D1%80%D0%B8.gif 03-24 10:42:55.645 21687-21687/ru.diitcenter.lakdistrict E/encode: 2 gazikumuh.ru/images/2016/ЦиркХури.gif 03-24 10:42:55.720 21687-21687/ru.diitcenter.lakdistrict E/pic in adapter: gazikumuh.ru/images/2016/КурклиКультура.gif 03-24 10:42:55.720 21687-21687/ru.diitcenter.lakdistrict E/encode: 0 gazikumuh.ru/images/2016/КурклиКультура.gif 03-24 10:42:55.725 21687-21687/ru.diitcenter.lakdistrict E/encode: 1 gazikumuh.ru%2Fimages%2F2016%2F%D0%9A%D1%83%D1%80%D0%BA%D0%BB%D0%B8%D0%9A%D1%83%D0%BB%D1%8C%D1%82%D1%83%D1%80%D0%B0.gif 03-24 10:42:55.725 21687-21687/ru.diitcenter.lakdistrict E/encode: 2 gazikumuh.ru/images/2016/КурклиКультура.gif 03-24 10:43:00.760 21687-21687/ru.diitcenter.lakdistrict E/111: AboutNewsActivity.url = gazikumuh.ru/images/2016/ЦиркХури.gif
(Картинки в браузере открываются)


Ответ

При помощи ссылок ниже, сделал метод
[https://stackoverflow.com/questions/9366742/android-regular-expression-return-matched-string ]
[http://www.javaportal.ru/java/articles/regexp.html ]
public String convertUrl(String url){ Pattern p = Pattern.compile("[А-я]+_+[А-я]+_[А-я]+|[А-я]+_+[А-я]+|[А-я]+-+[А-я]+-+[А-я]+|[А-я]+-+[А-я]+|[А-я]+[0-9]+[А-я]+|[0-9]+[А-я]+|[А-я]+"); Matcher m = p.matcher(url); if(m.find()) { Log.e("regular", m.group(0)); String s = m.group(0);
try { Log.e("regula2", URLEncoder.encode(s, "UTF-8")); return url.replace(s, URLEncoder.encode(s, "UTF-8")); } catch (UnsupportedEncodingException e) {
} } return url; }
Он переводит названия, в которых есть символы типа
http://gazikumuh.ru/images/2016/Прием_граждан_в.jpg http://gazikumuh.ru/images/2016/Прием_граждан.jpg http://gazikumuh.ru/images/2016/первый-второй-третий.jpg http://gazikumuh.ru/images/2016/первый-второй.jpg http://gazikumuh.ru/images/2016/первый0886796второй.jpg http://gazikumuh.ru/images/2016/0886796текст.gif http://gazikumuh.ru/images/2016/текст.gif
Где "[А-я]" это 1 русский символ, "+" это свойство множества
"[А-я]+" набор русских символов
"[А-я]+_+[А-я]+" это слово_слово или слово______слово
Мои условия разделяются символом " | " и если 1е условие не выполнится, произойдёт переход на второе условие и так далее.
Спасибо людям, оставившим комменты, я использовал их советы

четверг, 18 апреля 2019 г.

Как отобразить определенную часть изображения в ImageView?

У меня есть список фотографий, который я отображаю в ListView с помощью адаптера.
Сейчас я отображаю фото таким образом:
PhotoAdapter.ViewHolder viewHolder; if (view == null) { view = inflater.inflate(R.layout.list_view_photo_item, viewGroup, false);
viewHolder = new PhotoAdapter.ViewHolder(view); view.setTag(viewHolder); } else { viewHolder = (PhotoAdapter.ViewHolder) view.getTag(); }
picasso.load(photo.getImageUrl()) .placeholder(R.drawable.bg_small_11) .into(viewHolder.image);
Это обычное отображение. А у меня стоит задача отобразить фото по указанным координатам (левая верхняя, правая верхняя, левая нижняя и правая нижняя точка). То есть я не хочу отображать всё фото, а только этот кусок фото, который пользователь раньше выбрал как превью, и я хочу отображать именно его. Сервер мне возвращает полностью всё фото + координаты (в PX) этого превью. Кто, что может посоветовать?


Ответ

Метод transform и интерфейс Transformation позволяют изменить изображение как душе угодно:
picasso.load(photo.getImageUrl()) .placeholder(R.drawable.bg_small_11) .transform(new Transformation {
@Override public Bitmap transform(Bitmap source) { Bitmap result = Bitmap.createBitmap(source, x, y, width, height); if (result != source) source.recycle(); return result; }
@Override public String key() { return "crop()"; } }) .into(viewHolder.image);