web-dev-qa-db-ja.com

Android AP​​I lower 21でベクタードロウアブルを使用する方法

私は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>`
59
iamatsundere181

Vector Drawablesは後方互換性があり、Gradleバージョンを1.4.0-beta3以降にアップグレードし、IDEをアップグレードするだけです。

Android St​​udio 1.4でベクターアセットの下位互換性を提供できることも嬉しく思います。 res/drawableにvectorDrawableイメージを作成すると、Gradleプラグインはビルド時にAPIレベル20以下のラスターPNGイメージを自動的に生成します。つまり、アプリプロジェクトのベクターアセットを更新および維持するだけで、Android St​​udioが画像変換プロセスを処理できます。

http://Android-developers.blogspot.com.uy/2015/09/Android-studio-14.html

25
2Dee

VectorDrawableは、サポートライブラリを介してLollipopより前にサポートされますが、使用方法はお持ちのサポートライブラリのバージョンによって異なります。また、すべての場合に機能するとは限りません。

この図 を作成しました(サポートライブラリ23.4.0から-少なくとも-25.1.0に有効)。

VectorDrawable cheatsheet

77
David Ferrand

サポートライブラリ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 libraryAndroidSVG 、またはSVGの完全なサポートのための別のフォントアイコンまたはSVGソリューションのようなものをお勧めします。

76
Alen Siljak

私は解決策を見つけました! 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回避策です。したがって、あなたはあなた自身のリスクのためにそれを使用します。

39
Yazon2006

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以下で互換性を維持したい場合にも注意してください。

  • xmlまたはView.setBackgroundResource()関数でAndroid:backgroundプロパティを使用することはできません。 View.setBackground()を使用する必要があります。
  • stateListDrawable xml-sまたはその他のxmlドロアブルでsvg-sを使用することはできません。プログラムで生成する必要があります。
  • 通知の場合はsvg-sを使用できません。
20

(SVGから作成された)VectorDrawableをプログラムで追加する必要がある場合、次のように実行できます。

icon = VectorDrawableCompat.create(resources, R.drawable.ic_map_black_24dp, null)
16
cVoronin

下位バージョンと互換性がある場合、

  1. 以下をgradleに追加し、

    Android {  
       defaultConfig {  
         vectorDrawables.useSupportLibrary = true  
        }  
     }
    
  2. アプリケーションクラスのonCreate()に以下のコードを追加します。

    @Override
        public void onCreate() {
            super.onCreate();
            AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
        }
    
  3. 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"/>
    
  4. これを使用してプログラムで画像ソースを変更する場合は、

    imageView.setImageResource(R.drawable.ic_launcher);
    
5
Kavya Shravan

ベクター画像が表示されるが、完全に黒になる問題がありました。これは、ベクターxmlファイルで色リソースを参照できない問題が原因でした。

したがって、@color/primaryColorDarkの代わりに、実際の色を使用する必要があります。 #212121

4
Mark O'Sullivan

Android St​​udio 3.0.0を使用している場合は、設定できます

Android.enableAapt2=false 

gradle.propertiesで

https://www.reddit.com/r/androiddev/comments/6mj8di/Android_studio_30_canary_6_released/

2

@ 2Deeの答えを完成させるためだけに:

VectorDrawableは、API 20以前では使用できません。公式のメソッドはpngを生成しますが、これはBitmapDrawablesになり、ベクターグラフィックスの概念が崩れます。

個人的には、xmlベクトルよりもsvgの方が好きです。

  • このようなグラフィックは、Illustratorまたは他の一般的なソフトウェアから直接エクスポートできます。
  • svgは、変換、テキスト、マスクなどを適切にサポートします
  • すべてのプラットフォームで真の呼び出し可能なベクターグラフィックス
  • 小型で高速なビルド

ベクターグラフィックを使用するには、 https://github.com/BigBadaboom/androidsvg を試してください。それはsvgリーダーとsvg互換のImageViewです。

2
Zielony

プログラムで..を使用して、drawableLefteditTextまたは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 );
2
Santanu Sur

設定後vectorDrawables.useSupportLibrary = true gradle defaultおよびAppCompatDelegate.setCompatVectorFromResourcesEnabled(true);作成時のアクティビティ

Android:Textviewのdrawableleftでクラッシュしないようにするには、たとえばdrawble leftをプログラムでtextviewに設定します。

 textview.setCompoundDrawablesWithIntrinsicBounds(R.drawable.movie, 0, 0, 0);
0