web-dev-qa-db-ja.com

Android 21でfillType = "evenOdd"を使用します

Androidプロジェクトに含めたいSVG画像があります。

プロジェクトのminSdkバージョンは9です。Android StudioはSVG用のPNGファイルを生成しています。

ただし、API 21以降の場合、Android studioはSVGをdrawable-anydpi-v21リソースフォルダ。

つまり、API 21以降を実行しているデバイスは、PNGではなくSVGを使用します。

そしてそれが問題です。私のSVGにはAndroid:fillType="evenOdd"

PNGは適切に生成されますが、SVGの場合、その属性はAPI 24+であるため、API 21デバイスでは無視され、ワイヤーフレームのような画像ではなく、画像が塗りつぶされて表示されます。

とにかくAndroidスタジオにPNGのみを含め、SVGを完全にドロップするように説得する方法はありますか?

これの他の解決策はありますか?

12
njzk2

ソリューション1

Sketch のFlattern画像と this site を使用してSVGをAndroidのxmlに変換します

ソリューション2

私はevenOddの代わりにnonZeroを使用し、それをSketchで開いて逆順にした後、それがpathDataを変更してAndroid:fillTypeを削除し、すべてがAndroid 21+で正常に動作します。

ソリューション3

PNG

TLDR

いくつかの調査の後、ベクターグラフィックス、SVGには2つの塗りつぶしルールプロパティメソッドがあることを発見しました。「偶数」と「非ゼロ」です。

SketchでSVGアイコンを開き、アイコンの上部にある穴を調べました。予想通り、fill-rule:evenoddプロパティを使用します。ここで、「ゼロ以外」のプロパティを使用するようにフィルルールを変更する必要があります。どうやって?パスを選択します。右側の「塗りつぶし」プロパティに設定アイコンがあります。それをクリックして、「ゼロ以外」を選択します。

メインメニューから、レイヤー→パス→逆順を選択します。アイコンの上部に穴を開け、アプリにも穴を開けました。

詳細

3
UmAnusorn

Filltype = "evenOdd"のSVGは、Android gradle plugin 3.2で正常に動作し、表示されるようです。サポートライブラリ28またはAndroidX 1.0を使用する必要がある場合もあります。

それが最上位のbuild.gradleで少なくともこのバージョンであることを確認してください:

classpath 'com.Android.tools.build:gradle:3.2.0'
2
Gak2

あなたはあなたのsvgをxmlファイルに変換することができます、それはあなたの問題を解決します、これはsvgをxmlファイルに変換するためのリンクです svgToXML

1
Ranjan

属性Android:fillTypeは、APIレベル24以降でのみ使用されます。 APIレベルを下回る場合は、次の手順に従ってください。

1)これをgradleファイルに追加します。

// Gradle Plugin 2.0+  
   Android {  
     defaultConfig {  
        vectorDrawables.useSupportLibrary = true  
     }  
   }  

2)ここで、ImageViewを使用している場合は、そのプロパティをAndroid:srcapp:srcCompatに変更します。

3)TextViewでdrawableStartまたはdrawableEndを使用している場合は、app:drawableStartCompatまたはapp:drawableEndCompatに変更します。

楽しい :-) :-)

1
Kirit Khant