📜  如何在Android中制作Check / Tick和Cross动画

📅  最后修改于: 2021-05-09 17:23:36             🧑  作者: Mango

AnimatedVectorDrawable类是在API 21中引入的,用于轻松漂亮地对Vector Drawables进行动画处理。使用AnimatedVectorDrawable,可以执行以下操作:

  • 旋转,缩放,平移VectorDrawables
  • 对VectorDrawable进行动画处理,例如填充颜色等。
  • 绘制路径并进行路径变形

AnimatedVectorDrawable元素具有VectorDrawable属性,以及一个或多个目标元素。 target元素可以通过android:name属性指定其目标,并通过android:animation属性将该目标与适当的ObjectAnimator或AnimatorSet链接。

绘制Tick Cross动画的方法:

  1. 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;
        }
    }


  2. 现在创建一个新的Android资源目录。右键单击res文件夹,然后选择“ Android资源目录”。确保选择资源类型作为动画制作器
    动画师可以更改对象的物理属性。这意味着,如果将视图移动到新位置,则触摸坐标将被映射到新位置,而无需任何其他干预。
  3. 现在,在动画师目录中创建一个新的cross_to_tick.xml文件。在此文件中,我们主要将时间和动画类型定义为cross_to_tick.xml。当用户单击十字图标时,此文件负责将十字转换为刻度。

    cross_to_tick.xml

    
    
    
  4. 现在,在动画师目录中创建一个新的tick_to_cross.xml文件。在此文件中,我们主要将时间长度和动画类型定义为tick_to_cross.xml。当用户单击对勾图标时,此文件负责对对勾进行转换。

    tick_to_cross.xml

    
    
    
  5. 现在,在动画师目录中创建一个新的rotation_cross_to_tick.xml文件。在此文件中,我们主要将时间长度和动画类型定义为tick_to_cross.xml。用户单击十字图标时,此文件负责旋转。

    rotation_cross_to_tick.xml

    
    
    
  6. 现在,在动画师目录中创建一个新的rotate_tick_to_cross.xml文件。在此文件中,我们主要将时间长度和动画类型定义为tick_to_cross.xml。当用户单击对勾图标时,此文件负责旋转。

    rotation_cross_to_tick.xml

    
    
    

    在接下来的两个步骤中,我们将为cross_to_tick和tick_to_cross创建AnimatedVectorDrawable。

  7. 现在,在drawable目录和以下代码中创建一个新的avd_cross_to_tick.xml文件。

    avd_cross_to_tick.xml

    
    
      
        
      
        
      
    
    
  8. 现在,在drawable目录和以下代码中创建一个新的avd_tick_to_cross.xml文件。

    avd_tick_to_cross.xml

    
    
      
        
      
      
        
      
    
    
  9. 在此步骤中,我们将为矢量图形定义一个静态可绘制对象。现在,在drawable目录和以下代码中创建一个新的ic_tick.xml文件。

    ic_tick.xml

    
    
      
        
      
            
        
    
    
  10. 在此步骤中,我们将为矢量图形定义一个静态可绘制对象。现在,在drawable目录和以下代码中创建一个新的ic_cross.xml文件。

    ic_cross.xml

    
    
      
        
      
            
      
        
      
    
    
  11. 现在,将以下代码添加到activity_main.xml文件中。

    activity_main.xml

    
    
      
        
      
    
    
  12. 现在,在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;
        }
    }
    

输出: