首页 > 代码库 > 第二十六讲:Android之Animation
第二十六讲:Android之Animation
懒惰象生锈一样,比操劳更能消耗身体;经常用的钥匙,总是亮闪闪的。 —— 富兰克林
本讲内容:Animation 动画
一、Android中动画的实现分两种方式,一种方式是补间动画 Tween Animation,就是说你定义一个开始和结束,中间的部分由程序运算得到。另一种叫逐帧动画 Frame Animation,就是说一帧一帧的连起来播放就变成了动画。和放电影的机制很相似,下面我们逐个学习。
下面引用官方文档
从图我们可以知道Animation的直接子类有AlphaAnimation、AnimationSet、RotateAnimation、ScaleAnimation、TranslateAnimation。其中AnimationSet包含一系列的Animation。
二、Tween动画是操作某个控件让其展现出旋转()、渐变、移动、缩放的这么一种转换过程。我们可以以XML形式定义动画,也可以编码实现。
三、Tween Animation共同的节点属性
属性[类型] | 功能 | 备注 |
Duration[long] | 动画持续时间 | 毫秒为单位 |
fillAfter [boolean] | 当设置为true | 动画执行后,控件将停留在执行结束的状态 |
fillBefore[boolean] | 当设置为true | 动画执行后,控件将停留在执行之前的状态 |
repeatCount[int] | 动画的重复次数 | |
RepeatMode[int] | 定义重复的行为 | 1:重新开始 2:plays backward |
startOffset[long] | 动画执行之前的等待时间 | 毫秒为单位 |
四、alpha 渐变透明度动画效果(范围在0.0和1.0之间,分别代表透明和完全不透明)
android:fromAlpha="1.0" | 代表起始alpha值 | 浮点值,范围在0.0和1.0之间 |
android:toAlpha="0.0" | 代表结尾alpha值 | 浮点值,范围也在0.0和1.0之间。 |
android:duration="500" | 动画持续时间 | 毫秒为单位 |
五、scale 渐变尺寸伸缩动画效果(浮点值,比如1.0代表自身无变化,0.5代表起始时缩小一倍,2.0代表放大一倍)
android:fromXScale | 起始的X方向上相对自身的缩放比例 | 浮点值,范围在0.0和1.0之间 |
android:toXScale | 结尾的X方向上相对自身的缩放比例 | |
android:fromYScale | 起始的Y方向上相对自身的缩放比例 | |
android:toYScale | 结尾的Y方向上相对自身的缩放比例 | |
android:pivotX | 缩放的中轴点X坐标 | 如果想表示中轴点为图像的中心, |
android:pivotY | 缩放的中轴点Y坐标 | 可以把两个属性值定义成0.5或者50%。 |
android:pivotX属性代表旋转中心的X坐标值,android:pivotY属性代表旋转中心的Y坐标值,
这两个属性也有三种表示方式,
数字方式代表相对于自身左边缘的像素值,(绝对位置定位)Ainmation.ABSOLUTE
num%方式代表相对于自身左边缘或顶边缘的百分比,(相对于控件本身定位)Ainmation.RELATIVE_TO_SELF
num%p方式代表相对于父容器的左边缘或顶边缘的百分比。(相对于父控件) Ainmation.RELATIVE_TO_PARENF
六、translate 画面转换位置移动动画效果(代表一个水平、垂直的位移)
android:fromXDelta | 起始X方向的位置 | 浮点数、num%、num%p |
android:toXDelta | 结尾X方向上的位置 | |
android:fromYScale | 起始Y方向上的位置 | |
android:toYDelta | 结尾Y方向上的位置 | |
以上四个属性都支持三种表示方式:浮点数、num%、num%p
数字方式代表相对于自身左边缘的像素值,(绝对位置定位)
num%方式代表相对于自身左边缘或顶边缘的百分比,(相对于控件本身定位)100%表示移动自己的1倍距离
num%p方式代表相对于父容器的左边缘或顶边缘的百分比。(相对于父控件)
七、rotate 画面转移旋转动画效果
android:fromDegrees | 代表起始角度 | 浮点值,单位:度 |
android:toDegrees | 代表结尾角度 | 浮点值,单位:度 |
android:pivotX | 旋转中心的X坐标 | |
android:pivotY | 表旋转中心的Y坐标值 | |
我们通过一个例子感受一下,代码的讲解都写在注释里了
下面是res/layout/activity_main.xml 布局文件:
<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" tools:context="com.example.text.MainActivity$PlaceholderFragment" > <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src=http://www.mamicode.com/"@drawable/ic_launcher">
下面是MainActivity.java主界面文件:public class MainActivity extends Activity implements OnClickListener { private Button translate; private Button alpha; private Button rotate; private Button scale; private ImageView image; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); image = (ImageView) findViewById(R.id.image); translate = (Button) findViewById(R.id.translate); alpha = (Button) findViewById(R.id.alpha); rotate = (Button) findViewById(R.id.rotate); scale = (Button) findViewById(R.id.scale); translate.setOnClickListener(this); alpha.setOnClickListener(this); rotate.setOnClickListener(this); scale.setOnClickListener(this); } @Override public void onClick(View v) { // 创建一个AnimationSet对象 AnimationSet animationSet = new AnimationSet(true); switch (v.getId()) { case R.id.alpha: // 创建一个AlphaAnimation对象 AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0); // 设置动画执行的时间(单位:毫秒) alphaAnimation.setDuration(1000); // 将AlphaAnimation对象添加到AnimationSet当中 animationSet.addAnimation(alphaAnimation); // 使用ImageView的startAnimation方法开始执行动画 image.startAnimation(animationSet); break; case R.id.translate: TranslateAnimation translateAnimation = new TranslateAnimation( Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 1.0f); translateAnimation.setDuration(1000); animationSet.addAnimation(translateAnimation); image.startAnimation(animationSet); break; case R.id.rotate: RotateAnimation rotateAnimation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_PARENT, 1f, Animation.RELATIVE_TO_PARENT, 0f); rotateAnimation.setDuration(5000); animationSet.addAnimation(rotateAnimation); image.startAnimation(animationSet); break; case R.id.scale: ScaleAnimation scaleAnimation = new ScaleAnimation(1, 0.1f, 1, 0.1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); animationSet.addAnimation(scaleAnimation); animationSet.setStartOffset(1000); animationSet.setDuration(2000); image.startAnimation(animationSet); break; } } }
下面是运行结果:
本讲到这里,谢谢大家!
第二十六讲:Android之Animation