安卓动画主要包括视图动画和属性动画。视图动画,顾名思义就是注重对图画的展示;属性动画内容相对丰富些,除了展示动画,对动画的操作也有相关的定义。
视图动画
常见的视图动画包括透明度、旋转、平移和缩放这四类,再进一步就是将这四种进行结合,产生一些稍微复杂的动画。按照在慕课网上学习的基础视频,将内容进行整理,进行了总结。
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();
}
});
}
代码简洁,提高了代码的复用率。