是否可以从pathData中拉出VectorDrawable并将其转换为Path对象?

我想创建一个自定义的ViewOutlineProvider并给它一个任意的形状,以剪切和投射阴影。如果有直接使用VectorDrawable的方法,那就更好了。

谢谢,
dh

最佳答案



介绍

我们要:

  • 从XML解析 VectorDrawables 以找到pathData
  • VectorDrawables 从XML扩展到View类(或子类,ImageView等)。
  • pathData转换为 Path 类(使用 android.util.PathParser )



  • 只需在应用程序的build.gradle中添加以下依赖项(请参见示例应用程序):
    dependencies {
          compile 'com.sdsmdg.harjot:vectormaster:1.1.3'
    }
    

    这是我使用它的测试应用程序的的图像:
    android - 您可以将VectorDrawable pathData转换为Path对象吗?-LMLPHP

    设定

    这是一个可用于(pathData)... res \ drawable \ ic_heart.xml 的Vector:
    <vector xmlns:android="http://schemas.android.com/apk/res/android"
            android:width="24dp"
            android:height="24dp"
            android:viewportWidth="24.0"
            android:viewportHeight="24.0">
        <path
            android:name="outline"
            android:pathData="M20.84,4.61a5.5,5.5 0,0 0,-7.78 0L12,5.67l-1.06,-1.06a5.5,5.5 0,0 0,-7.78 7.78l1.06,1.06L12,21.23l7.78,-7.78 1.06,-1.06a5.5,5.5 0,0 0,0 -7.78z"
            android:strokeLineCap="round"
            android:strokeColor="#5D5D5D"
            android:fillColor="#00000000"
            android:strokeWidth="2"
            android:strokeLineJoin="round"/>
    </vector>
    

    这是我们布局中的VectorMasterView:

    ... res \ layout \ activity_main :
    <com.sdsmdg.harjot.vectormaster.VectorMasterView
        android:id="@+id/heart_vector"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_margin="10dp"
        android:scaleX="0.8"
        android:scaleY="0.8"
        app:vector_src="@drawable/ic_heart" />
    



    Vector中设置onCreate:
    //normal stuff
    setContentView(R.layout.activity_main);
    
    //Inflate the `Vector`
    VectorMasterView vmHeartVector = (VectorMasterView) findViewById(R.id.heart_vector);
    
    // find the correct path using name
    PathModel outline = vmHeartVector.getPathModelByName("outline");
    
    String pathData   = outline.getPathData();// this is our pathData
    Path   path       = outline.getPath();    // this is our path object;
    

    一些链接:
    Vector drawables overview
    Path
    pathData
    VectorDrawable
    AnimatedVectorDrawable
    VectorDrawableCompat
    AnimatedVectorDrawableCompat

    07-27 16:00