Какой хороший подход, InflateView / removeView ИЛИ настройки Visibility.GONE? - PullRequest
1 голос
/ 14 апреля 2020

У меня есть фрагмент с изображением скелета. Скелет / мерцающее представление отображается только один раз, когда данные находятся в состоянии загрузки, а затем они скрыты. Я использую этот фрагмент в ViewPager2. Чтобы сделать прокрутку ViewPager2 более плавной, я пытался оптимизировать макеты. Итак, я хочу лучше понять, какой подход лучше.

  1. Накачивание или удаление скелета во время выполнения?
  2. Сохранение скелета в XML и установка его видимости в GONE.

Ниже приводится пустышка XML из ShimmerLayout, который содержит 5-7 просмотров внутри. Любые идеи будут заметны.

Спасибо

ShimmerLayout xml:

<com.facebook.shimmer.ShimmerFrameLayout
            android:id="@+id/slEffect"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clickable="false"
            android:paddingStart="18dp"
            style="@style/ShimmerCommon"
            app:shimmer_highlight_color="@color/post_detail_shimmer">

            <androidx.constraintlayout.widget.ConstraintLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginTop="26dp"
                android:layout_marginEnd="18dp"
                android:layout_marginBottom="75dp">

                <com.makeramen.roundedimageview.RoundedImageView
                    android:id="@+id/ivUserImage"
                    android:layout_width="45dp"
                    android:layout_height="45dp"
                    android:scaleType="centerCrop"
                    android:src="@color/post_detail_shimmer"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toTopOf="parent"
                    app:riv_corner_radius="9dp" />

                <com.makeramen.roundedimageview.RoundedImageView
                    android:id="@+id/tvUserName"
                    android:layout_width="125dp"
                    android:layout_height="15dp"
                    android:layout_marginStart="7.9dp"
                    android:layout_marginTop="5dp"
                    android:layout_marginEnd="7.9dp"
                    android:scaleType="fitXY"
                    android:src="@color/post_detail_shimmer"
                    app:layout_constraintStart_toEndOf="@+id/ivUserImage"
                    app:layout_constraintTop_toTopOf="@+id/ivUserImage"
                    app:riv_corner_radius="8dp" />

                <com.makeramen.roundedimageview.RoundedImageView
                    android:id="@+id/tvTime"
                    android:layout_width="100dp"
                    android:layout_height="15dp"
                    android:layout_marginStart="7.9dp"
                    android:layout_marginTop="5dp"
                    android:layout_marginEnd="7.9dp"
                    android:scaleType="fitXY"
                    android:src="@color/post_detail_shimmer"
                    app:layout_constraintStart_toEndOf="@+id/ivUserImage"
                    app:layout_constraintTop_toBottomOf="@+id/tvUserName"
                    app:riv_corner_radius="8dp" />

                <com.makeramen.roundedimageview.RoundedImageView
                    android:id="@+id/tvSuserName"
                    android:layout_width="125dp"
                    android:layout_height="15dp"
                    android:layout_marginBottom="8dp"
                    android:scaleType="fitXY"
                    android:visibility="gone"
                    android:src="@color/post_detail_shimmer"
                    app:layout_constraintBottom_toTopOf="@+id/tvSTime"
                    app:layout_constraintStart_toStartOf="parent"
                    app:riv_corner_radius="8dp" />

                <com.makeramen.roundedimageview.RoundedImageView
                    android:id="@+id/tvSTime"
                    android:layout_width="100dp"
                    android:layout_height="15dp"
                    android:scaleType="fitXY"
                    android:src="@color/post_detail_shimmer"
                    android:visibility="gone"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    app:riv_corner_radius="8dp" />

                <com.makeramen.roundedimageview.RoundedImageView
                    android:id="@+id/tvSTsime"
                    android:layout_width="100dp"
                    android:layout_height="15dp"
                    android:layout_below="@id/tvSuserName"
                    android:scaleType="fitXY"
                    android:visibility="gone"
                    android:src="@color/post_detail_shimmer"
                    app:layout_constraintBottom_toBottomOf="@+id/tvSuserName"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:riv_corner_radius="8dp" />


            </androidx.constraintlayout.widget.ConstraintLayout>

        </com.facebook.shimmer.ShimmerFrameLayout>

1 Ответ

0 голосов
/ 14 апреля 2020

Если я предполагаю, что правильно, то в первый раз, когда вы загружаете свой экран, все виды занимают время при рендеринге, находятся ли они в состояниях VISIBLE / INVISIBLE или GONE. Предположим, что в макете моего экрана есть сложное представление (предположим, горизонтальный ползунок настраиваемого представления даты), но изначально оно мне не нужно, но, тем не менее, время открытия моего экрана будет увеличено из-за его рендеринга. Для этого Android имеет компонент ViewStub, который вы можете добавить в свой XML, это тупой и легкий вид. Особенность ViewStub в том, что он не участвует и не рисует ничего в макете. У него нулевое измерение. Макет, на который ссылается ViewStub, раздувается и добавляется в пользовательский интерфейс только тогда, когда мы решим. Это означает, что всякий раз, когда ViewStub становится видимым или когда вызывается метод inflate (), ресурс макета раздувается, а затем ViewStub заменяет себя в своем родительском элементе на завышенный ресурс. ViewStub существует только в иерархии представлений, пока не будут вызваны setVisibility (int) или inflate (). Завышенное представление добавляется в родительский элемент ViewStub с помощью параметра макета. Прочитайте ссылку ниже для получения дополнительной информации.

https://abhiandroid.com/ui/viewstub

...