В одном из своих проектов столкнулся я с хотелкой заказчика что бы у нас был слайдер с превьюхой под картинкой, ну то есть обычная галерея. Ну я не долго думаючи взял родную галерею и увидел что ее уже не желательно использовать на устройствах, а замены как таковой нет, ну я и решил написать свою вьюху что бы уже не заморачиваться, тем более есть такая великая штука как RecyclerView которая умеет все.
Вот такая вьюха с картинками будет. Она будет уметь по нажатию на айтем отображать его в большом виде, ну там окрашивать выбранный айтем вокруг в синенький цвет, что бы было понятно какой выбран ну и т.д.
По сути это будет вью в которую мы будем скармливать List в котором у нас будут ссылки на картинки, и дальше при помощи магии оно будет это отображать.
Начнем мы с того что подключим все нужные библиотеки которые нам нужны для отображения картинок, списков, и цеплянию view.
app/build.gradle
Примерно вот так будет выглядеть наш градл файл, все собственно было выше описано.
support:appcompat — нужен для того что бы у нас подтянулись все нужные классы относящиеся к andorid sdk, фрагменты, активити и т.д.
picasso:picasso — нужен для отображения картинок.
jakewharton:butterknife — нужен для упрощения подключать вьюхи, вместо findViewById мы просто будем писать @BindView(Id), и все.
support:recyclerview — нужен для отображения списков.
Дальше для начала нам нужно создать адаптер для отображения превью картинок, в котором у нас будут все картинки из списка, и по клику мы будем переходить к кликнутой.
ImageThumbsRecyclerAdapter.java
В контструкторе мы принимаем List со всем списком картинок для отображения. так же у нас есть в шапке адаптера два списка — selectedViews и allViews. Они нам нужны для сохранения кликнутых вьюх и удаления остальных отмеченных, об этом чуть ниже.
В onBindViewHolder() у нас идет заполнение всех вьюх которые мы имеем в списке, и так же заполнение массива allViews, для того что бы потом из него убирать или добавлять в него кликутые вьюхи.
Метод setCurrentItemActive() которые делает кликнутый айтем выделеным, и убирает выделение со всех остальных айтемов в списке.
Ну и в ReceiveViewHolder который у нас в самом низу адаптера мы отслеживаем клики по айтему и делаем его выделеным, а остальные делаем обычными. Ну и в самом низу мы сделали интерфейс для колбека клика в основную вью.
item_horizontal_image_thumbs.xml
Наш айтем будет состоять всего лишь из одного ImageView в котором мы будем отображать наши превьюшки.
Так же у нас в этом xml подключен селектор выделения айтема image_thumbs_selector, он нам нужен что бы в нужный момент выделять при помощи setSelected() метода кликнутый айтем.
image_thumbs_selector.xml
А так же в нем у нас вызывается selected_image_thumb который рисует вокруг вьюхи тонкую обводку.
selected_image_thumb.xml
Делаем тонкую обводку в 1 дпи вокруг айтема, цветом colorPrimary который у нас прописан в colors.xml.
Далее нам нужно создать слайдер для того что бы можно было при помощи свайпов влево и вправо так же листать наши картинки и внизу в нашем слайдере с превью они так же переключались.
ImageSliderPagerAdapter.java
В конструктор мы передаем все такой же List как и в предыдущий адаптер, и отображаем его ImageView. Это будет у нас большая картинка над превьюхами, которая будет свайпаться вправо и влево.
item_image_slider.xml
Опять же, одна единственная ImageView в которой будем отображать картинку в нашем view pager.
Дальше нам нужно объеденить эти два адаптера в одной вьюхе что бы они взаимодействовали друг с другом и были одным единым в этой вьюхе. Для начала давайте посмотрим как у нас это будет выглядеть в xml.
view_image_slider_with_preview.xml
Как видно из кода, у нас тут всего два элемента, это ViewPager который мы будем использовать для отображения большой картинки и RecyclerView для отображения превью картинок.
ImageSliderWithPreviewView.java
И тут у нас уже идет объединение всего выше написанного кода в один организм. В init() мы проинициализировали леяут, butter knife и контекст.
Дальше у нас идет метод setImageList() в который мы передаем List который дальше пойдет в наши адаптеры для отображения картинок. Так же в этом методе мы задаем View Pager'у OnPageChangeListener который будет в зависимости от свайпа отображать нужную вьюху и передавать в адаптер превью которое нужно выделить. Ну и OnItemClickListener для отслеживания клика по превью что бы открыть определенную картинку в View pager'e.
В onPageScrolled() мы задаем какую картинку в превью выделить с помощью метода setCurrentItemActive() про который я писал выше.
Ну и теперь осталось только добавить эту вьюху на activity_main и скормить ей список картинок в MainActivity.
activity_main.xml
Как видно из кода, достаточно просто добавить ее на экран, и все, больше никаких параметров не нужно. Только нужно задать id ей, и все. И дальше в MainActivity скормить List.
MainActivity.java
И собственно все что требуется от вас. Дальше оно там будет само подставлять картинки, рисовать вьюху с адаптером и отрабатывать свайпы и клики. Ну не прекрасно ли это?
Так же нужно не забыть добавить в манифест пермишен для работы с интернетом, а то картинки не подтянутся.
AndroidManifest.xml
Вот собственно и все что требовалось от нас для того что бы сделать такую вьюху.
Исходники:
GitHub
По сути это будет вью в которую мы будем скармливать List в котором у нас будут ссылки на картинки, и дальше при помощи магии оно будет это отображать.
Начнем мы с того что подключим все нужные библиотеки которые нам нужны для отображения картинок, списков, и цеплянию view.
app/build.gradle
Примерно вот так будет выглядеть наш градл файл, все собственно было выше описано.
support:appcompat — нужен для того что бы у нас подтянулись все нужные классы относящиеся к andorid sdk, фрагменты, активити и т.д.
picasso:picasso — нужен для отображения картинок.
jakewharton:butterknife — нужен для упрощения подключать вьюхи, вместо findViewById мы просто будем писать @BindView(Id), и все.
support:recyclerview — нужен для отображения списков.
Дальше для начала нам нужно создать адаптер для отображения превью картинок, в котором у нас будут все картинки из списка, и по клику мы будем переходить к кликнутой.
ImageThumbsRecyclerAdapter.java
В контструкторе мы принимаем List со всем списком картинок для отображения. так же у нас есть в шапке адаптера два списка — selectedViews и allViews. Они нам нужны для сохранения кликнутых вьюх и удаления остальных отмеченных, об этом чуть ниже.
В onBindViewHolder() у нас идет заполнение всех вьюх которые мы имеем в списке, и так же заполнение массива allViews, для того что бы потом из него убирать или добавлять в него кликутые вьюхи.
Метод setCurrentItemActive() которые делает кликнутый айтем выделеным, и убирает выделение со всех остальных айтемов в списке.
Ну и в ReceiveViewHolder который у нас в самом низу адаптера мы отслеживаем клики по айтему и делаем его выделеным, а остальные делаем обычными. Ну и в самом низу мы сделали интерфейс для колбека клика в основную вью.
item_horizontal_image_thumbs.xml
Наш айтем будет состоять всего лишь из одного ImageView в котором мы будем отображать наши превьюшки.
Так же у нас в этом xml подключен селектор выделения айтема image_thumbs_selector, он нам нужен что бы в нужный момент выделять при помощи setSelected() метода кликнутый айтем.
image_thumbs_selector.xml
А так же в нем у нас вызывается selected_image_thumb который рисует вокруг вьюхи тонкую обводку.
selected_image_thumb.xml
Делаем тонкую обводку в 1 дпи вокруг айтема, цветом colorPrimary который у нас прописан в colors.xml.
Далее нам нужно создать слайдер для того что бы можно было при помощи свайпов влево и вправо так же листать наши картинки и внизу в нашем слайдере с превью они так же переключались.
ImageSliderPagerAdapter.java
В конструктор мы передаем все такой же List как и в предыдущий адаптер, и отображаем его ImageView. Это будет у нас большая картинка над превьюхами, которая будет свайпаться вправо и влево.
item_image_slider.xml
Опять же, одна единственная ImageView в которой будем отображать картинку в нашем view pager.
Дальше нам нужно объеденить эти два адаптера в одной вьюхе что бы они взаимодействовали друг с другом и были одным единым в этой вьюхе. Для начала давайте посмотрим как у нас это будет выглядеть в xml.
view_image_slider_with_preview.xml
Как видно из кода, у нас тут всего два элемента, это ViewPager который мы будем использовать для отображения большой картинки и RecyclerView для отображения превью картинок.
ImageSliderWithPreviewView.java
И тут у нас уже идет объединение всего выше написанного кода в один организм. В init() мы проинициализировали леяут, butter knife и контекст.
Дальше у нас идет метод setImageList() в который мы передаем List который дальше пойдет в наши адаптеры для отображения картинок. Так же в этом методе мы задаем View Pager'у OnPageChangeListener который будет в зависимости от свайпа отображать нужную вьюху и передавать в адаптер превью которое нужно выделить. Ну и OnItemClickListener для отслеживания клика по превью что бы открыть определенную картинку в View pager'e.
В onPageScrolled() мы задаем какую картинку в превью выделить с помощью метода setCurrentItemActive() про который я писал выше.
Ну и теперь осталось только добавить эту вьюху на activity_main и скормить ей список картинок в MainActivity.
activity_main.xml
Как видно из кода, достаточно просто добавить ее на экран, и все, больше никаких параметров не нужно. Только нужно задать id ей, и все. И дальше в MainActivity скормить List.
MainActivity.java
И собственно все что требуется от вас. Дальше оно там будет само подставлять картинки, рисовать вьюху с адаптером и отрабатывать свайпы и клики. Ну не прекрасно ли это?
Так же нужно не забыть добавить в манифест пермишен для работы с интернетом, а то картинки не подтянутся.
AndroidManifest.xml
Вот собственно и все что требовалось от нас для того что бы сделать такую вьюху.
Исходники:
GitHub
Этот комментарий был удален администратором блога.
ОтветитьУдалитьПроект запустился, но сами картинки не отображаются(
ОтветитьУдалитьПроблема решена, на эмуляторе нужно было включить интернет.
Удалить