欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android动画之view动画

程序员文章站 2022-03-16 19:17:58
...

Android中的动画分为三种:View动画帧动画属性动画

View动画

一、概述:

View动画的作用对象是View

支持四种效果:平移(translate)、缩放(scale)、旋转(rotate)、透明(alpha)
 
分别对应这四个类:translateAnimation、scaleAnimation、rotateAnimation、alphaAnimation

二、使用

两种形式:XML和代码

1、xml

首先在res目录下创建anim目录	 
其次在anim目录下创建XML动画文件,如test_anim.xml
	 
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
            android:fromXDelta="-100%"
            android:toXDelta="0"
            android:duration="@android:integer/config_shortAnimTime">
</translate>

 然后将动画效果应用到view中
	 
Button button = (Button) findViewById(R.id.test);
		
Animation translate = AnimationUtils.loadAnimation(this,R.anim.test_anim);

button.startAnimation(translate);

2、 代码

AlphaAnimation alpha = new AlphaAnimation(0,1);
        
alpha.setDuration(1000);

button.startAnimation(alpha);

3、监听

通过setAnimationListener的方法来监听view的动画,接口如下:
public static interface AnimationListener(){
		     void onAnimationStart(Animation animation);
			 void onAnimationEnd(Animation animation);
			 void onAnimationRepeat(Animation animation);
}

4、属性

<1> translate
		
	android:fromXDelta   表示X的起始值,比如0;
			 
	android:toXDelta     表示X的结束值,比如100;
			 
	android:fromYDelta   表示Y的起始值,比如0;
			 
	android:toYDelta     表示Y的结束值,比如100;
		
<2> scale

    android:fromXScale   表示水平方向缩放的起始值;
			 
	android:toXScale     表示水平方向缩放的结束值;
			 
	android:fromYScale   表示垂直方向缩放的起始值;
			 
	android:toYScale     表示垂直方向缩放的结束值;

    android:pivotX       缩放的轴点x的坐标;	
             
    android:pivoty       缩放的轴点y的坐标;

<3> rotate

    android:fromDegress   表示旋转开始的角度,比如0;
			 
	android:toDegress     表示旋转结束的角度,比如180;

    android:pivotX       旋转的轴点x的坐标;	
             
    android:pivoty       旋转的轴点y的坐标;	

<4> alpha

    android:fromAlpha   表示透明度起始值,比如0;
			 
	android:toAlpha     表示透明度结束值,比如1;	

除了上面介绍的值以外,还有一些同有的

    android:interpolator  设置插值器,默认@android:anim/accelerate_decelerate_interpolator加速减速插值器
            
    android:duration       动画持续时间

    android:fillAfter      动画结束以后是否停留在结束位置,true停留,false不停留

5、set

可以使用set标签实现多个动画同时作用于view

三、自定义View动画

除了系统提供的四种View动画以外,还可以自定义View动画。

自定义View只需继承Animation抽象类,重写initialize和applyTransformation方法

在initialize中做一些初始化工作,applyTransformation中进行相应的矩阵变换。

public class Rotate3dAnimation extends Animation {
         
         public Rotate3dAnimation(){}

         @Override
         public void initialize(int width, int height, int parentWidth, int parentHeight) {
             super.initialize(width, height, parentWidth, parentHeight);
             //做一些初始化工作        
         }

         @Override
         protected void applyTransformation(float interpolatedTime, Transformation t) {
             super.applyTransformation(interpolatedTime, t);
             //获取矩阵对象
             Matrix matrix = t.getMatrix();
             //do something...
         }
}

四、view动画的特殊使用场景

1、 LayoutAnimation

LayoutAnimation作用于ViewGroup,为ViewGroup指定一个动画,这样它的子元素出场时

都会具有这种动画效果。经常被用在ListView中。有两种形式:xml和代码。

xml通常需要以下几步。
		 
<1> 在res/anim/目录定义LayoutAnimation,比如test_layout_animation.xml
			
	 <layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"	
					android:delay="0.5"
					android:animationOrder="normal"
					android:animation="@anim/test_anim_item"/>
					
      android:delay 表示子元素的延迟时间。比如动画时间周期是300ms,则0.5表示每个子元素都需要延迟150ms才能播放入场动画。总体来说就是,第一个元素延迟150ms,第二个延迟300ms,一次类推
							 
      android:animationOrder 表示子元素的顺序,有三个选项:normal(顺序)、reverse(逆向)、random(随机)
				
	  android:animation 为子元素指定具体的入场动画
				
<2> 为子元素指定具体的入场动画。在res/anim/目录定义Animation,比如test_anim_item.xml
			
	<set xmlns:android="http://schemas.android.com/apk/res/android"
				    android:duration="300"
					android:interpolator="@android:anim/accelerate_interpolator">
                    <alpha
					     android:fromAlpha="0"
						 android:toAlpha="1" />
                    
                    <translate
					     android:fromXDelta="500"
						 android:toXDelta="0">
     </set>

<3> 为ViewGroup指定android:layoutAnimation属性,

     <ListView
			android:id="@+id/test_listView"
			android:layout_width="match_parent"
			android:layout_height="match_parent"
			android:layoutAnimation="@anim/test_layout_animation" />   

						
代码(LayoutAnimationController)
				     
		ListView listView = (ListView) findViewById(R.id.test_listView);
		//加载子元素的具体动画(这一步也可以使用代码实现)
        Animation animation = AnimationUtils.loadAnimation(this,R.anim.test_anim_item);					
	    LayoutAnimationController controller = new LayoutAnimationController(animation);
		controller.setDelay(0.5);
		controller.setOrder(LayoutAnimation.ORDER_NORMAL);
		listView.setLayoutAnimation(controller);

2、Activity切换动画效果

Activity有默认的切换效果,但也可以自定义,主要是用到overridePendingTranslation(int enterAnim, int exitAnim)方法。 这个方法必须在startActivity(intent)或finish()之后调用才能生效。

enterAnim -- Activity被打开时,所需的动画资源id;
		
exitAnim  -- Activity被暂停时,所需的动画资源id;