初识android中的动画动画效果可以大大提高界面的交互效果,因此,动画在移动开发中的应用场景较为普遍。掌握基本的动画效果在成熟的软件开发中不可或缺。除此之外,用户对于动画的接受程度远高于文字和图片,利用动画效果可以加深用户对于产品的印象。因此本文给出安卓设计中几种常见的动画效果。基础知识在介绍安卓中的动画效果之前,有必要介绍一下安卓中的图片处理机制。图片的特效包括图形的缩放、镜面、倒影、旋转、平移等。图片的特效处理方式是将原图的图形矩阵乘以一个特效矩阵,形成一个新的图形矩阵来实现的。矩阵Matrix类,维护了一个3*3的矩阵去更改像素点的坐标。Android手机的屏幕坐标系以左上角为原点,从左向右为x轴正方向,从上到下为y轴正方向。第一行表示像素点的x坐标:x=1*x+0*y+0*z,第二行表示像素点的y坐标:y=0*x+1*y+0*z,第三行表示像素点的z坐标:z=0*x+0*y+1*z。图片的特效处理正是通过更改图形矩阵的值来实现的,在android下Matrix这个类帮我们封装了矩阵的一些基本用法,所以我们可以直接使用即可。用代码编辑图片,最好处理都是图片在内存中的拷贝,不去处理原图,因此需要用Bitmap创建一个与原图大小一致,格式相同的空白位图。对照片进行操作的基本步骤:1.创建一个空白的bitmap,宽高信息和原图保存一致;2.创建一个画板;3.创建一个画笔;4.设置matrix矩阵;5.对照着原图在画纸上面画出一模一样的样子出来。下面分别给出对图片缩放、平移、旋转、镜面操作的代码。复制代码/***图片缩放**/privatevoidzoom(){BitmapsrcBitmap=BitmapFactory.decodeFile(mnt/sdcard/b.jpg);iv_src.setImageBitmap(srcBitmap);BitmapcopyBitmap=Bitmap.createBitmap(srcBitmap.getWidth(),srcBitmap.getHeight(),srcBitmap.getConfig());Canvascanvas=newCanvas(copyBitmap);Paintpaint=newPaint();paint.setColor(Color.BLACK);Matrixmatrix=newMatrix();matrix.setScale(0.6f,0.6f);canvas.drawBitmap(srcBitmap,matrix,paint);iv_dest.setImageBitmap(copyBitmap);}/***图片平移**/publicvoidtranslation(){Optionsops=newOptions();ops.inSampleSize=4;//等比放缩BitmapsrcBitmap=BitmapFactory.decodeFile(/mnt/sdcard/b.jpg,ops);iv_src.setImageBitmap(srcBitmap);BitmapcopyBitmap=Bitmap.createBitmap(srcBitmap.getWidth(),srcBitmap.getHeight(),srcBitmap.getConfig());Canvascanvas=newCanvas(copyBitmap);Paintpaint=newPaint();paint.setColor(Color.BLACK);Matrixmatrix=newMatrix();matrix.setTranslate(100,100);canvas.drawBitmap(srcBitmap,matrix,paint);iv_dest.setImageBitmap(copyBitmap);}/***旋转**/publicvoidscole(){BitmapsrcBitmap=BitmapFactory.decodeFile(/mnt/sdcard/b.jpg);iv_src.setImageBitmap(srcBitmap);BitmapcopyBitmap=Bitmap.createBitmap(srcBitmap.getWidth(),srcBitmap.getHeight(),srcBitmap.getConfig());Canvascanvas=newCanvas(copyBitmap);Paintpaint=newPaint();paint.setColor(Color.BLACK);Matrixmatrix=newMatrix();matrix.setRotate(180,srcBitmap.getWidth()/2,srcBitmap.getHeight()/2);//绕原点旋转canvas.drawBitmap(srcBitmap,matrix,paint);iv_dest.setImageBitmap(copyBitmap);}/***镜面特效/倒影特效*原理一样,一个关于x轴旋转,一个关于y轴旋转*/publicvoidmirror(){BitmapsrcBitmap=BitmapFactory.decodeFile(/mnt/sdcard/b.jpg);iv_src.setImageBitmap(srcBitmap);BitmapcopyBitmap=Bitmap.createBitmap(srcBitmap.getWidth(),srcBitmap.getHeight(),srcBitmap.getConfig());Canvascanvas=newCanvas(copyBitmap);Paintpaint=newPaint();paint.setColor(Color.BLACK);Matrixmatrix=newMatrix();matrix.setScale(-1,1);matrix.postTranslate(srcBitmap.getWidth(),0);canvas.drawBitmap(srcBitmap,matrix,paint);iv_dest.setImageBitmap(copyBitmap);}复制代码接下来进入进入今天的主题。安卓下的动画分为三种:帧动画、View动画(补间动画)、属性动画。下面分别介绍这三种动画。帧动画:帧动画是这三种动画中最为普遍的一种,指的是一帧一帧播放的动画。更直白的讲就是快速切换图片的效果。通过animation-list来实现,创建一个Drawable序列,这些Drawable可以按照指定的时间间隔一个一个的显示,也就是顺序播放事先做好的图像。帧动画使用的基本步骤:1.创建帧动画每帧需要的图片,放到对应的drawable-xxx或drawable目录中2.在drawable目录下,创建帧动画xml文件,根节点选择animation-list。oneshot属性表示帧动画的自动执行。如果为true,表示动画只播放一次停止在最后一帧上,如果设置为false表示动画循环播放。3.在JAVA代码中开启动画。设置为View的Background或者ImageView的src,然后获取到控件的AnimationDrawable对象,通过AnimationDrawable.start()方法启动动画下面以火箭的发射为例演示帧动画。xml文件中的代码:?xmlversion=1.0encoding=utf-8?animation-listxmlns:android=:drawable=@drawable/desktop_rocket_launch_1android:duration=200/itemandroid:drawable=@drawable/desktop_rocket_launch_2android:duration=200//animation-listJava代码的实现:iv=newImageView(this);//开启帧动画rocket为上述xml文件iv.setBackgroundResource(R.drawable.rocket);AnimationDrawablead=(AnimationDrawable)iv.getBackground();ad.start();属性动画:Android3.0之后view类增加新的用来记录动画行为的属性,只能运行的Android3.0以上的系统也就是说运行在API-11以上的系统。属性动画会改变当前的视图所在的位置,通过动态改变控件的宽、高、坐标等属性而产生的动画效果。通过控制控件的属性实现动画效果,属性动画比补间动画要更灵活、强大的多。需要注意的是属性动画内部其实并没有区分位移、缩放、透明、旋转等动画,其核心思想只是修改一个控件的属性,我们可以通过修改不同的属性来实现补间动画的4种效果而已。属性动画跟补间动画比,属性动画是真正改变了控件的属性,会改变当前的视图所在的位置,因此当控件的位置改变后只要点击到了控件“身上”就能触发onClick事件。而补间动画则并没用改变控件的真实属性,因此不管属性动画执行后将控件移动到了哪个位置,只能通过点击该控件的原始位置才能触发onClick事件。通过xml文件实现属性动画步骤:1.在res下创建属性动画文件。在res目录下创建animator文件夹,然后创建一个objectAnimator资源文件。资源名称自定义即可。2.编写属性动画文件。指定属性值。3.编写代码使用属性动画文件。通过AnimatorInflater加载图片资源,指定要显示动画的控件,并开启动画。属性动画可以通过xml文件实现,但通常属性动画是通过JAVA代码实现。这里仅给出用xml文件实现淡化动画的案例,其他案例均以JAVA代码的方式实现。JAVA代码的方式实现属性动画。复制代码publicclassMainActivityextendsActivity{privateImageViewiv;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);iv=(ImageView)findViewById(R.id.iv);}/***淡化动画*@paramview*/publicvoidalpha(Viewview){ObjectAnimatoroa=ObjectAnimator.ofFloat(iv,alpha,newfloat[]{0.0f,0.2f,0.4f,0.6f,0.8f,1.0f});oa.setDuration(3000);oa.setRepeatCount(ObjectAnimator.INFINITE);oa.setRepeatMode(ObjectAnimator.REVERSE);oa.start();}/***平移动画*@paramview*/publicvoidtrans(Viewview){ObjectAnimatoroa=ObjectAnimator.ofFloat(iv,translationX,newfloat[]{10f,20f,30f,40f,60f,80f});oa.setDuration(3000);oa.setRepeatCount(ObjectAnimator.INFINITE);oa.setRepeatMode(ObjectAnimator.REVERSE);oa.start();}/***缩放动画*/publicvoidscale(Viewview){ObjectAnimatoroa=ObjectAnimator.ofFloat(iv,scaleX,n