Android开发第七天

属性动画

知识点

  1. 什么是Android属性动画
  2. 动画比较
  3. 属性动画组成部分、相关类介绍
  4. 基本属性实现

详解

  1. 什么是Android属性动画
    属性动画(Property Animation)系统是一个健壮的动画框架系统,它可以满足你大部分动画需求。不管动画对象是否已经绘制到屏幕上,你都可以在动画执行过程中改变它任意的属性值。一个属性动画会在一段特定长度的时间内改变一个属性(一个对象中的字段)的值。你可以通过以下几步定义一个动画:指定你要执行动画的属性,比如动画对象(View)在屏幕上的位置,指定执行时长,指定你希望的属性的变化值。
  2. 动画比较
  • 补间动画(Tween Animation)
    a. 渐变动画支持四种类型:平移(Translate)、旋转(Rotate)、缩放(Scale)、不透明度(Alpha)。
    b. 只是显示的位置变动,View的实际位置未改变,表现为View移动到其他地方,点击事件仍在原处才能响应(弊端)
    c. 组合使用步骤较复杂。
    d. View Animation 也是指此动画。
  • 帧动画(Frame Animation)
    a. 用于生成连续的Gif效果图。
    b. DrawableAnimation也是指此动画。
  • 属性动画(Property Animation)
    a. 支持对所有View能更新的属性的动画(需要属性的setXxx()和getXxx())
    b. 更改的是View实际的属性,所以不会影响其在动画执行后所在位置的正常使用。
    c. Android3.0 (API11)及以后出现的功能,3.0之前的版本可使用github第三方开源库nineoldandroids.jar进行支持。
  1. 属性动画组成部分、相关类介绍
    1.ObjectAnimator :对象动画执行类。
    2.ValueAnimator :值动画执行类,常配合AnimatorUpdateListener使用。
    3.PropertyValuesHolder : 属性存储器,为两个执行类提供更新多个属性的功能。
    4.Keyframe :为 PropertyValuesHolder提供多个关键帧的操作值。
    5.AnimatorSet :一组动画的执行集合类:设置执行的先后顺序,时间等。
    6.AnimatorUpdateListener :动画更新监听。
    7.AnimatorListener :动画执行监听,在动画开始、重复、结束、取消时进行回调。
    8.AnimatorInflater :加载属性动画的xml文件。
    9.TypeEvaluator :类型估值,用于设置复杂的动画操作属性的值。
    10.TimeInterpolator :时间插值,用于控制动画执行过程。
  2. 基本属性实现




public class MainActivity extends AppCompatActivity {
   View v;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        v =findViewById(R.id.v);
    }

    //透明度
    public void test1(){
        /**
         * 1.target 需要动画的控件
         * 2.propertyName 控件的那个属性
         * 3. ...values 变化的值 start-end
         */
        ObjectAnimator alphaAnim = ObjectAnimator.
                ofFloat(v,"alpha",1,0,1);
        alphaAnim.setDuration(3000);
        alphaAnim.start();
    }

    //旋转
    public void test2(){
        ObjectAnimator rotateAnim=ObjectAnimator.
                ofFloat(v,"rotation",0,360);
        rotateAnim.setDuration(1000);
        rotateAnim.start();
    }

    //缩放
    public void test3(){
        ObjectAnimator scaleAnim=ObjectAnimator.
                ofFloat(v,"scaleX",1,1.1f,1,1.1f,1,1.1f,1);
        scaleAnim.setDuration(1000);
        //scaleAnim.setRepeatCount(-1);
        //scaleAnim.setRepeatMode(ValueAnimator.REVERSE);


        ObjectAnimator scaleAnim2=ObjectAnimator.
                ofFloat(v,"scaleY",1,1.1f,1,1.1f,1,1.1f,1);
        scaleAnim2.setDuration(1000);
        //scaleAnim2.setRepeatCount(-1);
        //scaleAnim2.setRepeatMode(ValueAnimator.REVERSE);


        //playTogether 同时播放
        //playSequentially 顺序执行
        //play after before先后 with一起
        AnimatorSet aset =new AnimatorSet();
//        aset.playTogether(scaleAnim,scaleAnim2);
//        aset.playSequentially();
        aset.play(scaleAnim).after(scaleAnim2);
        aset.start();
    }

    //移动
    public void test4(){
        ObjectAnimator transAnim=ObjectAnimator.
                ofFloat(v,"translationX",v.getTranslationX()+100);
        transAnim.setDuration(100);
        transAnim.start();
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction()==MotionEvent.ACTION_DOWN){
            test4();
        }
        return true;
    }
}

你可能感兴趣的:(Android开发第七天)