Android 属性动画使用(一)

首先扯点别的:感觉自己好久没有用笔写过字了,下午去超市每个小本子,写写诗,练练字,陶冶一下情操,也不能有事没事就喝酒。

ValueAnimator

ValueAnimator 。给它一个初始值和结束值,以及动画的时间,ValueAnimator 会自动计算在动画时间内如何从初始值过渡到结束值。

使用场景1:比如说我现在有一个Button,点击的时候,我想改变他的height和width为原来的1/2,以及增加marginTop的值,就可以如下所示。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:layout_marginTop="8dp"
        android:text="ValueAnimator" />
        
LinearLayout>
//点击button1的时候
 case R.id.button1:
        final LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) button1.getLayoutParams();
        //得到初始的高度宽度和距离父级容器顶部的高度
        final int height = button1.getHeight();
        final int width = button1.getWidth();
        final int top = button1.getTop();
        //使用ofFloat方法实例化一个动画,初始值是0,结束值是0.5;
        ValueAnimator va1 = ValueAnimator.ofFloat(0F, 0.5F);
        //给动画添加一个监听事件,动画从在整个过渡过程中会一直执行
        //onAnimationUpdate(ValueAnimator animation) 方法,我们的逻辑就应该写在这个方法里面
        va1.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                //在动画执行的每一帧都会执行下面的代码
                float fraction = (float) animation.getAnimatedValue();
                params.height = (int) (height - height * fraction);
                params.width = (int) (width - width * fraction);
                params.topMargin = (int) (top + 200 * fraction);
                button1.setLayoutParams(params);
            }
        });
        va1.setRepeatCount(3);//设置动画重复次数
        va1.setRepeatMode(ValueAnimator.RESTART);//重新播放
        va1.setStartDelay(1000);//动画延迟多长时间开始
        va1.setDuration(1000);//设置动画时长
        va1.start();//开始动画
 break;

ValueAnimator当中最常用的应该就是ofFloat()和ofInt()和ofObject方法,ofInt方法跟ofFloat方法一样,ofObject后面再讲。

ObjectAnimator

//使用方式和ValueAnimator类似,第一个参数代表操作的对象,第二个参数表示改变对象的属性,
//后面的参数是变化范围。
//这行代码的意思就是通过调用button2透明度属性对应的get和set方法来改变button2的透明度,
//变化范围是先从完全不透明->完全透明->完全不透明
ObjectAnimator oa=ObjectAnimator.ofFloat(button2,"alpha",1F,0F,1F);
oa.setDuration(2000);
oa.start();

ObjectAnimator继承自ValueAnimator,ObjectAnimator内部的工作机制并不是直接对我们传入的属性名进行操作的,而是会去寻找这个属性名对应的get和set方法,因此alpha属性所对应的get和set方法应该就是

//button改变透明度的方法
button2.getAlpha();
button2.setAlpha(float alpha);

旋转动画

 ObjectAnimator oa = ObjectAnimator.ofFloat(button2, "rotation", 0,360,0);
                oa.setDuration(2000);
                oa.start();

平移动画将 ,TextView先向左移出屏幕,然后再移动回来

float curTranslationX = textview.getTranslationX();  
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "translationX", 
              curTranslationX, -500f, curTranslationX);  
animator.setDuration(5000);  
animator.start();  

缩放动画,将TextView在垂直方向上放大3倍再还原

ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "scaleY", 1f, 3f, 1f);  
animator.setDuration(5000);  
animator.start();  

hehe动画,调用下面的代码发现什么都没有发生,这是为什么呢,因为Button类中并没有setHehe和getHehe方法。

 ObjectAnimator oa1 = ObjectAnimator.ofFloat(button3, "hehe", 0,360,0);
                oa1.setDuration(2000);
                oa1.start();

组合动画 AnimatorSet

AnimatorSet 可以将多个ObjectAnimator或者ValueAnimator组合到一起执行。比如说想让button旋转的时候同时改变透明度可以这样写:

 ObjectAnimator oa = ObjectAnimator.ofFloat(button2, "rotation", 0,360,0);
 ObjectAnimator oa1 = ObjectAnimator.ofFloat(button2, "alpha", 1,0,1);
 AnimatorSet as=new AnimatorSet();
 as.setDuration(2000);
 as.playTogether(oa,oa1);//两个动画同时播放。
 as.start();               

AnimatorSet 的playTogether方法

//可变参数列表
public void playTogether(Animator... items)
//也可以传入一个集合
public void playTogether(Collection<Animator> items)

AnimatorSet 的playSequentially方法

//可变参数列表
public void playSequentially(Animator... items)
//传入一个集合
public void playSequentially(List<Animator> items) 

AnimatorSet提供了一个play()方法,如果我们向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包括以下四个方法:

  • after(Animator anim) 将现有动画插入到传入的动画之后执行
  • after(long delay) 将现有动画延迟指定毫秒后执行
  • before(Animator anim) 将现有动画插入到传入的动画之前执行
  • with(Animator anim) 将现有动画和传入的动画同时执行

所以上边的as.playTogether(oa,oa1); 替换成as.play(oa).with(oa1);效果也是一样的。

给动画添加监听事件

//只监听动画结束事件
moveIn.addListener(new AnimatorListenerAdapter() {
         @Override
         public void onAnimationEnd(Animator animation) {
             super.onAnimationEnd(animation);
         }
});
//监听动画开始,结束,取消和重复时候的事件
moveIn.addListener(new Animator.AnimatorListener() {
      @Override
      public void onAnimationStart(Animator animation) {

      }

      @Override
      public void onAnimationEnd(Animator animation) {

      }

      @Override
      public void onAnimationCancel(Animator animation) {

      }

      @Override
      public void onAnimationRepeat(Animator animation) {

      }
});
//监听动画暂停和重新开始的事件
moveIn.addPauseListener(new Animator.AnimatorPauseListener() {
      @Override
      public void onAnimationPause(Animator animation) {
                        
      }

      @Override
      public void onAnimationResume(Animator animation) {

      }
});

使用XML编写动画

在res目录下新建animator文件夹

旋转动画


<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:valueFrom="0"
    android:valueTo="360"
    android:propertyName="rotation"
    android:duration="4000">

objectAnimator>

xml组合动画 anim_set.xml


<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially">

    <objectAnimator
        android:duration="2000"
        android:propertyName="translationX"
        android:valueFrom="0"
        android:valueTo="500"
        android:valueType="floatType" />
    <set android:ordering="together">
        <objectAnimator
            android:duration="3000"
            android:propertyName="rotation"
            android:valueFrom="0"
            android:valueTo="360"
            android:valueType="floatType" />
        <set android:ordering="sequentially">
            <objectAnimator
                android:duration="1500"
                android:propertyName="alpha"
                android:valueFrom="1"
                android:valueTo="0"
                android:valueType="floatType" />
            <objectAnimator
                android:duration="1500"
                android:propertyName="alpha"
                android:valueFrom="0"
                android:valueTo="1"
                android:valueType="floatType" />
        set>
    set>
set>

在代码中加载动画

Animator animator= AnimatorInflater.loadAnimator(AnimatorActivity.this,R.animator.anim_set);
animator.setTarget(button3);
animator.start();

效果图
Android 属性动画使用(一)_第1张图片

结尾:好今天就记录到这里,身体也是甚是乏累啊,出去跑跑步,狂狂超市,买点菜吃饭。

参考链接:

  • Android属性动画完全解析(上),初识属性动画的基本用法

你可能感兴趣的:(Android)