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>
プロパティ 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>
...
...
グラデーションのみのAndroid:fillColorは、API 24以降(7.0)をサポートしています。
ref: https://developer.Android.com/reference/Android/graphics/drawable/VectorDrawable.html
グラデーションなしの「drawable-v24」と「drawable」フォルダーに同じベクターを追加してみてください
このソリューションはbuild.gradle
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
app:srcCompat
の代わりに Android:src
グラデーション付きベクトルドローアブルをImageView
に設定する場合。
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"/>
お役に立てば幸いです。
SVGのグラデーションタグは、OSバージョン7以降でサポートされています。 OSバージョン7より前のバージョンのグラデーションタグにコメントを付けてみてください。