前言:
1>
补间动画有四种:平移/缩放/透明度/旋转,这四点将会通过代码示例一来进行说明;
2>
关于补间动画的实质,并不是控件的移动,只是控件的重绘,控件实质是没有进行移动的,这点则通过代码二来进行说明;
代码示例:
1>代码示例一主要是讲解4种补间动画的用法,其代码示例如下:
MainActivity:
package com.example.administrator.testtweenanimation; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.view.animation.AnimationSet; import android.view.animation.RotateAnimation; import android.view.animation.ScaleAnimation; import android.view.animation.TranslateAnimation; import android.widget.ImageView; public class MainActivity extends AppCompatActivity { private ImageView imageView; private TranslateAnimation translateAnimation; private ScaleAnimation scaleAnimation; private AlphaAnimation alphaAnimation; private RotateAnimation rotateAnimation; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /*** * 获取ImageView控件 * **/ imageView = (ImageView) findViewById(R.id.iv); } /*** * 平移补间动画的效果演示 * **/ public void translate(View view){ /*** * 10: 表示动画的X坐标的起始位置为:imageView的X坐标 + 10 * 100: 表示动画的X坐标的结束位置为:imageView的X坐标 + 100 * 20: 表示动画的Y坐标的起始位置为:imageView的Y坐标 + 20 * 200: 表示动画的Y坐标的结束位置为:imageView的Y坐标 + 200 * ***/ translateAnimation = new TranslateAnimation(10,100,20,200); /*** * Animation.RELATIVE_TO_SELF: * 0: 表示动画的X坐标的起始位置为:X坐标值 + (-1)*imageView控件自身的宽 * 1: 表示动画的X坐标的结束位置为:X坐标值 + 1*imageView控件自身的宽 * 0.5f: 表示动画的Y坐标的起始位置为:Y坐标值 + (-0.5)*imageView控件自身的高 * 1.5f: 表示动画的Y坐标的结束位置为:Y坐标值 + 1.5*imageView控件自身的高 * * Animation.RELATIVE_TO_PARENT: * 0: 表示动画的X坐标的起始位置为:X坐标值 + (-1)*imageView的父控件的宽 * 1: 表示动画的X坐标的结束位置为:X坐标值 + 1*imageView的父控件的宽 * 0.5f: 表示动画的Y坐标的起始位置为:Y坐标值 + (-0.5)*imageView的父控件的高 * 1.5f: 表示动画的Y坐标的结束位置为:Y坐标值 + 1.5*imageView的父控件的高 * **/ /**** TranslateAnimation ta = new TranslateAnimation( Animation.RELATIVE_TO_SELF,-1, Animation.RELATIVE_TO_SELF,1, Animation.RELATIVE_TO_SELF,-0.5f,Animation.RELATIVE_TO_SELF,1.5f); ****/ /*** * 设置动画执行的时间 * **/ translateAnimation.setDuration(2000); /*** * 动画重复的次数,比如: * 当动画重复的次数设置为1次时, * 则表明动画播放2次,因为其重复之前有一次播放; * **/ translateAnimation.setRepeatCount(1); /*** * 表示设置动画重复的模式, * RESTART:这是默认重复的模式,表示重新再执行一遍 * REVERSE:这是表示重复执行的时候,这一次与上一次执行的位置刚好颠倒过来; * 比如:上一次是从上到下执行,那么第二次重复执行的时候,则是从下往上执行回去; * **/ translateAnimation.setRepeatMode(Animation.REVERSE); /*** * 开启动画 * **/ imageView.startAnimation(translateAnimation); } /*** * 缩放的效果演示 * **/ public void scale(View view){ /**** * 0: 表示动画在x坐标上缩放0倍开始 * 1: 表示动画在x坐标上缩放1倍结束 * 0: 表示动画在y坐标上缩放0倍开始 * 1: 表示动画在y坐标上缩放1倍结束 * * 其缩放点为左上角; * **/ scaleAnimation = new ScaleAnimation(0,1,0,1); /*** * 0.5f: 表示动画在x坐标上缩放0倍开始 * 1: 表示动画在x坐标上缩放1倍结束 * 1.5f: 表示动画在y坐标上缩放0倍开始 * 2: 表示动画在y坐标上缩放1倍结束 * 20:表示动画X轴的缩放点为:x坐标 + 20 * 40:表示动画Y轴的缩放点为:y坐标 + 40 * **/ //ScaleAnimation scaleAnimation = new ScaleAnimation(0,1,0,1,20,40); /*** * 0.5f: 表示动画在x坐标上缩放0倍开始 * 1: 表示动画在x坐标上缩放1倍结束 * 1.5f: 表示动画在y坐标上缩放0倍开始 * 2: 表示动画在y坐标上缩放1倍结束 * Animation.RELATIVE_TO_SELF,0.5f: * 表示动画x轴的缩放点为:x坐标 + imageView自身的宽*0.5 * Animation.RELATIVE_TO_SELF,0.5f: * 表示动画Y轴的缩放点为:y坐标 + imageView自身的高*0.5 * **/ /** ScaleAnimation scaleAnimation = new ScaleAnimation(0,1,0,1, Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f); ***/ /*** * 设置动画持续的时间为2s * ***/ scaleAnimation.setDuration(2000); /*** * 设置动画停留在结束的位置上 * **/ scaleAnimation.setFillAfter(true); /*** * 开启动画 * ***/ imageView.startAnimation(scaleAnimation); } /*** * 透明度的效果演示 * **/ public void alpha(View view){ /*** * 0: 表示从完全透明开始 * 1: 表示从完全不透明结束 * **/ alphaAnimation = new AlphaAnimation(0,1); alphaAnimation.setDuration(2000); imageView.startAnimation(alphaAnimation); } /*** * 旋转的效果演示 * **/ public void rotate(View view){ /*** * 其参数可以对比着缩放动画的参数去理解(故其他几种构造函数的参数就不予以赘述) * 0: 表示动画从0度的位置开始 * 180: 表示动画从180度位置结束 * * 由于这个构造函数没有指出其旋转的中心点,所以其默认的旋转中心点是左上角; * **/ rotateAnimation = new RotateAnimation(0,180); rotateAnimation.setDuration(2000); imageView.startAnimation(rotateAnimation); } /*** * 几种补间动画的综合效果演示, * **/ public void sum(View view){ /*** * false:表示每种动画都用自己的interpolator; * * true:表示所有的动画都用用一个interpolator, * 这个interpolator与animationSet有关; * **/ AnimationSet animationSet = new AnimationSet(false); translateAnimation = new TranslateAnimation(10,100,20,200); translateAnimation.setDuration(2000); translateAnimation.setRepeatCount(1); translateAnimation.setRepeatMode(Animation.REVERSE); animationSet.addAnimation(translateAnimation); scaleAnimation = new ScaleAnimation(0,1,0,1); scaleAnimation.setDuration(2000); scaleAnimation.setFillAfter(true); animationSet.addAnimation(scaleAnimation); alphaAnimation = new AlphaAnimation(0,1); alphaAnimation.setDuration(2000); animationSet.addAnimation(alphaAnimation); rotateAnimation = new RotateAnimation(0,180); rotateAnimation.setDuration(2000); animationSet.addAnimation(rotateAnimation); imageView.startAnimation(animationSet); } }
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?> <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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.administrator.testtweenanimation.MainActivity"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="平移" android:onClick="translate" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="缩放" android:onClick="scale" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="透明" android:onClick="alpha" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="旋转" android:onClick="rotate" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="综合效果" android:onClick="sum" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/iv" android:background="@drawable/man" android:layout_gravity="center" /> </LinearLayout>
运行结果如下:
2>代码示例二主要是讲解补间动画的实质,其代码示例如下:
代码示例如下:
MainActivity_main:
package com.example.administrator.testtweenanimationtheory; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.animation.TranslateAnimation; import android.widget.ImageView; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /*** * 获取imageView控件 * **/ imageView = (ImageView) findViewById(R.id.iv); /*** * 设置imageView的背景 * **/ imageView.setBackgroundResource(R.drawable.man); /*** * 对imageView设置侦听 * **/ imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this,"已选中",Toast.LENGTH_SHORT).show(); } }); } public void translate(View view){ TranslateAnimation translateAnimation = new TranslateAnimation(0,200,0,200); translateAnimation.setDuration(2000); /*** * 设置动画停留在结束时的位置 * ***/ translateAnimation.setFillAfter(true); imageView.startAnimation(translateAnimation); } }
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?> <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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.administrator.testtweenanimationtheory.MainActivity"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="translate" android:text="平移" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/iv" android:layout_gravity="center" /> </LinearLayout>
运行结果如下:
总结:
1>
补间动画有四种,每种动画都有自己独有的一个Animation类,其使用步骤可见示例一;
2>
在示例二的这个运行结果中,当我们点击动画停留之后的那个图标时,发现并没有弹出
Toast,但是点击动画开始之前的那个位置,发现居然弹出了Toast,这说明移动之后的那个
动画是重绘而来,并不是真实控件移动达到的;
源码:
1>
2>