实际上我试图动画一个矢量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,但保留了所有其余的代码。
谢谢