私はAndroidプロジェクトに取り組んでおり、適応可能な動的なアイコンを表示するために<vector>
を選択しましたが、API 21以上を搭載したAndroidを実行しているデバイスでこのアプリを実行できます。私の質問は、下位のAndroidバージョン、つまりAPI 14などで<vector>
を使用する方法です。ありがとう!
<!-- drawable/ic_Android_debug_bridge.xmlxml -->
<vector xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:height="48dp"
Android:width="48dp"
Android:viewportWidth="24"
Android:viewportHeight="24">
<path Android:fillColor="@color/primaryColorDark"
Android:pathData="M15,9A1,1 0 0,1 14,8A1,1 0 0,1 15,7A1,1 0 0,1 16,8A1,1 `0 0,1 15,9M9,9A1,1 0 0,1 8,8A1,1 0 0,1 9,7A1,1 0 0,1 10,8A1,1 0 0,1 9,9M16.12,4.37L18.22,2.27L17.4,1.44L15.09,3.75C14.16,3.28 13.11,3 12,3C10.88,3 9.84,3.28 8.91,3.75L6.6,1.44L5.78,2.27L7.88,4.37C6.14,5.64 5,7.68 5,10V11H19V10C19,7.68 17.86,5.64 16.12,4.37M5,16C5,19.86 8.13,23 12,23A7,7 0 0,0 19,16V12H5V16Z" /></vector>`
Vector Drawablesは後方互換性があり、Gradleバージョンを1.4.0-beta3以降にアップグレードし、IDEをアップグレードするだけです。
Android Studio 1.4でベクターアセットの下位互換性を提供できることも嬉しく思います。 res/drawableにvectorDrawableイメージを作成すると、Gradleプラグインはビルド時にAPIレベル20以下のラスターPNGイメージを自動的に生成します。つまり、アプリプロジェクトのベクターアセットを更新および維持するだけで、Android Studioが画像変換プロセスを処理できます。
http://Android-developers.blogspot.com.uy/2015/09/Android-studio-14.html
VectorDrawableは、サポートライブラリを介してLollipopより前にサポートされますが、使用方法はお持ちのサポートライブラリのバージョンによって異なります。また、すべての場合に機能するとは限りません。
この図 を作成しました(サポートライブラリ23.4.0から-少なくとも-25.1.0に有効)。
サポートライブラリ23.2では、Vector Drawablesの真のサポートがAPI v7まで提供されています。ビルド時にPNGをレンダリングした以前のバージョンのサポートを無効にすることをお勧めします。
// Gradle Plugin 2.0+
Android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
build.gradle
ファイルに。
実装は非常に簡単です。 Drawablesに新しいsrcCompat属性があります:
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_add" /> <= this is new
TextDrawのdrawableLeft
プロパティなどの場合、ベクターDrawableもサポートされます。
ソース: ライブラリの発表
ただし、 Iconics library 、 AndroidSVG 、またはSVGの完全なサポートのための別のフォントアイコンまたはSVGソリューションのようなものをお勧めします。
私は解決策を見つけました! TextViewおよびその他の「Android」名前空間属性を使用してソリューションを検索するユーザー向け。まず第一にこれが必要です:
Android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
そして、アプリケーションクラスでこれを定義します。
@Override
public void onCreate() {
super.onCreate();
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
app:srcCompat="@drawable/ic_add"
を使用できるようになりましたが、Android:background=
またはAndroid:drawableLeft=
を使用しようとすると、「Error inflating」例外でアプリがクラッシュします。
このベクターのラップされたドローアブルic_add_wrapped.xml
を作成できます。
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@drawable/ic_add"/>
</layer-list>
そして今では、drawableLeftやbackgroundのようなプロパティで動作します。 Android:drawableLeft="@drawable/ic_add_wrapped.xml"
を設定するだけです。警告!これはIS回避策です。したがって、あなたはあなた自身のリスクのためにそれを使用します。
Android studioを使用している場合はAndroid Support Repository 30+を使用し、Eclipseを使用している場合はAndroid support library 23.2.1+を使用する必要があります。
バージョン2.0以降を使用している場合はbuild.gradle
(プロジェクト)を確認し、build.gradle
(アプリ)に以下のコードを追加します
// Gradle Plugin 2.0+
Android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
および:バージョン1.5を使用している場合は、build.gradle
(app)に以下を追加します
// Gradle Plugin 1.5
Android {
defaultConfig {
generatedDensities = []
}
// This is handled for you by the 2.0+ Gradle Plugin
aaptOptions {
additionalParameters "--no-version-vectors"
}
}
ベクトルアイコンを使用するためのサンプルコードを次に示します。
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_add"
tools:ignore="MissingPrefix" />
または
<ImageButton
Android:layout_width="wrap_content"
Android:background="@Android:color/transparent"
app:srcCompat="@drawable/camera"
tools:ignore="MissingPrefix"
Android:layout_height="wrap_content"/>
TextDrawのdrawableLeft
プロパティなどの場合、ベクターDrawableもサポートされます。しかし、それは私にとってAPI 22+で機能し、低APIでどのように機能するのかまだわかりません。
また、API 21以下で互換性を維持したい場合にも注意してください。
View.setBackgroundResource()
関数でAndroid:background
プロパティを使用することはできません。 View.setBackground()
を使用する必要があります。(SVGから作成された)VectorDrawableをプログラムで追加する必要がある場合、次のように実行できます。
icon = VectorDrawableCompat.create(resources, R.drawable.ic_map_black_24dp, null)
下位バージョンと互換性がある場合、
以下をgradleに追加し、
Android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
アプリケーションクラスのonCreate()に以下のコードを追加します。
@Override
public void onCreate() {
super.onCreate();
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
ImageViewのxmlで、
<ImageView
Android:id="@+id/imageViewMessage"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:background="@color/transparent"
app:srcCompat="@drawable/ic_success"/>
これを使用してプログラムで画像ソースを変更する場合は、
imageView.setImageResource(R.drawable.ic_launcher);
ベクター画像が表示されるが、完全に黒になる問題がありました。これは、ベクターxmlファイルで色リソースを参照できない問題が原因でした。
したがって、@color/primaryColorDark
の代わりに、実際の色を使用する必要があります。 #212121
Android Studio 3.0.0を使用している場合は、設定できます
Android.enableAapt2=false
gradle.propertiesで
https://www.reddit.com/r/androiddev/comments/6mj8di/Android_studio_30_canary_6_released/
@ 2Deeの答えを完成させるためだけに:
VectorDrawableは、API 20以前では使用できません。公式のメソッドはpngを生成しますが、これはBitmapDrawablesになり、ベクターグラフィックスの概念が崩れます。
個人的には、xmlベクトルよりもsvgの方が好きです。
ベクターグラフィックを使用するには、 https://github.com/BigBadaboom/androidsvg を試してください。それはsvgリーダーとsvg互換のImageViewです。
プログラムで..を使用して、drawableLeft
をeditText
またはtextView
に設定できます。
好む
Drawable tick_drawable = VectorDrawableCompat.create(getResources(), R.drawable.green_tick, null);
if (tick_drawable != null) {
tick_drawable.setBounds(0, 0, tick_drawable.getIntrinsicWidth(),tick_drawable.getIntrinsicHeight());
}
そして、このように描画可能に左に..
editText.setCompoundDrawables( tick_drawable , null, null, null );
設定後vectorDrawables.useSupportLibrary = true gradle defaultおよびAppCompatDelegate.setCompatVectorFromResourcesEnabled(true);作成時のアクティビティ
Android:Textviewのdrawableleftでクラッシュしないようにするには、たとえばdrawble leftをプログラムでtextviewに設定します。
textview.setCompoundDrawablesWithIntrinsicBounds(R.drawable.movie, 0, 0, 0);