下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

全面讲解Android 动画之View动画

作者:课课家教育     来源: http://www.kokojia.com点击数:991发布时间: 2017-05-25 14:09:18

标签: Androidjava操作系统

     欢迎各位小伙伴观看本篇文章,本篇文章主要讲的是Android 动画之View动画他们的优点和缺点,还有一些使用,有需要的小伙伴,可以参考一下。文章内容有一些细节内容,还望各位小伙伴认真的阅读哦!

简介

  Android动画主要有三种类型:View动画、帧动画和属性动画。其中,帧动画也是View动画的一种,它通过顺序播放一系列图像而产生动画效果,只不过它和一般的平移、旋转等View动画在表现形式上略有不同。而属性动画是API11的新特性,在Android3.0以下版本的手机中无法使用。下面主要介绍View动画。

  View动画是一种作用于View对象的动画,它支持4种动画效果,分别为平移(translate)、旋转(rotate)、缩放(scale)和透明度(alpha)。这四种动画分别对应于Android中的TranslateAnimation、RotateAnimation、ScaleAnimation和AlphaAnimation这四个类。这几种动画均可以通过XML格式定义或通过java代码动态创建。

  实现原理

  每次绘制视图时,View所在的ViewGroup中的drawChild函数会获取该view的Animation的Transformation值,然后调用canvas.concat(transformToApply.getMatrix())函数,通过内部的矩阵运算完成动画帧。如果动画没有完成,就继续调用invalidate()函数,启动下次绘制来驱动动画,从而完成整个动画的绘制。由此可见,View动画其实是一个矩阵运算的过程。

  Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由AndyRubin开发,主要支持手机。2005年8月由Google收购注资。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache开源许可证的授权方式,发布了Android的源代码。第一部Android智能手机发布于2008年10月。Android逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机等。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。2013年的第四季度,Android平台手机的全球市场份额已经达到78.1%。[1]2013年09月24日谷歌开发的操作系统Android在迎来了5岁生日,全世界采用这款系统的设备数量已经达到10亿台。

  优缺点

  优势:使用简单,兼容性好

  缺陷:

  不具备交互性,View动画作用的实际上是View的影像,而非真正改变了View的属性状态。也就是说,View动画结束后,即便使用setFillAfter(true)使得view保持在动画结束时的位置,view的真实位置依旧未发生变化,仍然处于最开始定义时的位置。因此,当view动画结束后,其响应位置仍然位于动画开始前的位置,这就使得其不具备交互性;

  View动画只能作用于View对象,且提供的动画种类有限;

  View动画的使用

  通过Java代码动态创建动画

  步骤:

  创建TranslateAnimation、RotateAnimation、ScaleAnimation或AlphaAnimation对象;

  设置创建的动画对象的属性,如动画执行时间、延迟时间、起始位置、结束位置等;

  通过View.startAnimation()方法开启动画;

  注:可以通过Animation.setAnimationListener()设置动画的监听器,监听动画的开始、结束和重复状态,并在必要的时候添加自己的操作;

  示例:

  平移动画:

  TranslateAnimationtranslate=newTranslateAnimation(0,120,0,100);

  translate.setFillAfter(true);

  translate.setDuration(1000);

  image.startAnimation(translate);

  旋转动画:

  finalRotateAnimationrotate1=newRotateAnimation(0,360);//围绕自己的左上角向右旋转360度

  finalRotateAnimationrotate2=newRotateAnimation(0,90,Animation.RELATIVE_TO_PARENT,0.5f,

  Animation.RELATIVE_TO_SELF,0.5f);//X轴坐标向右偏移0.5倍父控件宽度,Y轴坐标向下偏移0.5倍自身宽度,然后围绕该点向右旋转90度

  rotate1.setDuration(1000);//设置动画时长

  //设置动画事件监听器

  rotate1.setAnimationListener(newAnimation.AnimationListener(){

  @Override

  publicvoidonAnimationStart(Animationanimation){

  Toast.makeText(mContext,"Startrotate",Toast.LENGTH_SHORT).show();

  }

  @Override

  publicvoidonAnimationEnd(Animationanimation){

  Toast.makeText(mContext,"Endrotate",Toast.LENGTH_SHORT).show();

  rotate2.setDuration(1000);

  image.startAnimation(rotate2);

  }

  @Override

  publicvoidonAnimationRepeat(Animationanimation){

  Toast.makeText(mContext,"Repeatrotate",Toast.LENGTH_SHORT).show();

  }});

  image.startAnimation(mAnimation);//开始动画

  缩放动画:

  ScaleAnimationscale=newScaleAnimation(1,1.5f,1,1.5f,Animation.RELATIVE_TO_PARENT,0.5f,

  Animation.RELATIVE_TO_SELF,0.5f);

  scale.setFillAfter(true);

  scale.setDuration(1000);

  image.startAnimation(scale);

  透明度动画:

  AlphaAnimationalpha=newAlphaAnimation(1,0);

  alpha.setDuration(1000);

  alpha.setRepeatMode(Animation.REVERSE);//设置重复模式

  alpha.setRepeatCount(5);//设置重复次数

  image.startAnimation(alpha);

  动画集:

  AnimationSetas=newAnimationSet(true);//动画集共享插值器

  as.setDuration(3000);AlphaAnimationaa=newAlphaAnimation(0.1);

  aa.setDuration(1000);

  as.addAnimation(aa);

  TranslateAnimationta=newTranslateAnimation(0,100,0,100);

  ta.setDuration(1000);

  as.addAnimation(ta);

  image.startAnimation(as);

  属性解析:

  动画的原点默认为控件自身的左上角,向右为X轴正向,向下为Y轴正向

全面讲解Android 动画之View动画_Android_java_操作系统_课课家教育

  动画坐标系

  动画常见共有属性:

  setInterpolator(Interpolatori):设置动画插值器(后面解释),即设置动画的加速模式,默认为线性插值器(匀速变化),还可以设置为AccelerateDecelerateInterpolator、AccelerateInterpolator等,或者自定义

  setFillAfter(booleanfillAfter):动画结束后是否保持在结束状态,true表示保持在结束时的状态,false表示返回开始前的状态

  setFillBefore(booleanfillBefore):true表示动画结束时,画面停留在第一帧

  setDuration(longdurationMillis):动画持续时长,单位:毫秒

  setRepeatCount(intrepeatCount):动画重复次数,-1表示无限循环

  setRepeatMode(intrepeatMode):动画重复模式,为RESTART或REVERSE

  setStartTime(longstartTimeMillis):动画开始时间,以毫秒表示

  setStartOffset(longstartOffset):动画延迟时长,即延迟startOffset毫秒开始动画,当startOffset>0时,动画开始时间为startTimeMillis+startOffset

  setZAdjustment(intzAdjustment):动画过程中Z轴方向的模式,默认为normal

setStartOffset(longstartOffset):动画延迟时长,即延迟startOffset毫秒开始动画,当startOffset>0时,动画开始时间为startTimeMillis+startOffset

  平移动画属性:

  publicTranslateAnimation(Contextcontext,AttributeSetattrs);

  publicTranslateAnimation(floatfromXDelta,floattoXDelta,floatfromYDelta,

  floattoYDelta);

  publicTranslateAnimation(intfromXType,floatfromXValue,inttoXType,

  floattoXValue,intfromYType,floatfromYValue,inttoYType,floattoYValue);

  如上为TranslateAnimation的三个构造方法,最终均为了设置第三个构造方法中的几个参数所对应的TranslateAnimation属性值,所以下面分别介绍这些属性的含义。

  fromXType和fromXValue:这俩属性分别表示平移起点X轴方向的偏移类型和偏移量,fromXType有三种取值可选,分别为Animation.ABSOLUTE、Animation.RELATIVE_TO_SELF和Animation.RELATIVE_TO_PARENT;

  fromXType取值为Animation.ABSOLUTE时,表示X轴方向的平移起点绝对平移fromXValue个像素点,此时fromXValue为一个绝对像素值;

  fromXType取值为Animation.RELATIVE_TO_SELF时,表示X轴方向的平移起点相对自身平移fromXValue*控件宽度个像素点,此时fromXValue为一个百分比值,表示偏移量相对控件自身宽度的百分比;

  fromXType取值为Animation.RELATIVE_TO_SELF时,表示X轴方向的平移起点相对父控件平移fromXValue*父控件宽度个像素点,此时fromXValue为一个百分比值,表示偏移量相对父控件宽度的百分比;

  fromYType和fromYValue:分别表示平移起点Y轴方向的偏移类型和偏移量,具体含义同fromXType和fromXValue;

  toXType和toXValue、toYType和toYValue:则表示终点位置的偏移量,具体含义同起点偏移量;

toXType和toXValue、toYType和toYValue:则表示终点位置的偏移量,具体含义同起点偏移量

  旋转动画属性:

  publicRotateAnimation(Contextcontext,AttributeSetattrs)

  publicRotateAnimation(floatfromDegrees,floattoDegrees)

  publicRotateAnimation(floatfromDegrees,floattoDegrees,floatpivotX,floatpivotY)

  publicRotateAnimation(floatfromDegrees,floattoDegrees,intpivotXType,floatpivotXValue,

  intpivotYType,floatpivotYValue)

  如上为RotateAnimation的四个构造方法,其目的均为了设置fromDegrees、toDegrees、pivotXType、pivotXValue、pivotYType、pivotYValue这几个属性值,下面对这几个属性分别进行介绍。

  fromDegrees和toDegrees:这两个属性分别表示旋转起始角度和终止角度;

  pivotXType、pivotXValue、pivotYType、pivotYValue:这四个属性用于设置旋转中心点位置。

  pivotXType和pivotXValue分别表示旋转中心在X轴方向相对原点(即控件左上角)的偏移类型和偏移量,pivotXType有三个可选取值:Animation.ABSOLUTE、Animation.RELATIVE_TO_SELF和Animation.RELATIVE_TO_PARENT,分别表示绝对偏移、相对自身偏移和相对父控件偏移,当取Animation.ABSOLUTE时,pivotXValue是一个绝对数值,否则pivotXValue是一个相对数值(取值为1表示100%)。

  使用UIView类实现动画

  基本写法,代码必须放在Begin和Commit之间:

  [UIViewbeginAnimations:nilcontext:nil];//开始动画

  //Code...

  [UIViewcommitAnimations];//提交动画

  简单例子:

  [UIViewbeginAnimations:nilcontext:nil];//开始动画

  [UIViewsetAnimationDuration:10.0];//动画时长

  /**

  *图像向下移动

  */

  CGPointpoint=_imageView.center;

  point.y+=150;

  [_imageViewsetCenter:point];

  [UIViewcommitAnimations];//提交动画

  同时运行多个动画效果:

  [UIViewbeginAnimations:nilcontext:nil];

  [UIViewsetAnimationDuration:3.0];

  [_imageViewsetAlpha:0.0];

  [UIViewcommitAnimations];

  [UIViewbeginAnimations:nilcontext:nil];

  [UIViewsetAnimationDuration:3.0];

  CGPointpoint=_imageView.center;

  point.y+=150;

  [_imageViewsetCenter:point];

  [UIViewcommitAnimations];

  以上代码实现的动画效果为(同时执行):

  1、图像向下平移150像像

  2、设置图像透明度为0。

  指定上下文:

  CGContextRefcontext=UIGraphicsGetCurrentContext();

  [UIViewbeginAnimations:nilcontext:context];

  [UIViewsetAnimationDuration:2.0];

  [_imageViewsetAlpha:0];

  [UIViewcommitAnimations];

  UIGraphicsGetCurrentContext():获取当前视图的上下文

  pivotYType和pivotYValue:分别表示旋转中心在Y轴方向相对原点的偏移类型和偏移量,具体含义同pivotXType和pivotXValue。

  示例使用如下:

  finalRotateAnimationrotate2=newRotateAnimation(0,90,Animation.RELATIVE_TO_PARENT,0.5f,

  Animation.RELATIVE_TO_SELF,0.5f);

  //X轴坐标向右偏移0.5倍父控件宽度,Y轴坐标向下偏移0.5倍自身宽度,然后围绕该点向右旋转90度

  缩放动画属性:

  publicScaleAnimation(Contextcontext,AttributeSetattrs)

  publicScaleAnimation(floatfromX,floattoX,floatfromY,floattoY)

  publicScaleAnimation(floatfromX,floattoX,floatfromY,floattoY,

  floatpivotX,floatpivotY)

  publicScaleAnimation(floatfromX,floattoX,floatfromY,floattoY,

  intpivotXType,floatpivotXValue,intpivotYType,floatpivotYValue)

  如上为ScaleAnimation的四个构造函数,最终均为了设置ScaleAnimation的如下几个属性:

  fromX、toX、fromY、toY、pivotXType、pivotXValue、pivotYType和pivotYValue。

  fromX和toX:这两个属性分别表示水平方向上相对自身的起始缩放因子和终止缩放因子,1表示100%,即原始大小,因此水平方向缩放的总长度为(toX-fromX)*width

  fromY和toY:这两个属性分别表示垂直方向上相对自身的起始缩放因子和终止缩放因子

  pivotXType、pivotXValue、pivotYType和pivotYValue:这四个属性用于控制缩放中心坐标点位置。具体含义参见旋转动画属性说明部分。

  示例使用如下:

  ScaleAnimationscale=newScaleAnimation(1,1.5f,1,1.5f,Animation.RELATIVE_TO_PARENT,0.5f,

  Animation.RELATIVE_TO_SELF,0.5f);

  //表示以X坐标向右偏移0.5倍父控件宽度,Y坐标向下偏移0.5倍自身高度的点为缩放中心点

  //将控件的水平和垂直方向分别从当前宽高放大0.5倍

  透明度动画属性:

  publicAlphaAnimation(Contextcontext,AttributeSetattrs)

  publicAlphaAnimation(floatfromAlpha,floattoAlpha)

  如上为AlphaAnimation的两个构造方法,主要看第二个构造方法中的两个属性fromAlpha和toAlpha,这两个属性分别表示动画开始时的透明度和结束时的透明度,0.0表示完全透明,即不可见,1.0表示完全不透明。

  示例使用如下:

  AlphaAnimationalpha=newAlphaAnimation(1,0);

  //表示将控件从不透明状态调整到完全透明状态

  动画集(AnimationSet)属性:

  动画集用于将一组一起播放的动画组合为一个动画。动画集从父类Animation中继承的一些属性的作用方式需要认真加以理解,因为不同属性的表现方式各异,有些属性只作用于动画集自身,有些属性会作用于动画集中的子动画,而有些属性又会被忽略。

  duration,repeatMode,fillBefore,fillAfter:当为AnimationSet设置了这几个属性的时候,这几个属性将会作用于该动画集中的所有子动画中

  repeatCount,fillEnabled:这两个属性在AnimationSet中不起作用,将会被忽略;

  startOffset,shareInterpolator:这两个属性将作用于AnimationSet自身

     结束语:看完文章的小伙伴,应该明白Android 动画之View动画的区别和优缺点了吧!如果还想了解更多关于这方面的知识内容,随时可以登陆课课家教育平台浏览哦!来到这里你一定会有不少的收获。

赞(21)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程