web-dev-qa-db-ja.com

フルスクリーンを引き伸ばしたベクターを備えたSplashScreen

このチュートリアルでスプラッシュスクリーンを作成しましたが、うまく機能します。 https://www.bignerdranch.com/blog/splash-screens-the-right-way/ 基本的に、テーマを介してsplascreenを設定します。

   <style name="ThemeSplash" parent="Theme.AppCompat.NoActionBar">
        <item name="Android:windowBackground">@drawable/drawable_splashcreen</item>
    </style>

次のようにベクトル画像を入れたいと思いました。

(drawable_splashcreen)

<item Android:drawable="@color/color_background_splash_screen" />

<item
    Android:drawable="@drawable/vector_najdiflet_logo"

    />

画像は全画面表示されます。 API 23では、本来あるべきように動作します。しかし、古いデバイスでは、それは単なる不調です。私は幅、高さを試してみましたが、ビューポートで台無しにさえ成功しませんでした。これに対する修正はありますか?

36
WinterChilly

私は同じ問題につまずいた。残念ながら、事前のAPI 23で描画可能なベクターのみでスプラッシュスクリーンを機能させる可能性はないようです。

問題は、この場合のテーマAndroid:windowBackgroundのように、プロセスの外でVectorDrawableCompatをロードできないことです。ここで起こっている可能性が高いのは、API 21でベクターが互換性のためにPNGに変換されることです。そのため、<layered-list>に変換されたPNGが<item>要素に挿入され、<bitmap>要素が欠落しているため、ビットマップがすべてのエッジに引き伸ばされます。

だから私の解決策は次のとおりです:

フォルダーdrawable_splashscreen.xml内にdrawables-v23を作成します。これは、ベクトルdrawableに対して次のようになります

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android" 
Android:opacity="opaque">

    <item Android:drawable="?attr/colorPrimary"/>

    <item Android:drawable="@drawable/ic_splashscreen" Android:gravity="center"/>

</layer-list>

次に、別のdrawable_splashscreen.xmlを作成しますが、通常のdrawablesフォルダー内に作成します

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android" 
Android:opacity="opaque">

    <item Android:drawable="?attr/colorPrimary"/>

    <item>
        <bitmap Android:src="@drawable/ic_splashscreen" Android:gravity="center"/>
    </item>

</layer-list>

<bitmap>要素に注目してください。そのため、PNGがAPI 23より前のデバイスで使用されると、適切に表示され、背景全体に拡大されません。残念ながら、古いAPIで機能させるには、スプラッシュスクリーンをPNGとして提供する必要があります。ただし、API 23+を搭載したすべてのデバイスでは、ベクトルドロウアブルが使用されます。

この問題が同じ問題を抱えている人に役立つことを願っています!

11
Airbagman

全画面スプラッシュを使用するには、次を使用してください。

Android:gravity="fill_horizontal|fill_vertical"

解決しない場合、解決策は解像度サイズごとに別々の画像を作成することです。


最も一般的な解像度:

  • 小= 240 x 320ピクセル(ldpi)
  • 中= 320 x 480px(mdpi)
  • 大= 480 x 800ピクセル(hdpi)
  • xLarge = 640 x 960px(xhdpi)

ポートレート形式:

  • ldpi = 240 x 360px(0.75 x mdpi)
  • mdpi = 320 x 480px(基本密度)
  • hdpi = 480 x 720px(1.5 x mdpi)
  • xhdpi = 640 x 960px(2 x mdpi)
  • xxhdpi = 960 x 1440px(3 x mdpi)
  • xxxhdpi = 1080 x 1920px(4 x mdpi)

横長形式(反転縦長形式):

  • ldpi = 360 x 240px(0.75 x mdpi)
  • mdpi = 480 x 320px(基本密度)
  • hdpi = 720 x 480px(1.5 x mdpi)
  • xhdpi = 960 x 640px(2 x mdpi)
  • xxhdpi = 1440 x 960px(3 x mdpi)
  • xxxhdpi = 1920 x 1080ピクセル(4 x mdpi)

詳細については、こちらをご覧ください:

  1. https://design.google.com/devices/

  2. すべてのデバイスに適合するAndroidスプラッシュスクリーンの画像サイズ

  3. http://vinsol.com/blog/2014/11/20/tips-for-designers-from-a-developer/

8
ℛɑƒæĿ

これは、デバイスがAPI 23未満の場合、ベクトルで実行できるとは思わない。なぜなら、ドロアブルの属性Android:heightとAndroid:widthを設定することができないからだ。

中央のアイコンでスプラッシュスクリーンを実装するには、ロゴのベクトルを各スクリーンサイズの.pngにエクスポートし、レイヤーリスト内にビットマップを埋め込む必要がありました。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:opacity="opaque">
    <item Android:drawable="@drawable/splash_screen_background" />

    <item
        Android:left="20dp"
        Android:right="20dp">
        <bitmap
            Android:gravity="center"
            Android:scaleType="centerInside"
            Android:src="@drawable/logo_rasterised" />
    </item>

</layer-list>

理想的には、リソースにビットマップイメージをまったく含めたくないのですが、ビットマップを使用する必要があるのは、少なくともスプラッシュスクリーンだけです。

1
Kirk