スケーリングせずにレイヤーリストでベクタードローアブルを中央揃えにする方法


102

ベクトルをスケーリングせずVectorDrawableにa を使用しようとしていますLayerList。例えば:

<layer-list>
    <item android:drawable="@color/grid_item_activated"/>
    <item android:gravity="center" android:drawable="@drawable/ic_check_white_48dp"/>
</layer-list>

ic_check_white_48dp次のように定義されたドローアブルID:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="48dp"
        android:height="48dp"
        android:viewportWidth="24.0"
        android:viewportHeight="24.0">
    <path
        android:fillColor="#FFFFFFFF"
        android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"/>
</vector>

チェックアイコンがドローアブルレイヤーの中央に配置され、拡大縮小は行われません。問題は、上のレイヤーリストにより、チェックアイコンがレイヤーサイズに合わせて拡大縮小されることです。

密度ごとにベクタードローアブルをPNGに置き換え、レイヤーリストを次のように変更すると、目的の効果を得ることができます

<layer-list>
    <item android:drawable="@color/grid_item_activated"/>
    <item>
        <bitmap android:gravity="center" android:src="@drawable/ic_check_white_48dp"/>
    </item>
</layer-list>

これを使用してこれを行う方法はありますVectorDrawableか?


11
これは単にAPI 21/22のバグのようです。API 23デバイスでテストしたところ、ベクタードローアブルが正しく中央揃えになりました。
2016年

1
あなた自身の質問に答えて、それを受け入れるべきです。そうすれば、より見やすくなり、質問は未回答として表示されなくなります。
MarcinKoziński、2016年

1
API 21/22で何をすべきかについての答えがまだないので、質問に答えていません。私の一時的な解決策は、ベクターではなくPNGを使用することでした。それでもベクターを機能させる方法を見つけたいと思っています。
ashughes、

1
ここで問題を開いた:code.google.com/p/android/issues/detail
id=

これはAPI 23ですでに修正されているので、バグレポートは修正済みとマークされるだけだと思います。
ashughes

回答:


29

レイヤードリストでベクタードローアブルを中央に配置しようとすると、同じ問題が発生しました。

私は回避策を持っていますが、まったく同じではありませんが、機能します。ドローアブル全体のサイズを設定し、ベクトル項目にパディングを追加する必要があります。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <size android:height="120dp" android:width="120dp"/>
            <solid android:color="@color/grid_item_activated"/>
        </shape>
    </item>
    <item android:top="24dp"
          android:bottom="24dp"
          android:left="24dp"
          android:right="24dp"
          android:drawable="@drawable/ic_check_white_48dp"/>
</layer-list>

上記のシェイプのサイズは、ドローアブル全体のサイズ(この例では120 dp)を設定します。2番目のアイテムのパディング(この例では24 dp)は、ベクター画像を中央に配置します。

これはgravity="center"、API 21および22でベクターを使用する方法と同じではありません。


2
これは、設定されたスペース全体をチェックドローアブルの中央に配置して設定するのではなく、(シェイプサイズを設定するために)ドローアブルの正確なサイズを知る必要があるように思えます。
2016

1
サイズは不明ですが、この方法ではパディングを変更できません。イメージビューでドローアブルを互いの上に重ねることができます。私は上記に述べたようにのための完璧なソリューションが存在しないgravity="center"API 21と22で
ニコラ・タイラー

で使用すると機能しませんwindowBackground。この場合、明示的なサイズは何もしません。また、レイヤーリストを別のレイヤーリスト内に配置しても機能しません。
Vsevolod Ganin

19

同じ問題に苦しんでいます。これを修正し、ドローアブルを拡大しないようにした唯一の方法は、ドローアブルのサイズを設定し、重力を使用して整列させることでした。

<layer-list>
    <item android:drawable="@color/grid_item_activated"/>
     <item
        android:gravity="center"
        android:width="48dp"
        android:height="48dp"
        android:drawable="@drawable/ic_check_white_48dp"/>
</layer-list>

それが役に立てば幸い!


34
widthこれらのAPIレベルでは属性を使用できないため、これはAPI 21〜22では役に立ちません。API 23では、バグが修正され、ドローアブルがもう引き伸ばされないため、これらは必要ありません。
WonderCsabo 2017年

3
これはAPI 27では正しく機能せず、画像がフルスクリーンに引き伸ばされます
Konstantin Konopko

8

SplashScreenをAPI21からAPI23を含むすべてのAPIで見栄えよくする編集済みソリューション

まず最初にこの記事を読み、スプラッシュスクリーンを作成するための良い方法に従ってください。

ロゴが歪んでいるか適合しない場合、APIs24 +のみを対象とする場合は、次のようにXMLドローアブルで直接ベクトルドローアブルを直接縮小できます。

<vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"
android:viewportWidth="640"
android:viewportHeight="640"
android:width="240dp"
android:height="240dp">
<path
    android:pathData="M320.96 55.9L477.14 345L161.67 345L320.96 55.9Z"
    android:strokeColor="#292929"
    android:strokeWidth="24" />
</vector>

上記のコードでは、640x640のキャンバスに描画したドローアブルを240x240に再スケーリングしています。次に、スプ​​ラッシュスクリーンのドローアブルにそのように配置するだけで、うまく機能します。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:opacity="opaque"
android:paddingBottom="20dp" android:paddingRight="20dp" android:paddingLeft="20dp" android:paddingTop="20dp">

<!-- The background color, preferably the same as your normal theme -->
<item>
    <shape>
        <size android:height="120dp" android:width="120dp"/>
        <solid android:color="@android:color/white"/>
    </shape>
</item>

<!-- Your product logo - 144dp color version of your app icon -->
<item
    android:drawable="@drawable/logo_vect"
    android:gravity="center">

</item>
</layer-list>

私のコードは実際には下の図の三角形のみを描画していますが、ここではこれで何ができるかがわかります。ビットマップを使用したときに得られたピクセル化されたエッジとは対照的に、最終的に解像度は素晴らしいです。そのため、ベクタードローアブルを必ず使用してください(専用のソフトウェアをダウンロードする手間をかけずに鉱山を作成するために使用していたvectrというサイトがあります)。

API21-22-23でも機能するように編集します

上記のソリューションはAPI24 +を実行するデバイスで機能しますが、API22を実行するデバイスにアプリをインストールした後、私は本当にがっかりしました。スプラッシュスクリーンが再びビュー全体を埋めようとしているように見え、たわごとのように見えました。眉毛を半日引き裂いた後、私はついに完全な意志力で解決策を総当たりにした。

スプラッシュスクリーンxml(splash_screen.xmlなど)とまったく同じ名前の2つ目のファイルを作成し、それをdrawable-v22およびdrawable-v21と呼ばれる2つのフォルダーに配置する必要があります。プロジェクトビューをAndroidからProjectに変更する必要があります)。これは、関連するデバイスがドローアブルフォルダーの-vXXサフィックスに対応するAPIを実行するたびに、これらのフォルダーに配置されたファイルにリダイレクトするように電話に指示するのに役立ちます。このリンクを参照してください。これらのフォルダーに作成するsplash_screen.xmlファイルのLayer-listに次のコードを配置します。

<item>
<shape>
    <size android:height="120dp" android:width="120dp"/>
    <solid android:color="@android:color/white"/>
</shape>
</item>

<!-- Your product logo - 144dp color version of your app icon -->
<item android:gravity="center">
    <bitmap android:gravity="center"
        android:src="logo_vect"/>

</item>

これらはフォルダがどのように見えるかです

これらのAPIの何らかの理由で、ドローアブルを機能させるためにビットマップでラップし、最終結果を同じに見えるようにする必要があります。問題は、splash_screen.xmlファイルの2番目のバージョンにより、23を超えるAPIを実行しているデバイスでスプラッシュスクリーンがまったく表示されなくなるため、アプローチを追加のドローアブルフォルダーで使用する必要があることです。また、 androidのデフォルトとして、splash_screen.xmlの最初のバージョンをdrawable-v24に追加します。これは、リソース用に見つけることができる最も近いdrawable-vXXフォルダーにデフォルトで設定されます。

私のスプラッシュスクリーン


4

私は現在、ベクトルのドローアブルが水平方向と垂直方向の両方に中央揃えされているスプラッシュスクリーンで作業しています。ここに私がAPIレベル25で得たものがあります:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:opacity="opaque">

<!-- background color, same as theme -->
<item android:drawable="@android:color/white"/>

<!-- app logo -->

<item
    android:drawable="@drawable/my_app_logo"
    android:gravity="center_horizontal|center_vertical"
    android:width="200dp"
    android:height="200dp"
    />
</layer-list>

あなたは、ベクトル描画可能の大きさを調整変更したい場合android:widthandroid:height上記の属性、必ずしも本来の描画可能に変更していません。

さらに、私の経験では、ベクタードローアブルをビットマップタグに配置しないでください。ビットマップは.png、.jpg、.gif形式のファイル用であり、ベクタードローアブル用ではありません。

参照

https://developer.android.com/guide/topics/resources/drawable-resource#LayerList

https://developer.android.com/guide/topics/resources/more-resources.html#Dimension


1
<bitmap>タグの代わりに<item>タグ内にある必要があるベクター型ドローアブルについての良いキャッチ。
FrostRocket
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.