如何在Android API中使用矢量drawables 21?

时间:2015-12-22 14:15:36

标签: java android android-layout vector

我正在开发一个Android项目,我选择了<vector>来显示图标,因为它具有适应性和动态性,但是,我只能在运行Android的设备上运行此应用,该设备具有API 21或更高版本。我的问题是如何在较低的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>`

12 个答案:

答案 0 :(得分:74)

使用支持库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

TextView的drawableLeft属性。

也支持Vector Drawables

来源:library announcement

但是,我仍然建议使用Iconics libraryAndroidSVG或其他字体图标或SVG解决方案来获得完整的SVG-standand支持。

答案 1 :(得分:69)

通过支持库支持Lollipop前的VectorDrawable,但使用它们的方式取决于您拥有的支持库的版本。它可能在所有情况下都不起作用。

我已this diagram提供帮助(对支持库23.4.0有效 - 至少 - 25.1.0)。

VectorDrawable cheatsheet

答案 2 :(得分:37)

我找到了解决方案!对于那些使用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=,则会因“错误充气”异常而导致应用崩溃。

我们可以为此向量创建包装的可绘制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"即可。 警告!这是一个解决方案。因此,您自己承担风险。

答案 3 :(得分:23)

Vector Drawables现在向后兼容,只需将您的gradle版本升级到1.4.0-beta3或更高版本,然后升级您的IDE:

  

我们也很高兴为您的矢量提供向后兼容性   Android Studio 1.4中的资产。一旦你有了vectorDrawable图像   你的res / drawable,Gradle插件会自动生成   构建时间内API级别20及以下的栅格PNG图像。这个   意味着您只需要更新和维护您的矢量资产   应用程序项目和Android Studio可以处理图像转换   过程

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

答案 4 :(得分:20)

如果你使用android studio,你需要使用android Support Repository 30+ 如果使用Eclipse,则需要android支持库23.2.1+。

检查您的build.gradle(项目),如果使用版本2.0+,请在build.gradle(app)中添加以下代码

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

和:如果在build.gradle(app)

中使用1.5版以下
// 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"/>

在TextView&#39; drawableLeft属性的情况下也支持Vector Drawable。但它对我来说有效,但我仍然不知道它如何适用于低api。

另请注意,如果您希望在API 21下方兼容:

  • 您无法在xml或android:background函数中使用View.setBackgroundResource()属性。您需要使用View.setBackground()
  • 你不能在StateListDrawable xml-s或其他xml drawables中使用svg-s,你必须以编程方式生成它们。
  • 如果收到通知,则无法使用svg-s。

答案 5 :(得分:15)

当你需要以编程方式添加VectorDrawable(从SVG创建)时,你可以这样做:

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

答案 6 :(得分:4)

我遇到的问题是我的矢量图像会显示但是会完全变黑,这是因为您无法在矢量xml文件中引用颜色资源。

因此,您必须使用实际颜色,而不是@color/primaryColorDark#212121

答案 7 :(得分:2)

只是为了让@ 2Dee的答案完整:

VectorDrawable不能在API 20及更低版本上使用。官方方法生成png,然后变成BitmapDrawables,这打破了矢量图形的想法。

我个人更喜欢svg而不是xml向量:

  • 可以直接从Illustrator或其他流行软件导出此类图形
  • svg正确支持转换,文本,掩码和其他内容
  • 所有平台上的真正可伸缩矢量图形
  • 尺寸更小,构建更快

要使用矢量图形,您可以尝试https://github.com/BigBadaboom/androidsvg。它是一个svg阅读器和svg兼容的ImageView。

答案 8 :(得分:2)

如果您使用的是Android Studio 3.0.0,则可以设置

android.enableAapt2=false 
gradle.properties中的

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

答案 9 :(得分:2)

为兼容较低版本,

  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);
    

答案 10 :(得分:0)

在gradle默认中设置 vectorDrawables.useSupportLibrary = true ,并在创建时在活动中设置 AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

为避免在Textview中使用 android:drawableleft 崩溃,请以编程方式将drawble设置为textview的左侧 例如:

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

答案 11 :(得分:0)

我也发现了同样的问题。我做到了:

  

vectorDrawables.useSupportLibrary = true

     

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

     

textview.setCompoundDrawablesWithIntrinsicBounds(R.drawable.movi​​e,0,0,0);

很好。但是之后,我得到一个错误,即找不到资源。
因此,我发现最好根据SDK版本添加矢量图像。

最后,这个解决方案对我来说是好的:-

HttpServletRequest request = ((ServletRequestAttributes) 
RequestContextHolder.currentRequestAttributes()).getRequest();
request.getHeader("mycustom");
  • 我希望,它将对某人有所帮助。