web-dev-qa-db-ja.com

VectorDrawable:無効なドローアブルタグのグラデーション

Android Asset Studioを使用して、ZeplinからエクスポートされたSVGファイルからベクタードローアブルを生成していますが、しばらくの間は正常に機能します。しかし、今日、この例外が発生しました。生成されたベクタードローアブルを使用する。

Android.view.InflateException: Binary XML file line #0: Error inflating class <unknown>

そして同じスタックトレースで:

Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #0: invalid drawable tag gradient

AndroidのベクタードローアブルとSVGについてはよく知りません。ベクタードローアブルではグラデーションはサポートされていませんか?この問題に対する修正はありますか、またはPNGを使用する必要がありますか?

Support Libraryバージョンを使用しています:

com.Android.support:support-v4:26.1.0

使っています

Android Studio 3.0

これは、Android Asset Studioによって生成されたVectorDrawableファイルです。

<vector 
    xmlns:Android="http://schemas.Android.com/apk/res/Android" 
    xmlns:aapt="http://schemas.Android.com/aapt"
    Android:width="360dp"
    Android:height="110dp"
    Android:viewportWidth="360.0"
    Android:viewportHeight="110.0">
    <path
        Android:pathData="M82,46H0v64h360V46h-81.88v-0.3h-26.21c-14.25,0 -38.69,-6.2 -46.95,-25.93C200.99,10.25 193.27,0.52 180,0.47c-13.27,-0.05 -20.04,9.24 -24.75,19.3 -8.22,17.55 -24.66,26.19 -49.34,25.93H82V46z"
        Android:fillType="evenOdd">
        <aapt:attr name="Android:fillColor">
            <gradient 
                Android:startY="0.41999998688697815" 
                Android:startX="0.0" 
                Android:endY="110.0" 
                Android:type="linear" 
                Android:endX="360.0">
                <item Android:offset="0.0" Android:color="#FFCB09FF" />
                <item Android:offset="1.0" Android:color="#FF8A06FF" />
            </gradient>
        </aapt:attr></path>
</vector>

元のSVGファイルへのリンク: https://drive.google.com/file/d/1Lj62xJv5IpYR5Lle7w1kMsFXh6y5PijK/view?usp=sharing

Sublimeで開いたときのSVGコンテンツ:

<svg xmlns="http://www.w3.org/2000/svg" width="360" height="110" viewBox="0 0 360 110">
    <defs>
        <linearGradient id="a" x1="0%" y1="0%" y2="100%">
            <stop offset="0%" stop-color="#CB09FF"/>
            <stop offset="100%" stop-color="#8A06FF"/>
        </linearGradient>
    </defs>
    <path fill="url(#a)" fill-rule="evenodd" d="M82 46H0v64h360V46h-81.876v-.299h-26.208c-14.25 0-38.69-6.198-46.946-25.93C200.99 10.252 193.27.52 180 .474c-13.27-.047-20.04 9.238-24.75 19.295-8.217 17.55-24.662 26.194-49.336 25.931H82V46z"/>
</svg>
16
Praveen Singh

プロパティ Android:fillColor はOS 7.0以降でのみサポートされています。

Android:fillColor パスの塗りつぶしに使用する色を指定します。色、またはSDK 24以降の場合、色状態リストまたはグラデーション色(GradientColorおよびGradientColorItemを参照)の場合があります。このプロパティがアニメーション化されている場合、アニメーションによって設定された値は元の値をオーバーライドします。このプロパティが指定されていない場合、パスの塗りつぶしは描画されません。

ディレクトリ/ drawableの古いバージョンの場合、グラデーションなしでベクターアセットを配置できます。次に例を示します。

<vector Android:height="24dp" Android:viewportHeight="651.95"
    Android:viewportWidth="531.48" Android:width="24dp"
    xmlns:aapt="http://schemas.Android.com/aapt" xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <path Android:pathData="M386.8,30.2c-48.5,0 -76.1,18 -121.1,18s-72.6,-18 -121.1,-18c-87.9,0 -144.7,83.3 -144.7,186 0,92.9 160,350.5 265.7,350.5 112.9,0 265.7,-257.6 265.7,-350.5C531.5,113.5 474.7,30.2 386.8,30.2Z">
        <!--<aapt:attr name="Android:fillColor">
            <gradient Android:endX="212457.73219299316"
                Android:endY="440836.2612554932"
                Android:startX="212457.73219299316"
                Android:startY="92857.94223999024" Android:type="linear">
                <item Android:color="#FFFC3A11" Android:offset="0.0"/>
                <item Android:color="#FFDA0300" Android:offset="1.0"/>
            </gradient>
        </aapt:attr>-->
    </path>
    ...
    ...

グラデーション付きの/ drawable-24ディレクトリ内:

<vector Android:height="24dp" Android:viewportHeight="651.95"
    Android:viewportWidth="531.48" Android:width="24dp"
    xmlns:aapt="http://schemas.Android.com/aapt" xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <path Android:pathData="M386.8,30.2c-48.5,0 -76.1,18 -121.1,18s-72.6,-18 -121.1,-18c-87.9,0 -144.7,83.3 -144.7,186 0,92.9 160,350.5 265.7,350.5 112.9,0 265.7,-257.6 265.7,-350.5C531.5,113.5 474.7,30.2 386.8,30.2Z">
        <aapt:attr name="Android:fillColor">
            <gradient Android:endX="212457.73219299316"
                Android:endY="440836.2612554932"
                Android:startX="212457.73219299316"
                Android:startY="92857.94223999024" Android:type="linear">
                <item Android:color="#FFFC3A11" Android:offset="0.0"/>
                <item Android:color="#FFDA0300" Android:offset="1.0"/>
            </gradient>
        </aapt:attr>
    </path>
    ...
    ...
10
Jorgesys

グラデーションのみのAndroid:fillColorは、API 24以降(7.0)をサポートしています。

ref: https://developer.Android.com/reference/Android/graphics/drawable/VectorDrawable.html

グラデーションなしの「drawable-v24」と「drawable」フォルダーに同じベクターを追加してみてください

7
HerberthObregon

このソリューションはbuild.gradle

defaultConfig {
vectorDrawables.useSupportLibrary = true
}

app:srcCompat の代わりに Android:srcグラデーション付きベクトルドローアブルをImageViewに設定する場合。

4
Abhishek Bansal

Android:fillColor属性が原因のエラー。これは:

Android:fillColorパスの塗りつぶしに使用する色を指定します。色、またはSDK 24以降の場合、色状態リストまたはグラデーション色(GradientColorおよびGradientColorItemを参照)の場合があります。このプロパティがアニメーション化されている場合、アニメーションによって設定された値は元の値をオーバーライドします。このプロパティが指定されていない場合、パスの塗りつぶしは描画されません。

24より古いバージョンでグラデーションを使用する場合は、回避策を使用できます。

-ベクトルを編集します(たとえば、drawable/ic_vector.xmlと呼ばれます)。

<vector 
xmlns:Android="http://schemas.Android.com/apk/res/Android" 
xmlns:aapt="http://schemas.Android.com/aapt"
Android:width="360dp"
Android:height="110dp"
Android:viewportWidth="360.0"
Android:viewportHeight="110.0">
<path
    Android:pathData="M82,46H0v64h360V46h-81.88v-0.3h-26.21c-14.25,0 -38.69,-6.2 -46.95,-25.93C200.99,10.25 193.27,0.52 180,0.47c-13.27,-0.05 -20.04,9.24 -24.75,19.3 -8.22,17.55 -24.66,26.19 -49.34,25.93H82V46z"
    Android:fillType="evenOdd">
    <!--<aapt:attr name="Android:fillColor">
        <gradient 
            Android:startY="0.41999998688697815" 
            Android:startX="0.0" 
            Android:endY="110.0" 
            Android:type="linear" 
            Android:endX="360.0">
            <item Android:offset="0.0" Android:color="#FFCB09FF" />
            <item Android:offset="1.0" Android:color="#FF8A06FF" />
        </gradient>
    </aapt:attr></path>-->

-グラデーションをアイテムとして挿入する別のドローアブルリソースを作成します。

<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item>
    <shape Android:shape="rectangle">
        <gradient 
            Android:type="linear"
            Android:startColor="#FFCB09FF"
            Android:endColor="#FF8A06FF"
            Android:angle="270">
        </gradient>
    </shape>
</item>
<item Android:drawable="@drawable/ic_vector"/>

お役に立てば幸いです。

2

SVGのグラデーションタグは、OSバージョン7以降でサポートされています。 OSバージョン7より前のバージョンのグラデーションタグにコメントを付けてみてください。

アプリグラドルにベクターサポートコマンドを追加してみてください。

defaultConfig {
    vectorDrawables.useSupportLibrary = true
}

enter image description here

0
Android Geek