安卓动画

安卓动画主要包括视图动画和属性动画。视图动画,顾名思义就是注重对图画的展示;属性动画内容相对丰富些,除了展示动画,对动画的操作也有相关的定义。

视图动画

常见的视图动画包括透明度、旋转、平移和缩放这四类,再进一步就是将这四种进行结合,产生一些稍微复杂的动画。按照在慕课网上学习的基础视频,将内容进行整理,进行了总结。
xml文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:srcCompat="@mipmap/heart2"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginLeft="32dp"
        android:layout_marginStart="32dp"
        android:layout_marginTop="33dp"
        android:id="@+id/imageView"
        android:onClick="click"/>

    <Button
        android:text="平移"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_toRightOf="@+id/imageView"
        android:layout_toEndOf="@+id/imageView"
        android:layout_marginLeft="108dp"
        android:layout_marginStart="108dp"
        android:layout_marginBottom="41dp"
        android:id="@+id/button5"
        android:onClick="move"/>

    <Button
        android:text="透明度"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/button5"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginLeft="15dp"
        android:layout_marginStart="15dp"
        android:id="@+id/button6"
        android:onClick="alpha"/>

    <Button
        android:text="旋转"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/button6"
        android:layout_alignLeft="@+id/button6"
        android:layout_alignStart="@+id/button6"
        android:layout_marginBottom="24dp"
        android:id="@+id/button8"
        android:onClick="rotat"/>

    <Button
        android:text="缩放"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/button8"
        android:layout_alignLeft="@+id/button5"
        android:layout_alignStart="@+id/button5"
        android:id="@+id/button9"
        android:onClick="scale"/>
</RelativeLayout>

java代码
平移动画

public void move(View view)
    {
        TranslateAnimation translate1 = new TranslateAnimation(0, 200, 0, 0);  //视图动画的内容
        translate1.setDuration(1000);
        translate1.setFillAfter(true);
        img_heart=(ImageView)findViewById(R.id.imageView);
        img_heart.startAnimation(translate1);
}

透明度动画

public void alpha(View view)
    {
        AlphaAnimation alphaAnimation = new AlphaAnimation(1,0);
        alphaAnimation.setDuration(1000);
        img_heart=(ImageView)findViewById(R.id.imageView);
        img_heart.startAnimation(alphaAnimation);
    }

旋转动画

public void rotat(View view)
    {
        RotateAnimation rotateAnimation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
        rotateAnimation.setDuration(1000);
        img_heart=(ImageView)findViewById(R.id.imageView);
        img_heart.startAnimation(rotateAnimation);
    }

缩放动画

public void scale(View view)
    {
        ScaleAnimation scaleAnimation = new ScaleAnimation(1,2, 1, 2, Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
        scaleAnimation.setDuration(1000);
        img_heart=(ImageView)findViewById(R.id.imageView);
        img_heart.startAnimation(scaleAnimation);
    }

属性动画

虽然视图动画可以实现一定的效果,但就其本身而言,还是存在一些缺陷,比如:设置动画平移,如果是视图动画,当为相应的界面view设置点击事件,其在动画结束后,点击事件还是在原来的坐标点上,所以并不符合人们的习惯。于是,后来出现属性动画,更改这一缺陷。属性动画中主要的实行类就是ObjectAnimator,相应的还有PropertyValuesHolder以及AnimatorSet。下面就使用三种不同的方法实现同一种效果。
方法一

 public void move(View view)
    {
        ObjectAnimator .ofFloat(img_heart,"rotation",0F,360F).setDuration(2000).start();  //属性动画的内容
        ObjectAnimator .ofFloat(img_heart,"translationX",0F,200F).setDuration(2000).start();
        ObjectAnimator .ofFloat(img_heart,"translationY",0F,200F).setDuration(2000).start();       
    }

方法二

public void move(View view)
    {
        PropertyValuesHolder p1= PropertyValuesHolder.ofFloat("rotation",0F,360F);
        PropertyValuesHolder p2= PropertyValuesHolder.ofFloat("translationX",0F,200F);
        PropertyValuesHolder p3= PropertyValuesHolder.ofFloat("translationY",0F,200F);
        ObjectAnimator.ofPropertyValuesHolder(img_heart,p1,p2,p3).setDuration(2000).start();
    }

方法三

public void move(View view)
    {
        ObjectAnimator animation1 = ObjectAnimator .ofFloat(img_heart,"rotation",0F,360F);
        ObjectAnimator animation2 =ObjectAnimator .ofFloat(img_heart,"translationX",0F,200F);
        ObjectAnimator animation3 =ObjectAnimator .ofFloat(img_heart,"translationY",0F,200F);

        AnimatorSet set = new AnimatorSet();
        set.playSequentially(animation2,animation3,animation1); //顺序动画
        set.play(animation2).with(animation3);
        set.play(animation1); //很有趣,感觉在写英文
      //  set.playTogether(animation1,animation2,animation3); //异步运行的动画
        set.setDuration(2000);
        set.start();
    }

属性动画中还有很多其他的知识点,比如valueAnimator,点击事件等,待我一一攻破。

属性动画的点击事件

如果我们需要为动画添加点击事件,该怎么做呢?谷歌官方已经为我们提供了相应的接口,so easy。主要有两种实现方式。
方式1

public void clickone(View view)
    {
        ObjectAnimator objectAnimator= ObjectAnimator.ofFloat(view,"alpha",1F,0F);
        objectAnimator.setDuration(5000);
        objectAnimator.start();
        objectAnimator.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animator) {

            }

            @Override
            public void onAnimationEnd(Animator animator) {
                Toast.makeText(MainActivity.this,"第三个页面",Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onAnimationCancel(Animator animator) {

            }

            @Override
            public void onAnimationRepeat(Animator animator) {

            }
        });

    }

方式2
上述方式和普通的点击事件类似。不过,似乎代码有点冗余,因为只实现其中的一个方法,但不实现的方法还是必须要写的。于是,谷歌又为我们提供了另外的接口方法,如下实例:

  public void clickone(View view)
    {
        ObjectAnimator objectAnimator= ObjectAnimator.ofFloat(view,"alpha",1F,0F);
        objectAnimator.setDuration(5000);
        objectAnimator.start();
        objectAnimator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                Toast.makeText(MainActivity.this,"第三个页面",Toast.LENGTH_SHORT).show();
            }
        });
    }

代码简洁,提高了代码的复用率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值