web-dev-qa-db-ja.com

API 23でVectorDrawableが正しくレンダリングされない

私はすべてのアイコンを可能な限りVectorDrawableに置き換えています。しかし、そのうちのいくつかはAPI 23で正しくレンダリングされず、色がにじんでいるようです。これら3つのうちの1つは問題なくレンダリングされます。これが isolated project のスクリーンショットです。

enter image description here

API 21では完全に問題なく見えます。

enter image description here

サンプルアプリのソースコードはこちら

ImageViewでAppCompat 24.0.0、app:srcCompatを使用しており、vectorDrawables.useSupportLibrary = trueを設定しています。また、ターゲット23でAppCompat 23.4.0を試しました。ただし、appCompatを削除してminSdkVersionを21に設定し、ネイティブベクターサポートを使用しても、結果は変わりません。 IDEは、サポートされていないことについては何の不満もありません。問題の原因を突き止めるには?プラットフォームのバグですか?回避策はありますか?

28
gitter

API 23だけでまったく同じ問題が発生しました。 ImageViewソースをxmlではなく動的に設定していました。私は問題が私がしていることであることに気づきました:

Drawable show = getContext().getResources().getDrawable(resourceId);

私がやるべきだったとき:

Drawable show = AppCompatResources.getDrawable(getContext(), resourceId);

これが誰かを助けることを願っています!

28
Luke

まず、私はAndroid開発者ではありません。私はAndroid Studio。

22から24に移動する一部のベクタードローアブルで同じ問題が発生し始めました。

(Nexus 6 API 23を使用するようにプロジェクトを更新し、バージョン24をビルドし、バージョン24をビルドし、SDK 24をターゲットに設定しました。その後、ドローアブルはパスを閉じ、上記と同様の塗りつぶしを追加しているように見えました。)

試しました

私はAdobe Illustrator CC(19.2.1)にアクセスでき、ストロークを持つオブジェクトのさまざまなパスオプションを調査しています。パスの拡張から塗りつぶし、パスの結合、複合パスの作成、パスのクローズなど、すべてが運が悪い。

コンバーターオプション

オンラインSVG to Drawable Converter( http://inloop.github.io/svg2Android/ )には、オプション「Bake transforms into path(experimental)]とIそれを選択し、レンダリングを改善しましたが、まだ完璧ではありませんでした。

潜在的なソリューション

次に、再度Illustratorにアクセスして、「名前を付けて保存 SVGと「エクスポート」をSVGとして試しました。 Adobe Illustratorの2つの設定の違いはわかりませんが、わずかに異なるSVG XMLデータを出力します。

次に、新しい「Save As SVG」を取得して、このオンラインDrawable Converterにドロップしました。 http://inloop.github.io/svg2Android/

そして、これらのオプションをチェックしました:

  • 属性のない空のグループを削除する
  • Bakeはパスに変換されます(実験的)

返された新しいDrawable XMLは、正しく機能してレンダリングされているようです。

これがストローク、シェイプ、塗りつぶしを持つ他のベクターグラフィックスで機能するかどうかはわかりませんが、私の経験を共有したいと思います。新しいAndroid SDKのバグであるように見え、以前からサポートされていたため、これは実際のソリューションではありませんが、一部の人にとって一時的な回避策になる可能性があります。

19
Patrick Hansen

詳細な説明については、このメディアをお読みください https://medium.com/androiddevelopers/using-vector-assets-in-Android-apps-4318fd662eb9

TL; DR

Android {
    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
}

使用する

app:srcCompat
app:buttonCompat
app:drawableStartCompat...

の代わりに

Android:src
Android:button
Android:drawableStart

プログラム的に

AppCompatResources.getDrawable(context, R.drawable.my_drawable)
1
Pedro Romão