欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android自定控件之动画总结(一)

程序员文章站 2022-07-14 17:40:57
...

前言

  Android的动画实现主要有三种,帧动画、补间动画、属性动画。帧动画和补间动画很早之前就有了,但是它们两存在局限性,很多功能都是实现不了,于是就有了属性动画,属性动画相比较于前两者,能够很方便地实现我们想要的动画效果。

帧动画

  帧动画顾名思义就是将预先设置的一组图片逐帧的播放出来,我们需要在drawable文件夹里面自己添加xml资源文件,然后是由animation-list标签以及他的的子标签item。
  然后子啊activity文件里面使用AnimationDrawable类,通过(animationDrawable = (AnimationDrawable)imageView.getbackground())得到animationDrawable对象,使用start()和stop()就可以对帧动画进行控制了。

补间动画

  补间动画主要有一下四种操作,alpha、scale、translate、rotate,我们通过在res资源文件里面创建anim文件夹,然后根据需要创建对应的xml动画资源文件。每一个文件可以单独对应一种动画类型,同时也可以对应多个动画类型。对应多个动画类型需要用到set标签,使用方式如下;

<?xml version="1.0" encoding="utf-8" ?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:shareInterpolator="true">


    <scale
        android:pivotY="50%"
        android:pivotX="50%"
        android:fromXScale="0"
        android:fromYScale="0"
        android:toYScale="1"
        android:toXScale="1"
        android:duration="1000"/>

<!-- 会覆盖前面的scale动画-->

    <scale
        android:pivotY="50%"
        android:pivotX="50%"
        android:fromXScale="1"
        android:fromYScale="1"
        android:toYScale="0"
        android:toXScale="0"
        android:duration="1000"/>

    <alpha
        android:fromAlpha="0"
        android:toAlpha="1"
        android:duration="1000"/>
</set>

  在java代码里面主要用到Animation这个类,然后使用AnimationUtils.loadAnimation(this, R.anim.xxx)来创建Animation实例对象。最后通过控件的startAnimation方法开始动画效果。
  以上对于补间动画的叙述是关于如何静态使用补间动画的方法,相对应的还有动态使用补间动画的方法,前者比较后者显得更加方便,调用简介,特别是在一个动画效果需要调用多次的情况下,静态创建更好。而动态创建自然也有它的好处,就是可以根据需求动态的创建我们需要的动画,这样的话就不会有太多的局限。不管的使用哪一种方式,根据目前的需要选择性的创建才是明智的。
  对于动态创建这里就不罗嗦,只需要知道alpha、scale、rotate、translate对应的类分别是AlphaAnimation、Scale Animation、Rotate Animation、TranslateAnimation。

属性动画

  属性动画是现在用的比较多的。同样的属性动画也有静态创建和动态创建两种方法。

  • 动态使用属性动画

  这里需要了解到ValueAnimator、ObjectAnimator、PropertyValuesHolder、AnimatorSet、这四个类,以及他们之间的用法。

  • ValueAnimator

    public void Onstart(View view){
        ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 400);

        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                int curint = (int)valueAnimator.getAnimatedValue();

                tv1.layout(curint, curint, curint + tv1.getWidth(), curint + tv1.getHeight());
                //根据上面OfFloat方法里面参数相应的设置tv1.setText() tv1.setBackground()、、、、
            }
        });

        valueAnimator.setDuration(2000);
        
        valueAnimator.start();
    }

ValueAnimator用的比较少

  • ObjectAnimator

    public void OnStart(View View){
        ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(tv1, "translationY", 0f, 400f);
        
        objectAnimator.setDuration(2000);
        
        objectAnimator.setInterpolator(new BounceInterpolator());
        
        objectAnimator.start();
    }

ObjectAnimator也可以设置监听,它有两种监听,一种和ValueAnimator一样,一种是Animator.AnimatorListener接口。两者监听的功能不一样,同时后者也可以用AnimatorListenerAdapter代替。

  • PropertyValuesHolder

 //创建PropertyValuesHolder实例
        PropertyValuesHolder valuesHolder1 = PropertyValuesHolder.ofInt("backgroundColor", 0xffff00ff, 0xffffff00, 0xff0000ff);
        valuesHolder1.setEvaluator(new ArgbEvaluator());
        PropertyValuesHolder valuesHolder2 = PropertyValuesHolder.ofFloat("scaleX", 0f, 2f, 0f, 3f, 1f);
        PropertyValuesHolder valuesHolder3 = PropertyValuesHolder.ofFloat("scaleY", 0f, 2f, 0f, 3f, 1f);
        //将创建PropertyValuesHolder实例添加到ObjectAnimator中
        ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(mTextView1, valuesHolder1, valuesHolder2, valuesHolder3);
        objectAnimator.setDuration(2000);
        objectAnimator.start();

PropertyValuesHolder的意义就是保存动画过程中所需要的属性和值,其实ofInt()和ofFloat()的内部实现就是通过封装PropertyValuesHolder实例来保存动画状态的,后面的操作也是以PropertyValuesHolder为主。

  • AnimatorSet

    public void OnStart(View view){
        ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(tv1, "rotation", 0f, 360f);
        ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(tv1, "translationY", 0f, 400f);

        ObjectAnimator objectAnimator3 = ObjectAnimator.ofInt(tv2, "BackgroundColor",0xffffff, 0x000000);

        objectAnimator1.setDuration(1000000);

        AnimatorSet animatorSet = new AnimatorSet();
        
        animatorSet.setDuration(2000);//会覆盖objectAnimator1的设置。

        //按顺序播放
//        animatorSet.playSequentially(objectAnimator1, objectAnimator2, objectAnimator3);
        //同时播放
//        animatorSet.playTogether(objectAnimator1, objectAnimator2, objectAnimator3);
        //既有同时播放又有顺序播放
        AnimatorSet.Builder builder = animatorSet.play(objectAnimator1);
        builder.with(objectAnimator2).after(objectAnimator3);
        //也可以写成这样
        animatorSet.play(objectAnimator1).with(objectAnimator2).after(objectAnimator3);
    }

静态创建

  我们只要记住这个,就能很好的理解了。

<animator />:对应ValueAnimator
<objectAnimator />:对应ObjectAnimator
<set />:对应AnimatorSet

  以其中的的objectAnimator为例说明一下。先在res文件夹里面创建见animator文件夹,然后创建相应的资源文件。如下所示:

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/bounce_interpolator"
    android:propertyName="BackgroundColor"
    android:duration="2000"
    android:valueFrom="#000000"
    android:valueTo="#999999"
    android:valueType="colorType" />

  然后再java代码这样实现

public void onStart(View view ){
        objectAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this, R.animator.object_animator);

        objectAnimator.setTarget(tv1);

        objectAnimator.start();

    }

最后

  由于Android动画有太多的内容,这里只是大概的讲了一下里面的东西,想要深入必须了解其实现的细节。特别时属性动画,需要熟悉各种插值器、Evaluate等等,还有属性动画的实现的过程。

相关标签: Android

上一篇: python day4

下一篇: LeetCode9. 回文数