AnimatedVectorDrawables pathData不工作?

时间:2017-10-23 07:22:29

标签: android animation android-vectordrawable

实际上我试图动画一个矢量drawable(勾选交叉反之亦然)但是我找到的svgs的所有路径数据都不起作用!即使我使用Android Vector资产! 我不知道是什么问题?因为我确信我确实提取了pathData但同样的问题!一直不工作。 正在运行的唯一两个pathData是:

tick:M4.8,13.4 L9,17.6 M10.4,16.2 L19.6,7 交叉:M6.4,6.4 L17.6,17.6 M6.4,17.6 L17.6,6.4

但我不知道他们来自哪里!我只是从另一个项目复制它们!我找到的路径数据或Android Studio矢量资产pathdata无法正常工作。 有人可以告诉我这是什么问题,我在哪里可以找到确切的路径数据或者如何?

问题在于:当我运行应用程序时崩溃了!

首先,我使用这个XML代码创建了我的向量:

     <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="120dp"
android:height="120dp"
android:viewportWidth="24"
android:viewportHeight="24">

    <group
        android:name="groupTickCross"
        android:pivotX="12"
        android:pivotY="12">

        <path
            android:name="tick"
            android:fillColor="@color/stroke_color"
            android:pathData="@string/path_tick"
            android:strokeWidth="2"
            android:strokeColor="@color/stroke_color"
            android:strokeLineCap="square"
            />

    </group>

</vector>

一个用于刻度,一个用于十字架,然后我创建了动画文件:cross_to_tick.xml

 <objectAnimator
xmlns:android="http://schemas.android.com/apk/res/android"
android:propertyName="pathData"
android:valueFrom="@string/path_cross"
android:valueTo="@string/path_tick"
android:duration="450"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:valueType="pathType" />

和tick_to_cross.xml

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="pathData"
    android:valueFrom="@string/path_tick"
    android:valueTo="@string/path_cross"
    android:duration="450"
    android:interpolator="@android:interpolator/fast_out_slow_in"
    android:valueType="pathType" />

两种情况下的旋转动画:

rotate_cross_to_tick.xml

<objectAnimator
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="rotation"
    android:valueFrom="-180"
    android:valueTo="0"
    android:duration="450"
    android:interpolator="@android:interpolator/fast_out_slow_in" />

rotate_tick_to_cross.xml:

 <?xml version="1.0" encoding="utf-8"?>
<objectAnimator
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="rotation"
    android:valueFrom="0"
    android:valueTo="180"
    android:duration="450"
    android:interpolator="@android:interpolator/fast_out_slow_in" />

然后我创建了将矢量与动画相关联的文件: avd_tick_to_cross.xml

<animated-vector
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/ic_tick">

    <target
        android:name="tick"
        android:animation="@animator/tick_to_cross" />


    <target
        android:name="groupTickCross"
        android:animation="@animator/rotate_tick_to_cross" />

</animated-vector>

和avd_cross_to_tick.xml

<animated-vector
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/ic_cross">

    <target
        android:name="cross"
        android:animation="@animator/cross_to_tick" />

    <target
        android:name="groupTickCross"
        android:animation="@animator/rotate_cross_to_tick" />

</animated-vector>

之后我创建了值/ tick_cross.xml

<resources>

    <!-- geometry -->
    <integer name="viewport_width">24</integer>
    <integer name="viewport_height">24</integer>
    <integer name="viewport_center_x">12</integer>
    <integer name="viewport_center_y">12</integer>
    <!--<string name="path_tick">M19.6,7 L10.4,16.2 M4.8,13.4 L9,17.6</string>-->
    <string name="path_tick">M4.8,13.4 L9,17.6 M10.4,16.2 L19.6,7</string>
    <!--<string name="path_cross">M17.6,6.4 L6.4,17.6 M6.4,6.4 L17.6,17.6</string>-->
    <string name="path_cross">M6.4,6.4 L17.6,17.6 M6.4,17.6 L17.6,6.4</string>
    <integer name="stroke_width">2</integer>

    <!-- names -->
    <string name="tick">tick</string>
    <string name="cross">cross</string>
    <string name="groupTickCross">groupTickCross</string>

    <!-- drawing -->
    <color name="stroke_color">#999</color>

    <!-- timing -->
    <integer name="duration">450</integer>

</resources>

和main_activity.xml

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:onClick="animate"
    tools:context="com.example.asma.animatedvectorsdrawables.MainActivity">

    <ImageView
        android:id="@+id/tick_cross"
        android:layout_centerInParent="true"
        android:src="@drawable/ic_tick"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>

最后,当然是java类:

public class MainActivity extends Activity {

    private ImageView tickCross;
    private AnimatedVectorDrawable tickToCross;
    private AnimatedVectorDrawable crossToTick;
    private boolean tick = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tickCross = (ImageView) findViewById(R.id.tick_cross);

        tickToCross = (AnimatedVectorDrawable) getDrawable(R.drawable.avd_tick_to_cross);
        crossToTick = (AnimatedVectorDrawable) getDrawable(R.drawable.avd_cross_to_tick);

    }

    public void animate(View view) {
        //if it is a tick the animate from tick to cross else? animate from cross to tick
        AnimatedVectorDrawable drawable = tick ? tickToCross : crossToTick;
        tickCross.setImageDrawable(drawable);
        drawable.start();
        tick = !tick;
    }
}

此代码运行正常。但是当我将pathData更改为从另一个svg文件中提取的另一个tick / cross pathData时,应用程序在运行时会突然停止(仅当我使用上面代码中显示的另一个与此不同的pathData时!)

这是我使用的tick和cross的pathData(来自AndroidStudio VectorAssets)

tick pathData:M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z

Cross pathData:M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z

我只更改了pathData,但保留了所有其余的代码。

谢谢

0 个答案:

没有答案