Android animation xml 配置说明


关于动画的实现,Android提供了Animation,在Android SDK介绍了2种Animation模式:


1. Tween Animation:通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果,即是一种渐变动画;


2. Frame Animation:顺序播放事先做好的图像,是一种画面转换动画。


动画类型
下面先来看看Android提供的动画类型。Android的animation由四种类型组成


在XML文件中:


alpha        渐变透明度动画效果
scale        渐变尺寸伸缩动画效果
translate  画面转换位置移动动画效果
rotate      画面转移旋转动画效果
在Java 源码中定义了相应的类,可以使用这些类的方法来获取和操作相应的属性:


AlphaAnimation渐变透明度动画效果
ScaleAnimation渐变尺寸伸缩动画效果
TranslateAnimation画面转换位置移动动画效果

RotateAnimation画面转移旋转动画效果



Tween Animation
一个tween动画将对视图对象中的内容进行一系列简单的转换(位置,大小,旋转,透明性)。如果你有一个文本视图对象,你可以移动它,旋转它,让它变大或让它变小,如果文字下面还有背景图像,背景图像也会随着文件进行转换。


使用XML来定义Tween Animation


        动画的XML文件在工程中res/anim目录,这个文件必须包含一个根元素,可以使<alpha><scale> <translate> <rotate>插值元素或者是把上面的元素都放入<set>元素组中,默认情况下,所以的动画指令都是同时发生的,为了让他们按序列发生,需要设置一个特殊的属性startOffset。动画的指令定义了你想要发生什么样的转换,当他们发生了,应该执行多长时间,转换可以是连续的也可以使同时的。例如,你让文本内容从左边移动到右边,然后旋转180度,或者在移动的过程中同时旋转,没个转换需要设置一些特殊的参数(开始和结束的大小尺寸的大小变化,开始和结束的旋转角度等等,也可以设置些基本的参数(例如,开始时间与周期),如果让几个转换同时发生,可以给它们设置相同的开始时间,如果按序列的话,计算开始时间加上其周期。



Tween Animation共同的节点属性











下面给出一个完整的XML定义(SDK提供)


<set android:shareInterpolator="false" xmlns:android="http://schemas.android.com/apk/res/android">
   <scale
          android:interpolator="@android:anim/accelerate_decelerate_interpolator"
          android:fromXScale="1.0"
          android:toXScale="1.4"
          android:fromYScale="1.0"
          android:toYScale="0.6"
          android:pivotX="50%"
          android:pivotY="50%"
          android:fillAfter="false"
          android:duration="700" />
   <set android:interpolator="@android:anim/decelerate_interpolator">
      <scale
             android:fromXScale="1.4" 
             android:toXScale="0.0"
             android:fromYScale="0.6"
             android:toYScale="0.0" 
             android:pivotX="50%" 
             android:pivotY="50%" 
             android:startOffset="700"
             android:duration="400" 
             android:fillBefore="false" />
      <rotate 
             android:fromDegrees="0" 
             android:toDegrees="-45"
             android:toYScale="0.0" 
             android:pivotX="50%" 
             android:pivotY="50%"
             android:startOffset="700"
             android:duration="400" />
   </set>
</set>
Tween Animation如何使用


使用AnimationUtils类的静态方法loadAnimation()来加载XML中的动画XML文件


//main.xml中的ImageView
ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage);
//加载动画
Animation hyperspaceJumpAnimation =AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
//使用ImageView显示动画
spaceshipImage.startAnimation(hyperspaceJumpAnimation);
如何在Java代码中定义动画


//在代码中定义 动画实例对象 


private Animation myAnimation_Alpha; 


private Animation myAnimation_Scale; 


private Animation myAnimation_Translate; 


private Animation myAnimation_Rotate; 


    //根据各自的构造方法来初始化一个实例对象 


myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f); 


myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f, 


             Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); 


myAnimation_Translate=new TranslateAnimation(30.0f, -80.0f, 30.0f, 300.0f); 


myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f,


 Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
interpolator的解释


interpolator定义一个动画的变化率(the rate of change)。这使得基本的动画效果(alpha, scale, translate, rotate)得以加速,减速,重复等。




Interpolator 定义了动画的变化速度,可以实现匀速、正加速、负加速、无规则变加速等。Interpolator 是基类,封装了所有 Interpolator 的共同方法,它只有一个方法,即 getInterpolation (float input),该方法 maps a point on the timeline to a multiplier to be applied to the transformations of an animation。Android 提供了几个 Interpolator 子类,实现了不同的速度曲线,如下:





Frame Animation
Frame Animation是顺序播放事先做好的图像,跟电影类似。不同于animation package, Android SDK提供了另外一个类AnimationDrawable来定义、使用Frame Animation。

Frame Animation可以在XML Resource定义(还是存放到res\anim文件夹下),也可以使用AnimationDrawable中的API定义。由于Tween Animation与Frame Animation有着很大的不同,因此XML定义的格式也完全不一样,其格式是:首先是animation-list根节点,animation-list根节点中包含多个item子节点,每个item节点定义一帧动画,当前帧的drawable资源和当前帧持续的时间。下面对节点的元素加以说明:





下面就给个具体的XML例子,来定义一帧一帧的动画:


<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true">
    <item android:drawable="@drawable/bubble1" android:duration="70" />
    <item android:drawable="@drawable/bubble2" android:duration="70" />
    <item android:drawable="@drawable/bubble3" android:duration="70" />
    <item android:drawable="@drawable/bubble4" android:duration="70" />
    <item android:drawable="@drawable/bubble5" android:duration="70" />
   
</animation-list>

说明:不清楚为什么不不能直接建立<animation-list>节点,我直接手敲的。

上面的XML就定义了一个Frame Animation,其包含5帧动画,5帧动画中分别应用了drawable中的5张图片:bubble1,bubble2,bubble3,bubble4,bubble5每帧动画持续70毫秒。
然后我们将以上XML保存在res/anim/文件夹下,命名为bubble.xml,显示动画的代码:

public class MainActivity extends Activity {

	private LinearLayout mainLayout;
	private BubbleView bubbleview;
	private AnimationDrawable anidrawable;
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		//设置没有标题
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		//设置充满手机屏幕
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);
		
		setContentView(R.layout.mainlayout);
		
		mainLayout=(LinearLayout) findViewById(R.id.mainlinearlayout);
		initBubbleAndAnidResource();
		mainLayout.setOnTouchListener(new LayoutTouchListener());
	}
	
	
	//初始bubbleview的背景资源以及animationdrawable的动画资源
	public void initBubbleAndAnidResource(){
		bubbleview=new BubbleView(MainActivity.this);
		bubbleview.setVisibility(View.INVISIBLE);
		bubbleview.setBackgroundResource(R.anim.bubble);
		anidrawable=(AnimationDrawable) bubbleview.getBackground();
		mainLayout.setBackgroundResource(R.drawable.bg);
		mainLayout.addView(bubbleview);
	}
	
	
	//这个类处理发生器气泡的位置
	class BubbleView extends ImageView{

		public BubbleView(Context context) {
			super(context);
		}
		
		//这个方法是处理气泡的位置
		//类似于画矩形,只用知道两个点即可。
		public void setLocation(int left,int top){
			this.setFrame(left, top, left+40, top+40);
		}	
	}
	
	//触摸屏幕事件监听器
	private class LayoutTouchListener implements OnTouchListener {

		@Override
		public boolean onTouch(View v, MotionEvent event) {
			
			bubbleview.setVisibility(View.INVISIBLE);
			anidrawable.stop();
			float x=event.getX();
			float y=event.getY();
			bubbleview.setLocation((int)(x-20), (int)(y-20));
			bubbleview.setVisibility(View.VISIBLE);
			anidrawable.start();
			
			return false;
		}

	}
}

代码运行的结果:5张图片按照顺序的播放一次.
有一点需要强调的是:启动Frame Animation动画的代码rocketAnimation.start();不能在OnCreate()中,因为在OnCreate()中AnimationDrawable还没有完全的与ImageView绑定,在OnCreate()中启动动画,就只能看到第一张图片。这里实在拖曳事件中实现的。
下面,阅读Android SDK中对AnimationDrawable的介绍,有个简单的了解:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值