我已经实现了一个启动画面,它用一个居中的图像activity
来膨胀它layout
,但我发现如果这是第一次安装应用程序,在加载/编译期间会显示一个空白屏幕,或多或少 6 秒,第二次启动应用程序时,它会直接使用 SplashScreen 启动。
图形像这样
安装后首次运行应用程序或从配置菜单中删除数据
(点击打开应用程序)..................................(启动画面)------(完成)
第二次打开应用程序
(点击打开应用)(闪屏)------(完成)
我的问题是有什么方法可以在 Android 预加载期间放置一个启动画面?
清单.xml
<activity
android:name=".SplashActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:theme="@style/AppTheme.SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
AppTheme.SplashTheme
Activity 继承的 Theme 的样式
<style name="AppTheme.SplashTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowEnterAnimation">@android:anim/fade_in</item>
</style>
布局 XML splash_screen.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorSplashScreen">
<LinearLayout
android:id="@+id/splashscreen"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical|center_horizontal">
<ImageView
android:layout_width="wrap_content"
android:contentDescription="@string/about.alt_logo"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher"
android:layout_gravity="center"/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:layout_marginTop="8dp" />
</LinearLayout>
</LinearLayout>
SplashActivity.java
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.widget.LinearLayout;
/*
config_longAnimTime = 400
config_mediumAnimTime = 300
config_shortAnimTime = 150
*/
public class SplashActivity extends AppCompatActivity {
private String TAG = "SplashActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
final int SPLASH_DISPLAY_LENGTH = 1200;
final int SPLASH_DISPLAY_OFFSET = getResources().getInteger(android.R.integer.config_shortAnimTime);;
super.onCreate(savedInstanceState);
setContentView(R.layout.splash_screen);
Log.d(TAG, "onCreate() called with: " + "savedInstanceState = [" + savedInstanceState + "]");
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
final LinearLayout img = (LinearLayout) SplashActivity.this.findViewById(R.id.splashscreen);
Animation fadeOut = new AlphaAnimation(1, 0);
fadeOut.setInterpolator(new AccelerateInterpolator());
fadeOut.setDuration(getResources().getInteger(android.R.integer.config_longAnimTime));
fadeOut.setAnimationListener(new Animation.AnimationListener()
{
public void onAnimationEnd(Animation animation)
{
img.setVisibility(View.GONE);
handler.postDelayed(new Runnable() {
@Override
public void run() {
//Create an intent that will start the main activity.
Intent mainIntent = new Intent(SplashActivity.this, MainActivity.class);
SplashActivity.this.startActivity(mainIntent);
//Apply splash exit (fade out) and main entry (fade in) animation transitions.
overridePendingTransition(R.anim.zoom_enter, android.R.anim.fade_out);
//Finish splash activity so user cant go back to it.
SplashActivity.this.finish();
}
}, SPLASH_DISPLAY_OFFSET);
}
public void onAnimationRepeat(Animation animation) {}
public void onAnimationStart(Animation animation) {}
});
img.startAnimation(fadeOut);
Log.d(TAG, "finish SplashScreen: " + SPLASH_DISPLAY_LENGTH);
}
}, SPLASH_DISPLAY_LENGTH);
}
}
更新: 显示白屏是因为它继承自轻主题,因为如果我添加主题的样式,则屏幕显示为黑色。
<item name="android:background">#FF000000</item>
<item name="android:colorBackground">#FF000000</item>
我认为解决方案在于在使用xml布局之前通过加载主题来实现绘制图标,打开应用程序--->应用主题---->在前端加载布局。
当您希望应用程序的主屏幕 (SplashScreen)在启动时不显示烦人的白色背景时,可以通过创建与活动相关的主题轻松解决:
实际上,启动活动时定义背景的属性是
android:windowBackground
,您可以添加图像(@drawable/
)或颜色(
@color/
):在我们的内部
AndroidManifest.xml
,我们可以在应用程序级别定义主题:或一些特定的活动:
有了这个,我们总是确保在加载图像或完全启动应用程序之前加载背景(可绘制或颜色)。
更新 阅读该帖子高效的启动画面(中) 我添加了不透明
在可绘制对象中定义启动画面的背景
background_splash.xml
我应用顶部偏移来微调从预加载屏幕到启动屏幕的过渡
将在 styles.xml 中创建的可绘制对象指定为背景
顺便说一句,我消除了在应用程序图标下显示文本的想法,因为我还没有找到如何直接作为drawable来做。
布局 splash_screen.xml
动态更改主题的可选代码,以防您不使用中间活动制作 splascreen: