feat: 添加主界面开屏动画

MainActivity首次启动时显示5秒开屏画面,展示应用标题和副标题。

- 使用FrameLayout覆盖层实现居中展示
- 标题和副标题依次淡入,5秒后整体淡出
- 开屏背景使用主色调,文字白色/半透明白色
- onDestroy中清理Handler防止内存泄漏
This commit is contained in:
MiMo
2026-07-10 20:18:03 +08:00
parent 0ca74b324b
commit 1155e8c5c8
5 changed files with 125 additions and 21 deletions
+2 -2
View File
@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Fri Jul 10 13:02:55 HKT 2026 #Fri Jul 10 20:15:30 CST 2026
stageCount=4 stageCount=4
libraryProject= libraryProject=
baseVersion=15.20 baseVersion=15.20
publishVersion=15.20.3 publishVersion=15.20.3
buildCount=0 buildCount=3
baseBetaVersion=15.20.4 baseBetaVersion=15.20.4
@@ -2,8 +2,13 @@ package cc.winboll.studio.bytheway;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.widget.TextView;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import cc.winboll.studio.bytheway.activities.AboutActivity; import cc.winboll.studio.bytheway.activities.AboutActivity;
import cc.winboll.studio.bytheway.activities.BaseWinBoLLActivity; import cc.winboll.studio.bytheway.activities.BaseWinBoLLActivity;
@@ -18,6 +23,11 @@ import cc.winboll.studio.libappbase.ToastUtils;
public class MainActivity extends BaseWinBoLLActivity { public class MainActivity extends BaseWinBoLLActivity {
public static final String TAG = "MainActivity"; public static final String TAG = "MainActivity";
private static final long SPLASH_DURATION = 5000L;
private static final long SPLASH_FADE_IN = 800L;
private static final long SPLASH_FADE_OUT = 500L;
private View splashOverlay;
private final Handler splashHandler = new Handler();
@Override @Override
public String getTag() { public String getTag() {
@@ -33,6 +43,7 @@ public class MainActivity extends BaseWinBoLLActivity {
Toolbar toolbar = findViewById(R.id.toolbar); Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
initSplash();
ToastUtils.show("onCreate"); ToastUtils.show("onCreate");
} }
@@ -41,6 +52,12 @@ public class MainActivity extends BaseWinBoLLActivity {
super.onResume(); super.onResume();
} }
@Override
protected void onDestroy() {
splashHandler.removeCallbacksAndMessages(null);
super.onDestroy();
}
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
AESThemeUtil.inflateCompatThemeMenu(this, menu); AESThemeUtil.inflateCompatThemeMenu(this, menu);
@@ -76,4 +93,43 @@ public class MainActivity extends BaseWinBoLLActivity {
} }
return true; return true;
} }
private void initSplash() {
splashOverlay = findViewById(R.id.splash_overlay);
final TextView splashTitle = findViewById(R.id.splash_title);
final TextView splashSubtitle = findViewById(R.id.splash_subtitle);
AlphaAnimation fadeInTitle = new AlphaAnimation(0f, 1f);
fadeInTitle.setDuration(SPLASH_FADE_IN);
fadeInTitle.setFillAfter(true);
splashTitle.startAnimation(fadeInTitle);
AlphaAnimation fadeInSubtitle = new AlphaAnimation(0f, 1f);
fadeInSubtitle.setDuration(SPLASH_FADE_IN);
fadeInSubtitle.setStartOffset(SPLASH_FADE_IN);
fadeInSubtitle.setFillAfter(true);
splashSubtitle.startAnimation(fadeInSubtitle);
splashHandler.postDelayed(new Runnable() {
@Override
public void run() {
AlphaAnimation fadeOut = new AlphaAnimation(1f, 0f);
fadeOut.setDuration(SPLASH_FADE_OUT);
fadeOut.setFillAfter(true);
fadeOut.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {}
@Override
public void onAnimationEnd(Animation animation) {
splashOverlay.setVisibility(View.GONE);
}
@Override
public void onAnimationRepeat(Animation animation) {}
});
splashOverlay.startAnimation(fadeOut);
}
}, SPLASH_DURATION);
}
} }
+61 -18
View File
@@ -1,29 +1,72 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout <FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent">
android:orientation="vertical">
<cc.winboll.studio.libaes.views.ASupportToolbar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/toolbar"/>
<LinearLayout <LinearLayout
android:orientation="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="match_parent"
android:layout_weight="1.0" android:orientation="vertical">
android:gravity="center_vertical|center_horizontal">
<TextView <cc.winboll.studio.libaes.views.ASupportToolbar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/toolbar"/>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1.0"
android:gravity="center_vertical|center_horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ByTheWay"
android:textAppearance="?android:attr/textAppearanceLarge"/>
</LinearLayout>
</LinearLayout>
<FrameLayout
android:id="@+id/splash_overlay"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/splashBackground"
android:clickable="true"
android:focusable="true">
<LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="ByTheWay" android:layout_gravity="center"
android:textAppearance="?android:attr/textAppearanceLarge"/> android:orientation="vertical"
android:gravity="center"
android:padding="32dp">
</LinearLayout> <TextView
</LinearLayout> android:id="@+id/splash_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/splash_title"
android:textColor="@color/splashTitleText"
android:textSize="36sp"
android:textStyle="bold"
android:layout_marginBottom="16dp"/>
<TextView
android:id="@+id/splash_subtitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/splash_subtitle"
android:textColor="@color/splashSubtitleText"
android:textSize="14sp"
android:textStyle="italic"/>
</LinearLayout>
</FrameLayout>
</FrameLayout>
+3
View File
@@ -9,4 +9,7 @@
<color name="toolbarBackgroundColor">#1565C0</color> <color name="toolbarBackgroundColor">#1565C0</color>
<color name="debugTextColor">#616161</color> <color name="debugTextColor">#616161</color>
<color name="colorTextBackgound">#FAFAFA</color> <color name="colorTextBackgound">#FAFAFA</color>
<color name="splashBackground">#1565C0</color>
<color name="splashTitleText">#FFFFFF</color>
<color name="splashSubtitleText">#B3FFFFFF</color>
</resources> </resources>
+3 -1
View File
@@ -4,5 +4,7 @@
<string name="action_gps_list">GPS列表</string> <string name="action_gps_list">GPS列表</string>
<string name="action_about">应用介绍</string> <string name="action_about">应用介绍</string>
<string name="app_description">The [ByTheWay] project is designed to quickly schedule task reminders related to time and location. Its main feature is the ability to quickly create task-related data.</string> <string name="app_description">The [ByTheWay] project is designed to quickly schedule task reminders related to time and location. Its main feature is the ability to quickly create task-related data.</string>
<string name="splash_title">ByTheWay</string>
<string name="splash_subtitle">By the way, I mention this for you.</string>
</resources> </resources>