优化共享元素动画

This commit is contained in:
HapeLee committed 2025-11-18 00:29:45 +08:00
1 parent b91b99c9ba
commit 3aece2eadd
13 files changed
+395 -350

No files matched your search

@@ -184,6 +184,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingHorizontal="16dp"
android:layout_marginVertical="8dp"
app:singleLine="true"
app:singleSelection="true"
app:selectionRequired="true">
@@ -301,6 +302,7 @@
<ImageView
android:layout_width="16dp"
android:layout_height="48dp"
android:importantForAccessibility="no"
app:layout_constraintStart_toEndOf="@id/cb_share_layout"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
+79 -83
View File
@@ -1,106 +1,102 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/cv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
app:cardBackgroundColor="@android:color/transparent"
android:layout_marginBottom="4dp"
android:clickable="true"
android:focusable="true"
app:strokeWidth="0dp"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.card.MaterialCardView
android:id="@+id/cv_content"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardBackgroundColor="@android:color/transparent"
android:layout_marginBottom="4dp"
android:clickable="true"
android:focusable="true"
app:strokeWidth="0dp"
app:layout_constraintTop_toTopOf="parent">
android:orientation="vertical">
<LinearLayout
<com.google.android.material.card.MaterialCardView
android:id="@+id/cd_cover"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
android:layout_height="match_parent"
app:cardCornerRadius="6dp"
android:layout_marginHorizontal="8dp"
android:layout_marginTop="8dp"
android:transitionName="img_cover"
app:strokeWidth="0dp">
<com.google.android.material.card.MaterialCardView
android:id="@+id/cd_cover"
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:cardCornerRadius="6dp"
android:layout_marginHorizontal="8dp"
android:layout_marginTop="8dp"
android:transitionName="img_cover"
app:strokeWidth="0dp">
android:layout_height="wrap_content">
<androidx.constraintlayout.widget.ConstraintLayout
<io.legado.app.ui.widget.image.CoverImageView
android:id="@+id/iv_cover"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="@drawable/image_cover_default"
tools:ignore="ImageContrastCheck" />
<io.legado.app.ui.widget.image.CoverImageView
android:id="@+id/iv_cover"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="@drawable/image_cover_default"
tools:ignore="ImageContrastCheck" />
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/rl_loading"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="4dp"
android:layout_marginHorizontal="12dp"
android:indeterminate="true"
android:visibility="invisible"
android:layout_gravity="top"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/rl_loading"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="4dp"
android:layout_marginHorizontal="12dp"
android:indeterminate="true"
android:visibility="invisible"
android:layout_gravity="top"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.card.MaterialCardView
android:id="@+id/cd_unread"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="4dp"
android:visibility="visible"
app:cardCornerRadius="4dp"
app:strokeWidth="0dp"
app:cardBackgroundColor="?attr/colorSecondaryVariant"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.card.MaterialCardView
android:id="@+id/cd_unread"
<TextView
android:id="@+id/tv_unread"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="4dp"
android:visibility="visible"
app:cardCornerRadius="4dp"
app:strokeWidth="0dp"
app:cardBackgroundColor="?attr/colorSecondaryVariant"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent">
android:textColor="?attr/colorOnSecondary"
android:textSize="10sp"
android:padding="4dp"
android:textStyle="bold"
android:includeFontPadding="false"
tools:text="5"
tools:ignore="SmallSp" />
<TextView
android:id="@+id/tv_unread"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?attr/colorOnSecondary"
android:textSize="10sp"
android:padding="4dp"
android:textStyle="bold"
android:includeFontPadding="false"
tools:text="5"
tools:ignore="SmallSp" />
</com.google.android.material.card.MaterialCardView>
</com.google.android.material.card.MaterialCardView>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
</com.google.android.material.card.MaterialCardView>
<!-- 书名 -->
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:layout_marginBottom="6dp"
android:layout_marginHorizontal="8dp"
android:ellipsize="end"
android:gravity="left"
android:lines="2"
android:text="@string/book_name"
android:textSize="12sp"
android:textStyle="bold"
tools:ignore="RtlHardcoded" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
<!-- 书名 -->
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:layout_marginBottom="6dp"
android:layout_marginHorizontal="8dp"
android:ellipsize="end"
android:gravity="left"
android:lines="2"
android:text="@string/book_name"
android:textSize="12sp"
android:textStyle="bold"
tools:ignore="RtlHardcoded" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -1,156 +1,151 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/cv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:foreground="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
app:strokeWidth="0dp"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.card.MaterialCardView
android:id="@+id/cv_content"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:foreground="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
app:strokeWidth="0dp"
app:layout_constraintTop_toTopOf="parent">
android:orientation="vertical">
<LinearLayout
<com.google.android.material.card.MaterialCardView
android:id="@+id/cd_cover"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
android:layout_height="match_parent"
app:cardCornerRadius="6dp"
android:layout_marginHorizontal="8dp"
android:layout_marginTop="8dp"
android:transitionName="img_cover"
app:strokeWidth="0dp">
<com.google.android.material.card.MaterialCardView
android:id="@+id/cd_cover"
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:cardCornerRadius="6dp"
android:layout_marginHorizontal="8dp"
android:layout_marginTop="8dp"
android:transitionName="img_cover"
app:strokeWidth="0dp">
android:layout_height="wrap_content">
<androidx.constraintlayout.widget.ConstraintLayout
<io.legado.app.ui.widget.image.CoverImageView
android:id="@+id/iv_cover"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="?attr/colorSurfaceVariant"
tools:ignore="ImageContrastCheck" />
<io.legado.app.ui.widget.image.CoverImageView
android:id="@+id/iv_cover"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="?attr/colorSurfaceVariant"
tools:ignore="ImageContrastCheck" />
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/rl_loading"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="4dp"
android:layout_marginHorizontal="12dp"
android:indeterminate="true"
android:visibility="invisible"
android:layout_gravity="top"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/rl_loading"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="4dp"
android:layout_marginHorizontal="12dp"
android:indeterminate="true"
android:visibility="invisible"
android:layout_gravity="top"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.card.MaterialCardView
android:id="@+id/cd_unread"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="4dp"
android:visibility="visible"
app:cardCornerRadius="4dp"
app:strokeWidth="0dp"
app:cardBackgroundColor="?attr/colorSecondaryVariant"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.card.MaterialCardView
android:id="@+id/cd_unread"
<TextView
android:id="@+id/tv_unread"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="4dp"
android:visibility="visible"
app:cardCornerRadius="4dp"
app:strokeWidth="0dp"
app:cardBackgroundColor="?attr/colorSecondaryVariant"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent">
android:textColor="?attr/colorSurface"
android:textSize="10sp"
android:padding="4dp"
android:textStyle="bold"
android:includeFontPadding="false"
tools:text="5"
tools:ignore="SmallSp" />
<TextView
android:id="@+id/tv_unread"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?attr/colorSurface"
android:textSize="10sp"
android:padding="4dp"
android:textStyle="bold"
android:includeFontPadding="false"
tools:text="5"
tools:ignore="SmallSp" />
</com.google.android.material.card.MaterialCardView>
</com.google.android.material.card.MaterialCardView>
<io.legado.app.ui.widget.image.CoverImageView
android:id="@+id/iv_cover1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:layout_marginBottom="2dp"
android:layout_marginStart="4dp"
android:layout_marginEnd="2dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toStartOf="@id/iv_cover2"
app:layout_constraintBottom_toTopOf="@id/iv_cover3"/>
<io.legado.app.ui.widget.image.CoverImageView
android:id="@+id/iv_cover1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:layout_marginBottom="2dp"
android:layout_marginStart="4dp"
android:layout_marginEnd="2dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toStartOf="@id/iv_cover2"
app:layout_constraintBottom_toTopOf="@id/iv_cover3"/>
<io.legado.app.ui.widget.image.CoverImageView
android:id="@+id/iv_cover2"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginTop="4dp"
android:layout_marginBottom="2dp"
android:layout_marginEnd="4dp"
android:layout_marginStart="2dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toEndOf="@id/iv_cover1"
app:layout_constraintBottom_toTopOf="@id/iv_cover4"/>
<io.legado.app.ui.widget.image.CoverImageView
android:id="@+id/iv_cover2"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginTop="4dp"
android:layout_marginBottom="2dp"
android:layout_marginEnd="4dp"
android:layout_marginStart="2dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toEndOf="@id/iv_cover1"
app:layout_constraintBottom_toTopOf="@id/iv_cover4"/>
<io.legado.app.ui.widget.image.CoverImageView
android:id="@+id/iv_cover3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginStart="4dp"
android:layout_marginBottom="4dp"
android:layout_marginEnd="2dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/iv_cover1"
app:layout_constraintEnd_toStartOf="@id/iv_cover4"/>
<io.legado.app.ui.widget.image.CoverImageView
android:id="@+id/iv_cover3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginStart="4dp"
android:layout_marginBottom="4dp"
android:layout_marginEnd="2dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/iv_cover1"
app:layout_constraintEnd_toStartOf="@id/iv_cover4"/>
<io.legado.app.ui.widget.image.CoverImageView
android:id="@+id/iv_cover4"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginEnd="4dp"
android:layout_marginBottom="4dp"
android:layout_marginStart="2dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/iv_cover2"
app:layout_constraintStart_toEndOf="@id/iv_cover3"/>
<io.legado.app.ui.widget.image.CoverImageView
android:id="@+id/iv_cover4"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginEnd="4dp"
android:layout_marginBottom="4dp"
android:layout_marginStart="2dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/iv_cover2"
app:layout_constraintStart_toEndOf="@id/iv_cover3"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
</com.google.android.material.card.MaterialCardView>
<!-- 书名 -->
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:layout_marginBottom="6dp"
android:layout_marginHorizontal="8dp"
android:ellipsize="end"
android:gravity="left"
android:lines="2"
android:text="@string/book_name"
android:textSize="12sp"
android:textStyle="bold"
tools:ignore="RtlHardcoded" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</androidx.constraintlayout.widget.ConstraintLayout>
<!-- 书名 -->
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:layout_marginBottom="6dp"
android:layout_marginHorizontal="8dp"
android:ellipsize="end"
android:gravity="left"
android:lines="2"
android:text="@string/book_name"
android:textSize="12sp"
android:textStyle="bold"
tools:ignore="RtlHardcoded" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
+55 -44
View File
@@ -19,58 +19,69 @@
android:id="@+id/cd_cover"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:cardCornerRadius="6dp"
app:strokeWidth="0dp"
android:layout_margin="8dp"
app:strokeWidth="0dp"
app:cardCornerRadius="8dp"
app:layout_constraintTop_toTopOf="parent"
android:transitionName="img_cover"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent">
<io.legado.app.ui.widget.image.CoverImageView
android:id="@+id/iv_cover"
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_cover"
android:layout_width="70dp"
android:layout_height="98dp"
android:scaleType="centerCrop"
android:src="@drawable/image_cover_default"
tools:ignore="ImageContrastCheck" />
</com.google.android.material.card.MaterialCardView>
android:layout_height="98dp">
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/rl_loading"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginVertical="4dp"
android:layout_marginHorizontal="6dp"
android:indeterminate="true"
android:visibility="invisible"
android:layout_gravity="top"
app:layout_constraintTop_toTopOf="@id/cd_cover"
app:layout_constraintStart_toStartOf="@id/cd_cover"
app:layout_constraintEnd_toEndOf="@id/cd_cover" />
<io.legado.app.ui.widget.image.CoverImageView
android:id="@+id/iv_cover"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="@drawable/image_cover_default"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
tools:ignore="ImageContrastCheck" />
<com.google.android.material.card.MaterialCardView
android:id="@+id/cd_unread"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="4dp"
android:visibility="visible"
app:cardCornerRadius="4dp"
app:strokeWidth="0dp"
app:cardBackgroundColor="?attr/colorSecondaryVariant"
app:layout_constraintTop_toTopOf="@id/cd_cover"
app:layout_constraintEnd_toEndOf="@id/cd_cover">
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/rl_loading"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="4dp"
android:layout_marginHorizontal="6dp"
android:indeterminate="true"
android:visibility="invisible"
android:layout_gravity="top"
app:layout_constraintTop_toTopOf="@id/iv_cover"
app:layout_constraintStart_toStartOf="@id/iv_cover"
app:layout_constraintEnd_toEndOf="@id/iv_cover" />
<TextView
android:id="@+id/tv_unread"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?attr/colorOnSecondary"
android:textSize="10sp"
android:padding="4dp"
android:textStyle="bold"
android:includeFontPadding="false"
tools:text="5"
tools:ignore="SmallSp" />
<com.google.android.material.card.MaterialCardView
android:id="@+id/cd_unread"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="4dp"
android:visibility="visible"
app:cardCornerRadius="4dp"
app:strokeWidth="0dp"
app:cardBackgroundColor="?attr/colorSecondaryVariant"
app:layout_constraintTop_toTopOf="@id/iv_cover"
app:layout_constraintEnd_toEndOf="@id/iv_cover">
<TextView
android:id="@+id/tv_unread"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?attr/colorOnSecondary"
android:textSize="10sp"
android:padding="4dp"
android:textStyle="bold"
android:includeFontPadding="false"
tools:text="5"
tools:ignore="SmallSp" />
</com.google.android.material.card.MaterialCardView>
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
<LinearLayout
+2 -2
View File
@@ -1280,9 +1280,9 @@
<string name="privacy">隐私</string>
<string name="notification_permission">通知权限</string>
<string name="background_permission">后台权限</string>
<string name="opt_animation">从书架进入阅读界面时,优化动画效果。</string>
<string name="opt_animation">从书架进入阅读界面时,优化动画效果。在某些设备上可能无法正常工作</string>
<string name="use_animation">使用共享元素动画</string>
<string name="reduce_stutter">减少进入阅读界面时的卡顿,但加载书籍时间会延长。</string>
<string name="reduce_stutter">减少进入阅读界面时的卡顿,但加载书籍时间会延长。仅在开启共享元素动画时生效</string>
<string name="delay_book_load">延缓书籍加载</string>
<string name="compact_list">紧凑列表</string>
<string name="author_read">%s • %d章未读</string>
+1 -1
View File
@@ -162,7 +162,7 @@
app:layout="@layout/view_preference_category">
<io.legado.app.lib.prefs.SwitchPreference
android:defaultValue="true"
android:defaultValue="false"
android:key="sharedElementEnterTransitionEnable"
android:summary="@string/opt_animation"
android:title="@string/use_animation" />