From 22627510654b540a3a18be377115a4b05c990aaa Mon Sep 17 00:00:00 2001 From: ShirosakiMio <852468399@qq.com> Date: Mon, 19 Aug 2024 13:58:06 +0800 Subject: [PATCH] add more animation --- FCL/build.gradle | 1 + FCL/src/main/java/com/mio/util/AnimUtil.kt | 99 +++++++++++++++++++ .../fcl/ui/download/RemoteModListAdapter.java | 20 +--- .../ui/download/RemoteVersionListAdapter.java | 2 + FCL/src/main/res/layout/activity_main.xml | 17 +++- .../main/res/layout/item_remote_version.xml | 3 +- .../fcllibrary/component/view/FCLButton.java | 2 + .../component/view/FCLMenuView.java | 3 + FCLLibrary/src/main/res/xml/anim_scale.xml | 31 ++++++ .../src/main/res/xml/anim_scale_large.xml | 31 ++++++ 10 files changed, 189 insertions(+), 20 deletions(-) create mode 100644 FCL/src/main/java/com/mio/util/AnimUtil.kt create mode 100644 FCLLibrary/src/main/res/xml/anim_scale.xml create mode 100644 FCLLibrary/src/main/res/xml/anim_scale_large.xml diff --git a/FCL/build.gradle b/FCL/build.gradle index 9bee9651..e51e893a 100644 --- a/FCL/build.gradle +++ b/FCL/build.gradle @@ -188,6 +188,7 @@ dependencies { implementation 'com.google.android.material:material:1.11.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'com.github.Mathias-Boulay:android_gamepad_remapper:06184ddbce' + implementation 'com.github.bumptech.glide:glide:4.16.0' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' diff --git a/FCL/src/main/java/com/mio/util/AnimUtil.kt b/FCL/src/main/java/com/mio/util/AnimUtil.kt new file mode 100644 index 00000000..776467d9 --- /dev/null +++ b/FCL/src/main/java/com/mio/util/AnimUtil.kt @@ -0,0 +1,99 @@ +package com.mio.util + +import android.animation.ObjectAnimator +import android.animation.TimeInterpolator +import android.view.View + +class AnimUtil { + + companion object { + @JvmStatic + fun playTranslationY( + view: View, + duration: Long, + vararg values: Float + ): ObjectAnimator { + return ObjectAnimator.ofFloat(view, "translationY", *values).apply { + this.duration = duration + } + } + + @JvmStatic + fun playTranslationX( + view: View, + duration: Long, + vararg values: Float + ): ObjectAnimator { + return ObjectAnimator.ofFloat(view, "translationX", *values).apply { + this.duration = duration + } + } + + @JvmStatic + fun playTranslationZ( + view: View, + duration: Long, + vararg values: Float + ): ObjectAnimator { + return ObjectAnimator.ofFloat(view, "translationZ", *values).apply { + this.duration = duration + } + } + + @JvmStatic + fun playRotation( + view: View, + duration: Long, + vararg values: Float + ): ObjectAnimator { + return ObjectAnimator.ofFloat(view, "rotation", *values).apply { + this.duration = duration + } + } + + @JvmStatic + fun playScaleX( + view: View, + duration: Long, + vararg values: Float + ): ObjectAnimator { + return ObjectAnimator.ofFloat(view, "scaleX", *values).apply { + this.duration = duration + } + } + + @JvmStatic + fun playScaleY( + view: View, + duration: Long, + vararg values: Float + ): ObjectAnimator { + return ObjectAnimator.ofFloat(view, "scaleY", *values).apply { + this.duration = duration + } + } + + @JvmStatic + fun playAlpha( + view: View, + duration: Long, + vararg values: Float + ): ObjectAnimator { + return ObjectAnimator.ofFloat(view, "alpha", *values).apply { + this.duration = duration + } + } + + @JvmStatic + fun ObjectAnimator.delay(delayTime: Long): ObjectAnimator { + this.startDelay = delayTime + return this + } + + @JvmStatic + fun ObjectAnimator.interpolator(interpolator: TimeInterpolator): ObjectAnimator { + this.interpolator = interpolator + return this + } + } +} \ No newline at end of file diff --git a/FCL/src/main/java/com/tungsten/fcl/ui/download/RemoteModListAdapter.java b/FCL/src/main/java/com/tungsten/fcl/ui/download/RemoteModListAdapter.java index 64217533..cf75cbe3 100644 --- a/FCL/src/main/java/com/tungsten/fcl/ui/download/RemoteModListAdapter.java +++ b/FCL/src/main/java/com/tungsten/fcl/ui/download/RemoteModListAdapter.java @@ -7,12 +7,15 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import com.bumptech.glide.Glide; +import com.mio.util.AnimUtil; import com.tungsten.fcl.R; import com.tungsten.fcl.util.ModTranslations; import com.tungsten.fclcore.mod.RemoteMod; import com.tungsten.fclcore.task.Schedulers; import com.tungsten.fclcore.util.StringUtils; import com.tungsten.fcllibrary.component.FCLAdapter; +import com.tungsten.fcllibrary.component.theme.ThemeEngine; import com.tungsten.fcllibrary.util.LocaleUtils; import com.tungsten.fcllibrary.component.view.FCLImageView; import com.tungsten.fcllibrary.component.view.FCLLinearLayout; @@ -76,21 +79,7 @@ public class RemoteModListAdapter extends FCLAdapter { viewHolder.parent.setOnClickListener(v -> callback.onItemSelect(remoteMod)); viewHolder.icon.setImageDrawable(null); viewHolder.icon.setTag(i); - new Thread(() -> { - try { - URL url = new URL(remoteMod.getIconUrl()); - HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); - httpURLConnection.setDoInput(true); - httpURLConnection.connect(); - InputStream inputStream = httpURLConnection.getInputStream(); - Bitmap icon = BitmapFactory.decodeStream(inputStream); - if (viewHolder.icon.getTag().equals(i)) { - Schedulers.androidUIThread().execute(() -> viewHolder.icon.setImageBitmap(icon)); - } - } catch (IOException e) { - e.printStackTrace(); - } - }).start(); + Glide.with(getContext()).load(remoteMod.getIconUrl()).into(viewHolder.icon); ModTranslations.Mod mod = ModTranslations.getTranslationsByRepositoryType(downloadPage.repository.getType()).getModByCurseForgeId(remoteMod.getSlug()); viewHolder.name.setText(mod != null && LocaleUtils.isChinese(getContext()) ? mod.getDisplayName() : remoteMod.getTitle()); List categories = remoteMod.getCategories().stream().map(downloadPage::getLocalizedCategory).collect(Collectors.toList()); @@ -99,6 +88,7 @@ public class RemoteModListAdapter extends FCLAdapter { String tag = StringUtils.removeSuffix(stringBuilder.toString(), " "); viewHolder.tag.setText(tag); viewHolder.description.setText(remoteMod.getDescription()); + AnimUtil.playTranslationX(view, ThemeEngine.getInstance().getTheme().getAnimationSpeed() * 30L, -100f, 0f).start(); return view; } diff --git a/FCL/src/main/java/com/tungsten/fcl/ui/download/RemoteVersionListAdapter.java b/FCL/src/main/java/com/tungsten/fcl/ui/download/RemoteVersionListAdapter.java index 635d2403..37a776e6 100644 --- a/FCL/src/main/java/com/tungsten/fcl/ui/download/RemoteVersionListAdapter.java +++ b/FCL/src/main/java/com/tungsten/fcl/ui/download/RemoteVersionListAdapter.java @@ -10,6 +10,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import com.mio.util.AnimUtil; import com.tungsten.fcl.R; import com.tungsten.fclcore.download.RemoteVersion; import com.tungsten.fclcore.download.fabric.FabricAPIRemoteVersion; @@ -84,6 +85,7 @@ public class RemoteVersionListAdapter extends FCLAdapter { viewHolder.tag.setText(getTag(remoteVersion)); viewHolder.date.setVisibility(remoteVersion.getReleaseDate() == null ? View.GONE : View.VISIBLE); viewHolder.date.setText(remoteVersion.getReleaseDate() == null ? "" : formatDateTime(getContext(), remoteVersion.getReleaseDate())); + AnimUtil.playTranslationX(view, ThemeEngine.getInstance().getTheme().getAnimationSpeed() * 30L, -100f, 0f).start(); return view; } diff --git a/FCL/src/main/res/layout/activity_main.xml b/FCL/src/main/res/layout/activity_main.xml index 51f3b9b5..565e270c 100644 --- a/FCL/src/main/res/layout/activity_main.xml +++ b/FCL/src/main/res/layout/activity_main.xml @@ -22,7 +22,9 @@ android:paddingBottom="10dp" android:orientation="vertical" android:layout_width="wrap_content" - android:layout_height="wrap_content"> + android:layout_height="wrap_content" + android:clipChildren="false" + android:clipToPadding="false"> + app:layout_constraintTop_toBottomOf="@+id/view" + android:clipChildren="false" + android:clipToPadding="false" + android:stateListAnimator="@xml/anim_scale"> + android:id="@+id/avatar" + android:focusable="true" + android:clickable="true" + android:stateListAnimator="@xml/anim_scale_large"/> + app:layout_constraintStart_toStartOf="parent" + android:stateListAnimator="@xml/anim_scale"> + android:orientation="horizontal" + android:stateListAnimator="@xml/anim_scale"> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/FCLLibrary/src/main/res/xml/anim_scale_large.xml b/FCLLibrary/src/main/res/xml/anim_scale_large.xml new file mode 100644 index 00000000..d20d4f9e --- /dev/null +++ b/FCLLibrary/src/main/res/xml/anim_scale_large.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + \ No newline at end of file