android anim 动画详细介绍.doc_第1页
android anim 动画详细介绍.doc_第2页
android anim 动画详细介绍.doc_第3页
android anim 动画详细介绍.doc_第4页
android anim 动画详细介绍.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android动画及图片的缩放和旋转 Android动画有2种,一种是Tween Animation,另一种是Frame Animation,先说说Tween动画吧。Tween动画是对视图对象中的内容进行一系列简单的转换,比如位置的移动,大小的缩放,旋转,透明度得变化等等。Tween动画可以写到一个xml文件中,就像定义布局文件一样,当然,也可以写到android代码中,不过推荐写到xml文件中,因为它具备的阅读性,可重用性大大超过了硬编码。xml文件放在工程的res/anim目录中,这个目录中要包含一个根元素,可以是,或者,当然,这些元素都可以放到一个动画集合中,默认情况下,所有的动画指令都是同时发生的,为了让他们按顺序发生,需要设置一个特殊的属性startOffset。下面定义了一个动画的集合:1 2 4 13 14 15 25 33 34 这里解释一下这段代码的作用:首先是一个动画的集合set,在这个set中有一个属性shareInterpolater,如果设置为true,则这个集合下面所有的子元素都享有同样的interpolater,api上面是这样说的:android:shareInterpolator Boolean. true if you want to share the same interpolator among all child elements. 紧跟在这个集合后面的是一个缩放动画,里面有一些个属性,下面一一介绍: android:interpolator属性:这是值定一个动画的插入器,有一些常用的插入器:accelerate_decelerate_interpolator加速-减速动画插入器,顾名思义,就是先加速后减速,accelerate_interpolator加速动画插入器,decelerate_interpolator减速动画插入器 android:fromXScale属性为动画起始时,x坐标上的伸缩尺寸 android:toXScal属性为动画结束时,x坐标上的伸缩尺寸 android:fromYScale属性为动画起始时,y坐标上的伸缩尺寸 android:toYScale属性为动画结束时,y坐标上的伸缩尺寸 关于伸缩尺寸这里还要罗嗦一下: 也就是上面的四个属性的值:0.0表示收缩到没有,1.0表示正常无收缩,值小于1.0表示收缩,值大于1.0表示放大。 android:fillAfter属性当设置为true时,该动画转化在动画结束后被应用,同理还有android:fillBefore属性,当设置为true时,该动画转化在动画开始前被应用 android:duration属性表示动画持续的时间,单为时毫秒 android:pivotX属性为动画相对于x坐标的起始位置 android:pivotY属性为动画相对于y坐标的起始位置 这2个属性有不同的格式表示,如值为50,表示是相对于父类的50%,如值为50%,表示是相对于自己的50% 这里的50%表示相对于自身x,y坐标上的中点位置 紧跟着是一个动画集合,里面有缩放和旋转,这个集合的interpolater为减速动画插入器 这里的缩放里面还有一个属性,android:startOffset属性是设置动画开始的时间,这里设置700是表示700毫秒之后开始,也就是第一个缩放完成之后开始。 旋转里面的属性跟scale里面的都差不多,只是旋转讲究的角度。 android:fromDegrees属性表示动画起始时的角度 android:toDegrees属性表示动画结束时旋转的角度,可以大于360度 动画文件写好了之后,我们就可以在代码中调用这个动画了,先写一个布局文件,布局文件里面有一个ImageView,然后我们让这个ImageView做动画。 布局文件如下: 1 2 6 11 然后我们让这个图片按照我们xml中指定的动画运动: 代码: package com.test.shang;import android.app.Activity;import android.graphics.drawable.AnimationDrawable;import android.graphics.drawable.TransitionDrawable;import android.os.Bundle;import android.view.MotionEvent;import android.view.animation.Animation;import android.view.animation.AnimationSet;import android.view.animation.AnimationUtils;import android.widget.ImageView;public class TestStyle extends Activity AnimationDrawable animationDrawable;Overrideprotected void onCreate (Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.test);ImageView iv = (ImageView) findViewById(R.id.imageView1);Animation animation = (AnimationSet) AnimationUtils.loadAnimation(this, R.anim.anim_set);iv.setAnimation(animation);animation.start();因为这里是动画,不好截图,所以我就不截图了,具体效果大家可以试试看。 下面接着说说Frame Animation吧:也就是帧动画,可以使用AndroidDrawable来负责帧动画,同样它可以在xml文件中很方便的列出所有的帧,按照周期去执行每帧动画,下面是一个定义帧动画的例子: 1 2 4 5 6 7 这里定义了帧的名字和每帧的持续时间. 这里有3帧,通过设置android:oneshot属性为true,它将会在最后一帧停下来,如果设置为false,它将会循环播放,可以把它添加到一个背景中,让他播放,具体代码如下: 布局文件: 1 2 6 10 在代码里面设置imageview的背景图片,然后做动画: 1 package com.test.shang;2 3 import android.app.Activity;4 import android.graphics.drawable.AnimationDrawable;5 import android.graphics.drawable.TransitionDrawable;6 import android.os.Bundle;7 import android.view.MotionEvent;8 import android.view.animation.Animation;9 import android.view.animation.AnimationSet;10 import android.view.animation.AnimationUtils;11 import android.widget.ImageView;12 13 public class TestStyle extends Activity 14 AnimationDrawable animationDrawable;15 16 Override17 protected void onCreate (Bundle savedInstanceState) 18 super.onCreate(savedInstanceState);19 setContentView(R.layout.test);20 ImageView iv = (ImageView) findViewById(R.id.imageView1);21 iv.setBackgroundResource(R.anim.anim_list);22 animationDrawable = (AnimationDrawable) iv.getBackground();23 24 Override25 public boolean onTouchEvent (MotionEvent event) 26 if(event.getAction() = MotionEvent.ACTION_DOWN) 27 animationDrawable.start();28 return true;29 30 return super.onTouchEvent(event);31 32 这里需要注意的是:AnimationDrawable在调用OnCreate的过程中不能调用start(),这是因为AnimationDrawable不能在不完全的窗口上运行,需要一个操作来触发,如果你想立即播放动画,没有必要的交互,你可以在onWindowFocusChanged()方法中调用它,这样它将会成为窗口焦点。 下面说说图片的缩放和旋转: 这里我就写的比较简单了,代码里面的注释很详细,可以慢慢看。 1 package com.test.shang;2 3 import android.app.Activity;4 import android.graphics.Bitmap;5 import android.graphics.BitmapFactory;6 import android.graphics.Matrix;7 import android.graphics.drawable.BitmapDrawable;8 import android.os.Bundle;9 import android.widget.ImageView;10 import android.widget.ImageView.ScaleType;11 import android.widget.LinearLayout;12 import android.widget.LinearLayout.LayoutParams;13 14 public class BitmapTest extends Activity 15 16 Override17 protected void onCreate (Bundle savedInstanceState) 18 super.onCreate(savedInstanceState);19 setTitle(测试图片的缩放和旋转);20 LinearLayout layout = new LinearLayout(this);21 22 /加载需要操作的图片,这里是机器猫的图片23 Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(), R.drawable.duola);24 25 /获取这个图片的宽和高26 int width = bitmapOrg.getWidth();27 int height = bitmapOrg.getHeight();28 29 /定义预转换成的图片的宽和高30 int newWidth = 200;31 int newHight = 200;32 33 /计算缩放率,新尺寸除原尺寸34 float scaleWidth = (float)newWidth/width;35 float scaleHeight = (float)newHight/height;36 37 /创建操作图片用的matrix对象38 Matrix matrix = new Matrix();39 40 /缩放图片动作41 matrix.postScale(scaleWidth, scaleHeight);42 43 /旋转图片动作44 matrix.postRotate(45);45 46 /创建新的图片47 Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, width, height, matrix, true);48 49 /将上面创建的Bitmap转换成Drawable对象,使得其可以使用在imageView,imageButton上。50 BitmapDrawable bitmapDrawable = new BitmapDrawable(resizedBitmap);51 52 /创建一个ImageView53 ImageView iv = new ImageView(this);54 55 /将imageView的图片设置为上面转换的图片56 iv.setImageDrawable(bitmapDrawable);57 58 /将图片居中显示59 iv.setScaleType(ScaleType.CENTER);60 61 /将imageView添加到布局模板中62 layout.addView(iv, new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);63 64 /设置为本activity的模板65 setContentView(layout);66 67 下面是效果预览: 好了,今天就到这里吧。本文主要研究Android中的三种动画,第一种是单个View的各种动画效果,第二种是两个Activity切换时的动画效果,第三种是类似于Gif的Frame By Frame动画效果,其中View的各种动画包括在xml文件中定义和代码中定义两种方式。一、动画基本类型:如下表所示,Android的动画由四种类型组成,即可在xml中定义,也可在代码中定义,如下所示: XMLCODE 渐变透明度动画效果alphaAlphaAnimation 渐变尺寸伸缩动画效果scaleScaleAnimation 画面转换位置移动动画效果translateTranslateAnimation 画面转移旋转动画效果rotateRotateAnimation二、如何在XML文件中定义动画1.alpha 2.scale 3.translate4.rotate三、如何使用XML中定义的动画 public static Animation loadAnimation (Contextcontext, int id)/第一个参数Context为程序的上下文 /第二个参数id为动画XML文件的引用/例子:myAnimation=AnimationUtils.loadAnimation(this,R.anim.my_action);/使用AnimationUtils类的静态方法loadAnimation()来加载XML中的动画XML文件四、如何在java代码中定义动画1代码:/在代码中定义 动画实例对象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);2. 分析: 1.1 AlphaAnimation第一步:AlphaAnimation类对象定义 private AlphaAnimation myAnimation_Alpha;第二步:AlphaAnimation类对象构造AlphaAnimation(float fromAlpha, float toAlpha) /第一个参数fromAlpha为 动画开始时候透明度/第二个参数toAlpha为 动画结束时候透明度myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f);/说明: / 0.0表示完全透明/ 1.0表示完全不透明第三步:设置动画持续时间 myAnimation_Alpha.setDuration(5000);/设置时间持续时间为 5000毫秒1.2 ScaleAnimation第一步:ScaleAnimation类对象定义 private AlphaAnimation myAnimation_Scale;第二步:ScaleAnimation类对象构造ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)/第一个参数fromX为动画起始时 X坐标上的伸缩尺寸 /第二个参数toX为动画结束时 X坐标上的伸缩尺寸 /第三个参数fromY为动画起始时Y坐标上的伸缩尺寸 /第四个参数toY为动画结束时Y坐标上的伸缩尺寸/*说明: 以上四种属性值 0.0表示收缩到没有 1.0表示正常无伸缩 值小于1.0表示收缩 值大于1.0表示放大*/第五个参数pivotXType为动画在X轴相对于物件位置类型/第六个参数pivotXValue为动画相对于物件的X坐标的开始位置/第七个参数pivotXType为动画在Y轴相对于物件位置类型 /第八个参数pivotYValue为动画相对于物件的Y坐标的开始位置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_Scale.setDuration(700);/设置时间持续时间为 700毫秒1.3 TranslateAnimation第一步:TranslateAnimation类对象定义 private AlphaAnimation myAnimation_Translate;第二步:TranslateAnimation类对象构造 TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) /第一个参数fromXDelta为动画起始时 X坐标上的移动位置/第二个参数toXDelta为动画结束时 X坐标上的移动位置/第三个参数fromYDelta为动画起始时Y坐标上的移动位置/第四个参数toYDelta为动画结束时Y坐标上的移动位置 第三步:设置动画持续时间 mmyAnimation_Translate.setDuration(2000);1.4 RotateAnimation第一步:RotateAnimation类对象定义private AlphaAnimation myAnimation_Rotate;第二步:RotateAnimation类对象构造RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)/第一个参数fromDegrees为动画起始时的旋转角度/第二个参数toDegrees为动画旋转到的角度/第三个参数pivotXType为动画在X轴相对于物件位置类型/第四个参数pivotXValue为动画相对于物件的X坐标的开始位置/第五个参数pivotXType为动画在Y轴相对于物件位置类型/第六个参数pivotYValue为动画相对于物件的Y坐标的开始位置myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f, Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);第三步:设置动画持续时间myAnimation_Rotate.setDuration(3000);五、如何使用java代码中的动画效果使用从View父类继承过来的方法startAnimation()来为View或是子类View等等添加一个动画效果public void startAnimation (Animation animation) - Frame动画主要是通过AnimationDrawable类来实现的,它有start()和stop()两个重要的方法来启动和停止动画。Frame动画一般通过XML文件配置,在工程的res/anim目录下创建一个XML配置文件,该配置文件有一个根元素和若干个子元素。 实现一个人跳舞的Frame动画,6张图片如下所示:1、把这6张图片放到res/drawable目录下,分别取名为:p01.png,p02.png,p03.png,p04.png,p05.png,p06.png。2、在res/anim目录下创建一个XML配置文件,文件名为:dance.xml,文件内容: apk:oneshot指示是否只运行一次,设置为false则意味着循环播放。3、在res/layout目录下创建layout配置文件dance.xml,文件内容: apk:background使用上面的动画作为背景,意味着

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论