显示保留纵横比和裁剪边的 Android 初始屏幕

Law*_*tic 5 xml android splash-screen imageview

我想在应用程序启动后立即显示启动屏幕,并且希望它保留其原始的宽高比,同时尽可能地适合屏幕,裁剪侧面。让我用数字举一个例子。假设启动屏幕图像为 2048x1536(4x3 比例)。当它在 1280x800 屏幕 (16x10) 的设备上显示时,它应该缩小到 1280x960 并在顶部和底部裁剪 80px。

我的 SplashScreenActivity 如下所示:

public class SplashActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = new Intent(this, GameActivity.class);
        startActivity(intent);
        finish();
    }
}
Run Code Online (Sandbox Code Playgroud)

样式.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>

<style name="SplashTheme" parent="Theme.AppCompat.Light">
    <item name="android:windowBackground">@layout/splash</item>
</style>

</resources>
Run Code Online (Sandbox Code Playgroud)

我发现 ImageView 与 android:scaleType="centerCrop" 可能会成功。但如果layout/splash.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" >

  <ImageView
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:scaleType="centerCrop"
      android:src="@drawable/splash_bg_portrait" />

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

该应用程序在启动时崩溃。像这样使用ImageView是完全不可能的还是某些参数错误?

另外要注意的是,我没有使用 setContentView(R.layout.splash) 也没有故意延迟启动画面 Activity,因为这个启动画面的目的不是为了增加玩家的等待时间,而是为了给玩家应用程序启动时,您可以看到一些东西,而不是空白屏幕。

UPD。 日志猫:

05-27 12:07:42.949   654   673 W WindowManager: Token{423c44b8 ActivityRecord{4225d620 u0 com.myapp.jq.google/com.myapp.jq.SplashActivity t15}} failed creating starting window
05-27 12:07:42.949   654   673 W WindowManager: android.content.res.Resources$NotFoundException: File res/layout/splash.xml from drawable resource ID #0x7f03002d
05-27 12:07:42.949   654   673 W WindowManager:     at android.content.res.Resources.loadDrawable(Resources.java:2152)
05-27 12:07:42.949   654   673 W WindowManager:     at android.content.res.Resources.getDrawable(Resources.java:710)
05-27 12:07:42.949   654   673 W WindowManager:     at com.android.internal.policy.impl.PhoneWindow.generateLayout(PhoneWindow.java:3109)
05-27 12:07:42.949   654   673 W WindowManager:     at com.android.internal.policy.impl.PhoneWindow.installDecor(PhoneWindow.java:3152)
05-27 12:07:42.949   654   673 W WindowManager:     at com.android.internal.policy.impl.PhoneWindow.getDecorView(PhoneWindow.java:1718)
05-27 12:07:42.949   654   673 W WindowManager:     at com.android.internal.policy.impl.PhoneWindowManager.addStartingWindow(PhoneWindowManager.java:1850)
05-27 12:07:42.949   654   673 W WindowManager:     at com.android.server.wm.WindowManagerService$H.handleMessage(WindowManagerService.java:7825)
05-27 12:07:42.949   654   673 W WindowManager:     at android.os.Handler.dispatchMessage(Handler.java:110)
05-27 12:07:42.949   654   673 W WindowManager:     at android.os.Looper.loop(Looper.java:193)
05-27 12:07:42.949   654   673 W WindowManager:     at android.os.HandlerThread.run(HandlerThread.java:61)
05-27 12:07:42.949   654   673 W WindowManager: Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #2: invalid drawable tag LinearLayout
05-27 12:07:42.949   654   673 W WindowManager:     at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:933)
05-27 12:07:42.949   654   673 W WindowManager:     at android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)
05-27 12:07:42.949   654   673 W WindowManager:     at android.content.res.Resources.loadDrawable(Resources.java:2148)
05-27 12:07:42.949   654   673 W WindowManager:     ... 9 more
Run Code Online (Sandbox Code Playgroud)

由此看来,LinearLayout(或任何其他布局)不能用于 android:windowBackground。splash.xml 中的图层列表工作正常:

05-27 12:07:42.949   654   673 W WindowManager: Token{423c44b8 ActivityRecord{4225d620 u0 com.myapp.jq.google/com.myapp.jq.SplashActivity t15}} failed creating starting window
05-27 12:07:42.949   654   673 W WindowManager: android.content.res.Resources$NotFoundException: File res/layout/splash.xml from drawable resource ID #0x7f03002d
05-27 12:07:42.949   654   673 W WindowManager:     at android.content.res.Resources.loadDrawable(Resources.java:2152)
05-27 12:07:42.949   654   673 W WindowManager:     at android.content.res.Resources.getDrawable(Resources.java:710)
05-27 12:07:42.949   654   673 W WindowManager:     at com.android.internal.policy.impl.PhoneWindow.generateLayout(PhoneWindow.java:3109)
05-27 12:07:42.949   654   673 W WindowManager:     at com.android.internal.policy.impl.PhoneWindow.installDecor(PhoneWindow.java:3152)
05-27 12:07:42.949   654   673 W WindowManager:     at com.android.internal.policy.impl.PhoneWindow.getDecorView(PhoneWindow.java:1718)
05-27 12:07:42.949   654   673 W WindowManager:     at com.android.internal.policy.impl.PhoneWindowManager.addStartingWindow(PhoneWindowManager.java:1850)
05-27 12:07:42.949   654   673 W WindowManager:     at com.android.server.wm.WindowManagerService$H.handleMessage(WindowManagerService.java:7825)
05-27 12:07:42.949   654   673 W WindowManager:     at android.os.Handler.dispatchMessage(Handler.java:110)
05-27 12:07:42.949   654   673 W WindowManager:     at android.os.Looper.loop(Looper.java:193)
05-27 12:07:42.949   654   673 W WindowManager:     at android.os.HandlerThread.run(HandlerThread.java:61)
05-27 12:07:42.949   654   673 W WindowManager: Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #2: invalid drawable tag LinearLayout
05-27 12:07:42.949   654   673 W WindowManager:     at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:933)
05-27 12:07:42.949   654   673 W WindowManager:     at android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)
05-27 12:07:42.949   654   673 W WindowManager:     at android.content.res.Resources.loadDrawable(Resources.java:2148)
05-27 12:07:42.949   654   673 W WindowManager:     ... 9 more
Run Code Online (Sandbox Code Playgroud)

但不幸的是,layer-list不支持ImageView,bitmap也不支持android:scaleType,也没有类似的功能。