Тень для картинки в ImageView

Интерфейс, диалоги, темы, стили, меню
Ответить
sergey_korovin
Сообщения: 4
Зарегистрирован: 15 июл 2015, 18:28

Тень для картинки в ImageView

Сообщение sergey_korovin » 15 июл 2015, 18:39

Добрый день!

Столкнулся с такой проблемой: есть приложение - галерея. При клике по картинке в галерее открывается новое activity, в котором расположен ImageView, масшатабирующий картинку на весь экран.

Вот layout activity:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/expanded_image_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
>

<ImageView
android:id="@+id/expanded_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
android:layout_marginTop="20dip"
android:layout_marginBottom="20dip"
android:background="@android:drawable/dialog_holo_light_frame"
/>
</FrameLayout>

Есть ли какой-нибудь способ нарисовать для картинки в ImageView - тень?
Можно, конечно, добавить для ImageView - android:background="@android:drawable/dialog_holo_light_frame",
но размер самого imageView больше, чем размер картинки, поэтому это не работает.
И размер ImageView, если я правильно понимаю, менять нельзя, так как требуется масштабирование разных по размеру картинок.

Нельзя ли как-нибудь на лету "пририсовывать" к картинке тень и уже потом устанавливать ее (setImageResource) в ImageView?

Заранее благодарю за ответы!

Sasha2dx
Сообщения: 51
Зарегистрирован: 10 апр 2015, 23:24

Re: Тень для картинки в ImageView

Сообщение Sasha2dx » 18 июл 2015, 00:02

Не понимаю, почему не подходит вариант с бекграундом? Ведь картинки всёравно растягиваются на всю площадь вьюшки.

sergey_korovin
Сообщения: 4
Зарегистрирован: 15 июл 2015, 18:28

Re: Тень для картинки в ImageView

Сообщение sergey_korovin » 18 июл 2015, 17:23

Sasha2dx писал(а):Не понимаю, почему не подходит вариант с бекграундом? Ведь картинки всёравно растягиваются на всю площадь вьюшки.
Фактически, есть два варианта:

1. Поставить для ImageView - height и width = 'wrap_content'. Тогда тень рисуется вокруг imageView и самой картинки (их размеры совпадают) - без проблем.
Но тогда возникают проблемы с масштабированием. Маленькие картинки уже не растягиваются на весь экран.

2. Просто отказаться от тени и сделать у активити полупрозрачный затемненный фон, на котором отображается ImageView.

Вы, видимо предлагаете второй вариант.

Этот второй вариант уже используется, то есть полупрозрачный фон и так есть. Но все-равно просится еще и более темная тень под картинку. Без нее не так красиво. У ImageView можно сделать margin скажем 20dip и тень была бы видна.

Возможно есть и третий вариант - картинку открыть в Bitmap и там на лету нарисовать ей тень, а потом уже битмап подать в ImageView. С этим пока не разобрался.

Sasha2dx
Сообщения: 51
Зарегистрирован: 10 апр 2015, 23:24

Re: Тень для картинки в ImageView

Сообщение Sasha2dx » 18 июл 2015, 18:19

Нет, я говорил о первом варианте. Если я правильно понял проблему то тебе надо в атрибутах ImageView дописать/изменить следующее:

android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:background="@android:drawable/dialog_holo_light_frame"

+отступы и центрирование по желанию и самостоятельно. Так картинка будет и растягиватся в рамках допустимого и тень будет ровно под ней.

sergey_korovin
Сообщения: 4
Зарегистрирован: 15 июл 2015, 18:28

Re: Тень для картинки в ImageView

Сообщение sergey_korovin » 18 июл 2015, 19:28

Я пробовал android:adjustViewBounds="true".
Но у меня это почему-то работает только, если width/height = "wrap_content".
Если же стоит match_parent, то adjustViewBounds="true" не работает - ImageView растягивается под размеры родителя и соответственно появляются белые поля (ну или иного цвета - от background) вокруг картинки.

Sasha2dx
Сообщения: 51
Зарегистрирован: 10 апр 2015, 23:24

Re: Тень для картинки в ImageView

Сообщение Sasha2dx » 18 июл 2015, 19:57

Ну...я же написал выше. :mrgreen: Один параметр надо оставить match_parent, второй изменить на wrap_content. (что бы они не были одинаковыми), тогда изображение растягивается, например, по ширине вьюшки, а высота вьюшки подгоняется под контент из за параметра adjustViewBounds.

Какой параметр куда ставить - зависит от пропорций показываемых изображений и положения экрана(ландшафтный или портретный).


upd
А, и вот ещё вспомнил, у ImageView есть атрибут scaleType, можно выставить статичные размеры для вью и scaleType="centerCrop", тогда изображение будет подгоняться к размерам вьюшки, а края которые не умещаются - будут обрезаться. Тогда размеры вью всегда будут одинаковыми, а изображение будет подгоняться.

sergey_korovin
Сообщения: 4
Зарегистрирован: 15 июл 2015, 18:28

Re: Тень для картинки в ImageView

Сообщение sergey_korovin » 18 июл 2015, 20:20

Да, я уже попробовал :) Спасибо за идею, работает, действительно - в зависимости от ориентации экрана меняю комбинацию match - wrap на wrap - match.
Все красиво работает, когда контейнером для ViewImage служит FrameLayout. Но в нем не получается отцентрировать картинку.
В RelativeLaout можно отцентрировать, но там почему-то не работает adjustViewBounds при landscape ориентации - остаются небольшие полосы ( в вертикальной - нормально работает).
Видимо здесь и придется использовать centerCrop.

Спасибо!

Upd:

Удалось отцентрировать картинку во FrameLayout. Дело в том, что при смене layout params сбрасывается и гравити.
Установил его динамически так: layoutParams.gravity = Gravity.CENTER;

И что интересно - простое отслеживание ориентации экрана работает одинаково для картинок с разным aspect ratio. Тое сть и длинные, и широкие картинки отображаются простой сменой комбинации match - wrap на wrap - match.

В общем, все работает. Большое спасибо за помощь!

Ответить