Страницы

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

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

Android, увеличения ImageView в recycleWiew по тапу, алгоритм

#android #android_imageview


Недавно начал изучать Android. Дошёл до recycleWiew. Столкнулся с необходимостью
открыть imageView из ячейки полноэкранном режиме по нажатию на него.

Сейчас я делаю так:

onBindViewHolder

Glide.with(context).load(new File(path + "/" + galleryList.get(i))).into(viewHolder.img);


А в cell.xml
я использовал разные другие библиотеки, но добился только того что по тапу приложение
масштабировалось в рамках ячейки. Попытки прорвать границы ухищрениями типо adjustViewBounds
не помогли.

Сейчас мне кажется что ошибка где - то в подходе. Подскажите, как сделать правильно? 

Заранее спасибо.

Upd:

Попробовал по совету Jarvis_J в комментарии, но натыкаюсь на NPE при попытке присвоить
imageView изображение. 

 

    


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

public class Adapter extends RecyclerView.Adapter {
    ...
    ImageView scaledImg;
    ...


...

public void onBindViewHolder(final Adapter.ViewHolder viewHolder, final int i) {
            ...
            scaledImg.findViewById(R.id.scaledImage);
            final File n = new File(path + itemLlist.get(i));
            scaledImg.setImageURI(Uri.fromFile(n));
            ...


...

viewHolder.img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!isScaled) {
                    scaledImg.setVisibility(View.VISIBLE);
                    isScaled = !isScaled;
                }
            }


Где я ошибаюсь?
    


Ответы

Ответ 1



Ваш ImageView в любом случае будет ограничен родителем - (ячейкой) RecyclerView. Если вы хотите сделать изображение на весь экран - вам нужен другой ImageView, который будет размером с корневой layout. Например, так: По нажатию делайте этот ImageView видимым (setVisibility(View.VISIBLE)) и устанавливайте ему картинку из ячейки recyclerView (setImageResource(...)). По нажатию на увеличенное изображение вновь скрывайте его (setVisibility(View.GONE)).

Ответ 2



Можно это сделать с красивой анимацией открытия. Использовать для этого две активити. Первая с RecyclerView (RvActivity назовем), а вторая просто с imageView (IvActivity). RvActivity: IvActivity: По клику на элемент RecyclerView делаем старт активити из RvActivity (пример на Kotlin): if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { startActivity(Intent(this, IvActivity::class.java), ActivityOptions.makeSceneTransitionAnimation(this, rv,"imageTag") .toBundle()) } else { startActivity(Intent(this, IvActivity::class.java)) } На Java будет что-то типо того (пишу без теста, по памяти. Давно джавку не юзал): if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { startActivity(new Intent(this, IvActivity.class), ActivityOptions.makeSceneTransitionAnimation(this, findViewById(R.id.rv),"imageTag") .toBundle()); } else { startActivity(new Intent(this, IvActivity.class)); } Ну и соответственно в IvActivity в ImageView установите ту картинку по которой кликнули (передать информацию о адресе кликнутой картинки можно через Intent)

Комментариев нет:

Отправить комментарий