AnimatedVectorDrawable类是在API 21中引入的,用于轻松漂亮地对Vector Drawables进行动画处理。使用AnimatedVectorDrawable,可以执行以下操作:
- 旋转,缩放,平移VectorDrawables
- 对VectorDrawable进行动画处理,例如填充颜色等。
- 绘制路径并进行路径变形
AnimatedVectorDrawable元素具有VectorDrawable属性,以及一个或多个目标元素。 target元素可以通过android:name属性指定其目标,并通过android:animation属性将该目标与适当的ObjectAnimator或AnimatorSet链接。
绘制Tick Cross动画的方法:
- 在values目录中创建一个新的tick_cross.xml文件,并添加以下矢量drawble路径数据和路径命令:
tick_cross.xml
24 24 12 12 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 2 tick cross groupTickCross #999
cross_to_tick.xml
tick_to_cross.xml
rotate_cross_to_tick.xml
rotate_cross_to_tick.xml
avd_cross_to_tick.xml
avd_tick_to_cross.xml
ic_tick.xml
ic_cross.xml
activity_main.xml
MainActivity.xml
package org.geeksforgeeks.tickcross; import androidx.appcompat.app.AppCompatActivity; import android.graphics.drawable.AnimatedVectorDrawable; import android.os.Bundle; import android.view.View; import android.widget.ImageView; public class MainActivity extends AppCompatActivity { 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 = findViewById(R.id.tick_cross); tickToCross = (AnimatedVectorDrawable) getDrawable( R.drawable.avd_tick_to_cross); crossToTick = (AnimatedVectorDrawable) getDrawable( R.drawable.avd_cross_to_tick); } // This method help to animate our view. public void animate(View view) { AnimatedVectorDrawable drawable = tick ? tickToCross : crossToTick; tickCross.setImageDrawable(drawable); drawable.start(); tick = !tick; } }
- 现在创建一个新的Android资源目录。右键单击res文件夹,然后选择“ Android资源目录”。确保选择资源类型作为动画制作器。
动画师可以更改对象的物理属性。这意味着,如果将视图移动到新位置,则触摸坐标将被映射到新位置,而无需任何其他干预。 - 现在,在动画师目录中创建一个新的cross_to_tick.xml文件。在此文件中,我们主要将时间和动画类型定义为cross_to_tick.xml。当用户单击十字图标时,此文件负责将十字转换为刻度。
cross_to_tick.xml
- 现在,在动画师目录中创建一个新的tick_to_cross.xml文件。在此文件中,我们主要将时间长度和动画类型定义为tick_to_cross.xml。当用户单击对勾图标时,此文件负责对对勾进行转换。
tick_to_cross.xml
- 现在,在动画师目录中创建一个新的rotation_cross_to_tick.xml文件。在此文件中,我们主要将时间长度和动画类型定义为tick_to_cross.xml。用户单击十字图标时,此文件负责旋转。
rotation_cross_to_tick.xml
- 现在,在动画师目录中创建一个新的rotate_tick_to_cross.xml文件。在此文件中,我们主要将时间长度和动画类型定义为tick_to_cross.xml。当用户单击对勾图标时,此文件负责旋转。
rotation_cross_to_tick.xml
在接下来的两个步骤中,我们将为cross_to_tick和tick_to_cross创建AnimatedVectorDrawable。
- 现在,在drawable目录和以下代码中创建一个新的avd_cross_to_tick.xml文件。
avd_cross_to_tick.xml
- 现在,在drawable目录和以下代码中创建一个新的avd_tick_to_cross.xml文件。
avd_tick_to_cross.xml
- 在此步骤中,我们将为矢量图形定义一个静态可绘制对象。现在,在drawable目录和以下代码中创建一个新的ic_tick.xml文件。
ic_tick.xml
- 在此步骤中,我们将为矢量图形定义一个静态可绘制对象。现在,在drawable目录和以下代码中创建一个新的ic_cross.xml文件。
ic_cross.xml
- 现在,将以下代码添加到activity_main.xml文件中。
activity_main.xml
- 现在,在MainActivity.xml文件中添加以下代码。
MainActivity.xml
package org.geeksforgeeks.tickcross; import androidx.appcompat.app.AppCompatActivity; import android.graphics.drawable.AnimatedVectorDrawable; import android.os.Bundle; import android.view.View; import android.widget.ImageView; public class MainActivity extends AppCompatActivity { 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 = findViewById(R.id.tick_cross); tickToCross = (AnimatedVectorDrawable) getDrawable( R.drawable.avd_tick_to_cross); crossToTick = (AnimatedVectorDrawable) getDrawable( R.drawable.avd_cross_to_tick); } // This method help to animate our view. public void animate(View view) { AnimatedVectorDrawable drawable = tick ? tickToCross : crossToTick; tickCross.setImageDrawable(drawable); drawable.start(); tick = !tick; } }
输出: