Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在低于21的Android API中使用VectorDrawables?_Java_Android_Svg_Android Vectordrawable - Fatal编程技术网

Java 如何在低于21的Android API中使用VectorDrawables?

Java 如何在低于21的Android API中使用VectorDrawables?,java,android,svg,android-vectordrawable,Java,Android,Svg,Android Vectordrawable,我正在从事一个Android项目,我选择了来显示图标,因为它具有适应性和动态性,然而,我只能在运行Android的设备上运行这个应用程序,这些设备具有API 21或更高版本。我的问题是如何在较低的Android版本上使用,即API 14或类似的版本。谢谢 <!-- drawable/ic_android_debug_bridge.xml --> <vector xmlns:android="http://schemas.android.com/apk/res/andr

我正在从事一个Android项目,我选择了
来显示图标,因为它具有适应性和动态性,然而,我只能在运行Android的设备上运行这个应用程序,这些设备具有API 21或更高版本。我的问题是如何在较低的Android版本上使用
,即API 14或类似的版本。谢谢

<!-- drawable/ic_android_debug_bridge.xml -->
<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 Drawable现在向后兼容,只需将gradle版本升级到1.4.0-beta3或更高版本,并升级IDE即可:

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


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

VectorDrawable不能用于API 20及更低版本。官方方法生成PNG,然后变成BitMapDrawable,这打破了矢量图形的概念

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

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

要使用矢量图形,您可以尝试。它是一个svg阅读器和svg兼容的ImageView。

支持库23.2提供了对矢量绘图的真正支持,一直到API v7。 建议通过添加

// Gradle Plugin 2.0+
 android {
   defaultConfig {
     vectorDrawables.useSupportLibrary = true
    }
 }
转到
build.gradle
文件

实现相当简单。只需在Drawables上使用新的srcCompat属性(在应用程序名称空间下!):


/如果使用android studio,则需要使用android支持存储库30+
如果使用Eclipse,则需要android支持库23.2.1+

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

和:如果使用1.5版,请在您的
build.gradle
(应用程序)中添加以下内容

下面是使用矢量图标的示例代码:

<ImageView  
  android:layout_width="wrap_content"  
  android:layout_height="wrap_content"  
  app:srcCompat="@drawable/ic_add"
  tools:ignore="MissingPrefix" />


Vector Drawables在TextView的
drawableLeft
属性等情况下也受支持。但它在api 22+上对我起了作用,我仍然不知道它在低api下如何工作

如果您希望与API 21兼容,请记住:

  • 您不能在xml中使用
    android:background
    属性或
    View.setBackgroundResource()
    函数。您需要使用
    视图.setBackground()
  • 不能在StateListDrawable xml-s或其他xml Drawable中使用svg-s,必须以编程方式生成它们
  • 在通知的情况下,不能使用svg-s
      我找到了解决办法!适用于使用TextView和其他“android”命名空间属性搜索解决方案的用户。 首先,这是必要的:

      android {  
         defaultConfig {  
           vectorDrawables.useSupportLibrary = true  
          }  
       }
      
      在应用程序类中定义:

          @Override
          public void onCreate() {
              super.onCreate();
              AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
          }
      
      现在您可以使用
      app:srcCompat=“@drawable/ic_add”
      ,但如果您尝试使用
      android:background=
      android:drawablelft=
      则会导致应用程序崩溃,出现“错误膨胀”异常

      我们可以为此向量创建包装的drawable
      ic\u add\u 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\u add\u wrapped.xml”

警告这是一个变通解决方案。因此,使用它是为了您自己的风险。

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

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

我有一个问题,我的矢量图像会显示出来,但会完全是黑色的,这是由于一个问题,你不能引用矢量xml文件中的颜色资源


因此,您必须使用实际颜色,而不是
@color/primarycolorddark
,例如
21212121
通过支持库在棒棒糖前支持VectorDrawable,但是使用它们的方式取决于您拥有的支持库的版本。而且它可能并不适用于所有情况

我提供了帮助(对支持库23.4.0至-至少-25.1.0有效)


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

android.enableAapt2=false 
在格拉德尔


您可以通过编程使用..将
drawableLeft
设置为您的
editText
textView

像这样向左转

editText.setCompoundDrawables( tick_drawable , null, null, null );

对于较低版本兼容

  • 在渐变中添加以下内容

    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"/>
    

  • 在gradle默认设置中设置vectorDrawables.useSupportLibrary=true之后,AppCompatDelegate.SetCompatrVectorFromResourcesEnabled(true)

    要避免在Textview中使用android:drawableleft时崩溃,请通过编程将drawble left设置为Textview 例如:

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

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

    vectorDrawables.useSupportLibrary=true


    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)

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

    这很好。但是在那之后,我得到了一个错误,资源找不到。
    所以我发现最好根据SDK版本添加一个矢量图像

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

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        textview.setCompoundDrawablesWithIntrinsicBounds(null, null, AppCompatResources.getDrawable(this, R.drawable.movie), null);
    } else {
        textview.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.movie, 0);
    }
    
    • 我希望,它会帮助别人

    这并不完全正确。它将只适用于imageView,其余部分将在旧版本上崩溃
    android {  
       defaultConfig {  
         vectorDrawables.useSupportLibrary = true  
        }  
     }
    
    @Override
        public void onCreate() {
            super.onCreate();
            AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
        }
    
    <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);
    
     textview.setCompoundDrawablesWithIntrinsicBounds(R.drawable.movie, 0, 0, 0);
    
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        textview.setCompoundDrawablesWithIntrinsicBounds(null, null, AppCompatResources.getDrawable(this, R.drawable.movie), null);
    } else {
        textview.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.movie, 0);
    }