1---Android的动画animation
- 格式:docx
- 大小:29.22 KB
- 文档页数:1
android中提供了如下4种动画效果:1、AlphaAnimation 透明度动画效果2、ScaleAnimation 缩放动画效果3、TranslateAnimation 位移动画效果4、RotateAnimation 旋转动画效果今天主要讲解RotateAnimation 旋转动画效果的实现方法。
RotateAnimation 参数有:float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue分别是:float fromDegrees:旋转的开始角度。
float toDegrees:旋转的结束角度。
int pivotXType:X轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
float pivotXValue:X坐标的伸缩值。
int pivotYType:Y轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
float pivotYValue:Y坐标的伸缩值。
代码示例:public class MainActivity extends Activity {ImageView image;Button start;Button cancel;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);image = (ImageView) findViewById(R.id.main_img);start = (Button) findViewById(R.id.main_start);cancel = (Button) findViewById(R.id.main_cancel);/** 设置旋转动画 */final RotateAnimation animation =newRotateAnimation(0f,360f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);animation.setDuration(3000);//设置动画持续时间/** 常用方法 *///animation.setRepeatCount(int repeatCount);//设置重复次数//animation.setFillAfter(boolean);//动画执行完后是否停留在执行完的状态//animation.setStartOffset(long startOffset);//执行前的等待时间start.setOnClickListener(new OnClickListener() {public void onClick(View arg0) {image.setAnimation(animation);/** 开始动画 */animation.startNow();}});cancel.setOnClickListener(new OnClickListener() {public void onClick(View v) {/** 结束动画 */animation.cancel();}});}}更多android视频学习教程,请至麦子学院官网查看>>/course/2/。
AndroidAnimation之TranslateAnimation(平移动画)TranslateAnimation(平移动画)的意思⽆⾮就是⼀张图⽚或其他从⼀个位置到达另外⼀个位置。
直接代码分析,相关重要属性参数解释都在代码中。
1、⾸先编写main.xml⽂件。
<RelativeLayout xmlns:android="/apk/res/android"xmlns:tools="/tools" android:layout_width="match_parent"android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"><ImageViewandroid:id="@+id/image"android:text="@string/hello_world"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/car_one1"/></RelativeLayout>2、接下来编写MainActivity.java⽂件。
黑马程序员:Android 中的动画—帧动画Android 3.0以前,Android只支持两种动画模式,tween animation 和 frame animation,在Android 3.0 中又引入了一个新的动画系统:property animation。
Frame Animation(帧动画):创建一个Drawable 序列,这些 Drawable 可以按照指定的时间间隔,一个一个的显示,也就是顺序播放事先做好的图像。
Tween Animation(渐变动画也叫补间动画):通过对特定的对象做图像变换如平移、缩放、旋转、淡出/淡入等产生动画效果。
帧动画创建一个 Drawable 序列,这些 Drawable 可以按照指定的时间间隔一个一个的显示,也就是顺序播放事先准备好的图像,跟放胶片电影类似。
下面通过一个案例来演示帧动画的使用。
步骤:1.将准备好的图片资源放到 Android 工程的 res/drawable-hdpi 目录中。
2.在项目的 res 目录下创建文件夹 drawable,然后在文件夹下面定义动画 XML 文件,文件名称可以自定义(也可以使用 AnimationDrawable类,采用代码方式定义动画效果),这里给改xml 文件起名为frame_anim.xml,见文件 1-7。
【文件 1-7】frame_anim.xml1<?xml version="1.0"encoding="utf-8"?>2<animation-listxmlns:android="/apk/res/android"3android:oneshot="true">4<item android:drawable="@drawable/a1"android:duration="200"></item>5<item android:drawable="@drawable/a2"android:duration="200"></item> 6<!-----------------更多 item 不再展示--------------------->7</animation-list>3.打开创建好的 xml 文件,在里面添加根节点<animation-list>,可以在此根节点中设置属性” android:oneshot”来控制动画只播放一次,否则系统将默认持续播放。
Android中的动画(XML方式)实践(逐帧动画与补间动画)属性动画。
逐帧动画:基于单元格的动画,每一帧显示一个不同的drawable。
一帧一帧的顺序播放。
补间动画:补间动画应用于view,通过对其位置,大小,旋转和透明度的改变,让view动起来。
属性动画:属性动画几乎可以让应用程序中任何对象动起来。
所有补间动画的内容,都可以通过属性动画实现。
下面逐一介绍:注:这篇文章偏重于以xml方式实现相应动画效果。
逐帧动画逐帧动画(Frame-by-frame Animations)从字面上理解就是一帧一帧的播放图片,类似卡通动画。
目标:实现如下图效果:loading步骤:1.在res/drawable目录下新建loading_frame.xml文件:loading_frame.xml根节点是animation-list,内部由一到多个<item>节点组成oneshot属性表示是否只播放一次(true:一次;false:循环播放).item节点声明是一个动画帧,其中 android:drawable属性定义要显示的图像,android:druation代表此帧持续的时间,毫秒为单位。
注:在AndroidStudio中强制规定带animation-list节点xml文件必须放在res/drawable文件下(eclipse(ADT)貌似支持任意放res/drawable和res/anim)。
在androidStudio中若放在res/anim下会报错:错误提示:1错误提示:22.新建页面布局activity_frame.xml:如上图布局很简单上面一个imageview,下面两个button,都水平居中(相对于parent)。
3.新建FrameActivityframeActivity主要逻辑代码当然为了避免animationDrawable带来的内存泄露,建议在onDestroy方法中做如下操作:onDestroy注意:帧数比较多的动画不建议用逐帧动画实现,其一会显得卡顿,其二容易引起OOM。
Android属性动画框架ObjectAnimator、ValueAnimator,这⼀篇就够了前⾔我们都知道 Android ⾃带了 Roate Scale Translate Alpha 多种框架动画,我们可以通过她们实现丰富的动画效果,但是这些宽家动画却有⼀个致命的弱点,它们只是改变了 View 显⽰的⼤⼩,⽽没有改变 View 的响应区域。
这时以 ObjectAnimator、ValueAnimator 为代表的属性动画也就应运⽽⽣了。
简单效果⼯作原理属性动画字如其名,是通过改变 View 的属性值来改变控件的形态,说⽩了就是通过反射技术来获取控件的⼀些属性如宽度、⾼度等的 get 和 set ⽅法,从⽽实现所谓的动画效果。
所以,这就需要我们的 View (如⾃定义 View 中)具有 set 和 get ⽅法,如果没有则会导致程序的Clash 。
具体步骤1. ⾸先,系统通过 get ⽅法获得属性值2. 系统在时间插值器的作⽤下,更变属性值3. 系统调⽤ set ⽅法,将属性值重新赋予控件由此也可以看出:属性动画直接改变了控件的属性,所以动画结束后控件也就发⽣了永久性的变化。
使⽤ ObjectAnimator 实现四种动画这⾥我打算通过使⽤ ObjectAnimator 实现四⼤动画框架:1. alpha2. scaleX/scaleY3. translateX/translateY4. rotation给⼤家讲解下 ObjectAnimator 使⽤private void iniAnimation(){// 透明度动画ObjectAnimator.ofFloat(mAlphaImage, "alpha", 1, 0, 1).setDuration(4000).start();// 缩放final AnimatorSet animatorSet = new AnimatorSet();mScaleImage.setPivotX(mScaleImage.getWidth()+250);mScaleImage.setPivotY(mScaleImage.getHeight()+250);animatorSet.playTogether(ObjectAnimator.ofFloat(mScaleImage, "scaleX", 1, 0).setDuration(2000),ObjectAnimator.ofFloat(mScaleImage, "scaleY", 1, 0).setDuration(2000));animatorSet.start();// 平移 translationfinal AnimatorSet translationAnimatorSet = new AnimatorSet();translationAnimatorSet.playTogether(ObjectAnimator.ofFloat(mTranslationImage, "translationX", 20, 100).setDuration(2000),ObjectAnimator.ofFloat(mTranslationImage, "translationY", 20,100).setDuration(2000));translationAnimatorSet.start();// 利⽤ ObjectAnimator 实现旋转动画final AnimatorSet rotateAnimationSet = new AnimatorSet();rotateAnimationSet.playTogether(ObjectAnimator.ofFloat(mRotationImage, "rotation",0, 360).setDuration(2000));rotateAnimationSet.start();}以上代码就通过了 ObjectAnimator 实现了,四⼤效果,实现过程基本可以归纳为1. 创建 AnimatorSet 对象2. 设置,变化发⽣的轴⼼(部分需要)3. 设置所需要发⽣改变的动画(通常在 playTogether() ⽅法中)4. 开启动画最后的运⾏效果如开头动画所⽰同样的,我们可以在⼀个 playTogether ⽅法中添加多个动画,这样就能实现多动画组合的效果。
Android群英传笔记——第七章:Android动画机制和使用技巧一.Android View动画框架Animation动画框架定义了透明度,旋转,缩放个移动等几种动画,而且控制了整个的View,实现原理是每次绘制视图的时候View所在的ViewGroup中drawChild函数获取该View的Animation的Transformation值,然后调用了canvas.concat方法,通过矩阵运算完成动画帧,如果动画没有完成则继续调用invalidate()方法启动下回绘制来驱动动画,从而完成整个动画的绘制视图动画使用简单,效果丰富,它提供了AlphaAnimation,RotateAnimatio,TranslateAnimation,ScaleAnimation四种动画方式,并提供了Animationset动画集合,混合使用多种动画,在Android3.0之前,视图动画一家独大,但随着Android3.0之后属性动画框架的推出它的风光就大不如前了。
相比属性动画,视图动画的一个非常大的缺陷就是不具备交互性,当某个元件发生视图动画后,其响应事件的位置还依然在动画前的地方,所以视图动画只能做普通的显示效果,避免交互的发生,但是它的优点也非常明显,即效率比较高且使用方便。
视图动画使用非常简单, 不仅可以通过XML文件来描述一个动画过程,同样也可以使用代码来控制整个动画过程下面这个实例就列举了一些简单的视图动画使用方法1.透明动画为视图增加透明度的变换动画AlphaAnimation al = new AlphaAnimation(0,1);al.setDuration(2000);alpha.startAnimation(al);2.旋转动画RotateAnimation ro = new RotateAnimation(0,300,100,100);ro.setDuration(2000);rotate.setAnimation(ro);3.平移动画TranslateAnimation tr = new TranslateAnimation(0,200,0,300);tr.setDuration(2000);translate.setAnimation(tr);4.缩放动画ScaleAnimation sc = new ScaleAnimation(0,2,0,2);sc.setDuration(2000);scale.setAnimation(sc);5.动画集合AnimationSet setAnimation = new AnimationSet(true); setAnimation.setDuration(2000);AlphaAnimation als = new AlphaAnimation(0,1);als.setDuration(2000);setAnimation.addAnimation(als);RotateAnimation ros = new RotateAnimation(0,300,100,100);ros.setDuration(2000);setAnimation.addAnimation(ros);set.startAnimation(setAnimation);我们一起来运行一下看效果当然,有动画,就有监听,我们来监听一下动画,以透明动画为例AlphaAnimation al = new AlphaAnimation(0,1);al.setDuration(2000);alpha.startAnimation(al);al.setAnimationListener(new Animation.AnimationListener() {@Overridepublic void onAnimationStart(Animation animation) {Log.i("Animation","开始");}@Overridepublic void onAnimationEnd(Animation animation) {Log.i("Animation","结束");Toast.makeText(MainActivity.this,"动画结束",Toast.LENGTH_LONG).show();}@Overridepublic void onAnimationRepeat(Animation animation) {}});二.Android属性动画分析属性动画在Animator框架里的,用的最多的也就是AnimatorSet和ObjectAnimator配合,使用ObjectAnimator进行更精细化的控制,只控制一个对象的属性,而使用多个ObjectAnimator 组合到AnimatorSet形成一个动画,而且ObjectAnimator能够自动驱动,单证各种好处,我们来看一下1.ObjectAnimatorObjectAnimator是属性动画框架中最重要的实行类,创建一个ObjectAnimator只需通过他的静态工厂类直接返回一个ObjectAnimator对象,参数包括一个对象和对象的属性名字,但这个属性必须有get和对函数,内部会通过Java反射机制来调用set函数修改对象属性值.同样你也可以调用setIn设置相应的差值器。
Android属性动画之ValueAnimator代码详解属性动画通过改变⼀个对象的属性值来进⾏动画,属性动画包含了以下⼏个特性:1、持续时间(Duration)主要⽤来定义动画的持续时间,默认值为300ms。
2、时间插值器(Time interpolation)指定时间变化的百分⽐,就是当前流逝时间除以指定的持续时间,这个可以⾃定义,继承Interpolator,重写getInterpolation⽅法。
3、重复次数和⾏为(Repeat count and behavior)指定动画的执⾏次数和动画的重复模式4、动画集(Animator sets)可以把多个动画放到⼀个集合中,是他们同时执⾏,或者指定它们直接的顺序和延迟。
5、Frame refresh delay(帧刷新延迟)可以指定如何去刷新动画的帧,默认是每10ms刷新⼀次,这个刷新也取决于系统的繁忙程度。
上⾯我们知道属性动画就是改变对象的属性值来实现动画,ValueAnimator的特点就是你不需要明确的指定你要改变的对象和属性,你只需要得到⼀个动态的值来⾃⼰去设置相应对象的属性,也就是它就是提供属性的变化值,你拿到这个值可以动态的更改对象属性值。
总结⼀句就是监听动画过程,⾃⼰实现属性的改变。
举个例⼦:// 这⾥指定了值的变化范围ValueAnimator animator = ValueAnimator.ofFloat(0, 500);// 这⾥指定变化持续时间animator.setDuration(1000);//开始动画animator.start()//开始动画后,我们可以动态的获取变化值animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener(){@Overridepublic void onAnimationUpdate(ValueAnimator animation){//根据变化值来设置imageView对象的Y轴坐标,这样就实现了imageView的垂直移动imageView.setTranslationY((Float) animation.getAnimatedValue());}});上⾯使⽤imageView.setTranslationY((Float) animation.getAnimatedValue())来动态的改变图⽚的translationY属性,需要说明的是,如果在低版本中,我们使⽤的是NineOldAnimations这个库,⽤法跟系统基本⼀致,在NineOldAnimations⾥⾯我们动态改变对象的属性的时候,它提供了⼀个ViewHelper类,它是设置各种动画值的帮助类,可以简单的设置并应⽤动画值。
Android编程实现RotateAnimation设置中⼼点旋转动画效果本⽂实例讲述了Android编程实现RotateAnimation设置中⼼点旋转动画效果。
分享给⼤家供⼤家参考,具体如下:在xml设置:<?xml version="1.0" encoding="utf-8"?><rotate xmlns:android="/apk/res/android"android:duration="800" // 设置动画持续时间android:fromDegrees="0.0" // 设置动画开始时的⾓度android:interpolator="@android:anim/linear_interpolator"android:pivotX="50.0%" // 设置动画相对于控件的x坐标的位置android:pivotY="50.0%" // 设置动画相对于控件的y坐标的位置android:repeatCount="infinite" // 设置⽆线循环android:toDegrees="360.0" /> // 设置动画结束时的旋转⾓度在代码中设置,主要是x,y的坐标为中⼼点:public void rotateAnim() {Animation anim =new RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);anim.setFillAfter(true); // 设置保持动画最后的状态anim.setDuration(3000); // 设置动画时间anim.setInterpolator(new AccelerateInterpolator()); // 设置插⼊器imageview.startAnimation(anim);}Android 动画之Interpolator插⼊器,⽐较简单和常⽤的:(1)LinearInterpolator:动画从开始到结束,变化率是线性变化。
五种Animation的实例代码五种Animation的实例代码1、FrameAnimation,帧动画,就是不断的图片更替,实现动画的效果。
Java代码1packagecom.example.animation;2345importandroid.app.Activity;67importandroid.graphics.drawable.AnimationDrawable;89importandroid.os.Bundle;1011importandroid.view.View;1213importandroid.view.View.OnClickListener;1415importandroid.widget.Button;1617importandroid.widget.ImageV iew;1819importandroid.widget.TextView;20212223publicclassFrameAnimationActivityextendsActivity{2425Buttonm_btnStart;2627ImageViewm_imgAnimation;2829TextViewm_lblText;3031@Override3233protectedvoidonCreate(BundlesavedInstanceState){3435//TODOAuto-generatedmethodstub3637super.onCreate(savedInstanceState);3839setContentView(yout.frameanimaitonlayout);40414243m_btnStart=(Button)findView ById(com.example.R.id.frameanimation_btnStart);4445m_imgAnimation=(ImageView)findView ById(com.example.R.id.frameanimaiton_image View1);4647m_imgAnimation.setBackgroundResource(com.example.R.drawable.frame_animation); 4849m_btnStart.setOnClickListener(newOnClickListener(){50515253@Override5455publicvoidonClick(Viewv){5657//TODOAuto-generatedmethodstub5859AnimationDrawableframeAnimation=(AnimationDrawable)m_imgAnimation.getBackgr ound();60616263if(frameAnimation.isRunning()){6465frameAnimation.stop();6667}else{6869frameAnimation.stop();70717273frameAnimation.start();7475}7677}7879});80818283m_lblText=(TextView)findViewById(com.example.R.id.frameanimation_lblText);8485m_lblText.setTextColor(getResources().getColor(com.example.R.color.frameanimation_l blTextColor));86878889}9091}922、ScaleAnimaiton,伸缩动画,通过变化图片的比例实现动画效果XML/HTML代码93<?xmlversion="1.0"encoding="utf-8"?>9495<scalexmlns:android="/apk/res/android"9697android:interpolator="@android:anim/decelerate_interpolator"9899android:fromXScale="1"100101android:toXScale="0.4"102103android:fromYScale="1"104105android:toYScale="0.6"106107android:duration="200"108109android:repeatCount="200">110111112113</scale>114Java代码115packagecom.example.animation;116117118119importandroid.app.Activity;120121importandroid.os.Bundle;122123importandroid.view.animation.Animation;124125importandroid.view.animation.AnimationUtils;126127importandroid.view.animation.ScaleAnimation;128129importandroid.widget.ImageV iew;130131132133publicclassScaleAnimationActivityextendsActivity{134135ImageViewm_img;136137@Override138139protectedvoidonCreate(BundlesavedInstanceState){140141//TODOAuto-generatedmethodstub142143super.onCreate(savedInstanceState);144145setContentView(_example_animation_scale);146147148149m_img=(ImageV iew)findView ById(com.example.R.id.scaleanimation_imageView1); 150151152153154155//Animationanim=newScaleAnimation(1f,0.4f,1f,0.3f);156157//anim.setDuration(2000);158159//anim.setRepeatCount(100);160161//m_img.setAnimation(anim);162163//anim.start();164165166167Animationanim=AnimationUtils.loadAnimation(getApplicationContext(),com.example.R .anim.scale);168169m_img.startAnimation(anim);170171}172173}1743、RotateAnimation,旋转动画,通过变化图片的角度实现动画效果Java代码175packagecom.example.animation;176177178179importandroid.app.Activity;180181importandroid.os.Bundle;182183importandroid.view.animation.Animation;184185importandroid.view.animation.RotateAnimation;186187importandroid.view.animation.ScaleAnimation;188189importandroid.widget.ImageV iew;190191192193publicclassRotateAnimationActivityextendsActivity{194195ImageViewm_image;196197198199@Override200201protectedvoidonCreate(BundlesavedInstanceState){202203//TODOAuto-generatedmethodstub204205super.onCreate(savedInstanceState);206207setContentView(_example_animation_rotate);208209m_image=(ImageView)findViewById(_example_animation_rotate _imageView1);210211212213//Animationanim=newScaleAnimation(1,4,1,3);214215Animationanim=newRotateAnimation(12,184);216217anim.setDuration(2000);218219anim.setRepeatCount(-1);220221m_image.setAnimation(anim);222223anim.start();224225}226227}2284、TranslateAnimation,移动动画,通过变化图片的位置,也就是变化坐标,实现动画效果Java代码229packagecom.example.animation;230231232233importandroid.app.Activity;234235importandroid.os.Bundle;236237importandroid.view.animation.AlphaAnimation;238239importandroid.view.animation.Animation;240241importandroid.view.animation.TranslateAnimation;242243importandroid.widget.ImageV iew;244245246247publicclassTranslateAnimationActivityextendsActivity{248249@Override250251protectedvoidonCreate(BundlesavedInstanceState){252253//TODOAuto-generatedmethodstub254255super.onCreate(savedInstanceState);256257setContentView(_example_animation_translate);258259260261ImageViewimg=(ImageView)findViewById(_example_animation _translate_imageView1);262263264265Animationanim=newTranslateAnimation(10,230,10,240);266267anim.setDuration(2000);268269anim.setRepeatCount(-1);270271img.setAnimation(anim);272273anim.startNow();274275}276277}2785、AlphaAnimation,透明度动画,通过变化图片的透明度,实现动画效果Java代码279packagecom.example.animation;280281282283importandroid.app.Activity;284285importandroid.graphics.Interpolator;286287importandroid.os.Bundle;288289importandroid.view.animation.AlphaAnimation;290291importandroid.view.animation.Animation;292293importandroid.widget.ImageV iew;294295296297publicclassAlphaAnimationActivityextendsActivity{298299@Override300301protectedvoidonCreate(BundlesavedInstanceState){302303//TODOAuto-generatedmethodstub304305super.onCreate(savedInstanceState);306307setContentView(_example_animation_alpha);308309310311ImageViewimg=(ImageView)findViewById(_example_animation _alpha_imageView1);312313314315Animationanim=newAlphaAnimation(1,0);316317anim.setDuration(2000);318319anim.setRepeatCount(-1);320321anim.setInterpolator(getApplicationContext(),android.R.anim.accelerate_interpolator); 322323img.setAnimation(anim);324325anim.startNow();326 327} 328 329} 330。
八维教育-李军宜
Android动画模式
Animation主要有两种动画模式:
补间动画tween animation:开发者只需要制定动画开始、动画结束的关键帧,而动画变化的中间帧由系统计算并补齐。
逐帧动画frame animation:开发者把动画过程的每张静态图片都收集起来,然后由android来控制依次显示这些静态图片,然后利用人眼的“视觉暂停”的原理,给用户造成动画的错觉。
(就与放电影的原理一样)
一种是tween animation(渐变动画或者补间动画)
XML中JavaCode
alpha渐变透明度动画效果AlphaAnimation渐变透明度动画效果
scale渐变尺寸伸缩动画效果ScaleAnimation渐变尺寸伸缩动画效果
translate画面转换位置移动动画效果TranslateAnimation 画面转换位置移动动画效果
rotate画面转移旋转动画效果RotateAnimation画面转移旋转动画效果
一种是frame by frame(帧动画)
translate画面转换位置移动动画效果TranslateAnimation 画面转换位置移动动画效果
rotate画面转移旋转动画效果RotateAnimation画面转移旋转动画效果
二:代码实现:
1:在XML中实现tween animation:
2:在javaCode中实现tween animation:3:在XML中实现frame animation:
4:在javaCode中实现frame animation:。