zoukankan      html  css  js  c++  java
  • 【Android UI设计和开发】动画(Animation)详细说明(一)

    Android开发之动画效果浅析


     请尊重他人的劳动成果。转载请注明出处:Android开发之动画效果浅析 

    程序执行效果图:


    Android动画主要包括补间动画(TweenView Animation、帧动画(FrameDrawable Animation、以及属性动画Property Animation。以下依次介绍一下各个动画。


    1.   补间动画(Tween


    Tween动画,通过对View的内容进行一系列的图形变换(包含平移、缩放、旋转、改变透明度)来实现动画效果。动画效果的定义能够採用XML来做也能够採用编码来做。Tween动画有4种类型:

    动画的类型

    Xml定义动画使用的配置节点

    编码定义动画使用的类

    渐变透明度动画效果

    <alpha/>

    AlphaAnimation

    渐变尺寸缩放动画效果

    <scale/>

    ScaleAnimation

    画面位置移动动画效果

    <translate/>

    TranslateAnimation

    画面旋转动画效果

    <rotate/>

    RotateAnimation

     

    我们能够为每个动画设置动画插入器,Android自带的几种动画插入器:

     

    AccelerateInterpolator

    加速,開始时慢中间加速

    DecelerateInterpolator

    减速,開始时快然后减速

    AccelerateDecelerateInterolator

    先加速后减速,開始结束时慢,中间加速

    AnticipateInterpolator

    反向,先向相反方向改变一段再加速播放

    AnticipateOvershootInterpolator

    反向加超越,先向相反方向改变,再加速播放,会超出目的值然后缓慢移动至目的值

    BounceInterpolator

    跳跃,快到目的值时值会跳跃,如目的值100。后面的值可能依次为8577708090100

    CycleIinterpolator

    循环,动画循环一定次数。值的改变为一正弦函数:Math.sin(2* mCycles* Math.PI* input)

    LinearInterpolator

    线性,线性均匀改变

    OvershottInterpolator

    超越,最后超出目的值然后缓慢改变到目的值

     

    1.1预备知识:

    抽象类Animation是一个实现androidUI界面动画效果的APIAnimation是补间动画的基类。它的直接子类AlphaAnimation, RotateAnimation, ScaleAnimation, TranslateAnimation,AnimationSet,提供了一系列的动画效果,能够进行淡入淡出、旋转、缩放、动画集等,这些效果能够应用在绝大多数的控件中。 

     

    1.2AlphaAnimation实现淡入淡出的动画效果

    //方式一通过代码的方式定义透明度动画

    AnimationalphaAnimation=new AlphaAnimation(1, (float) 0.1);

    alphaAnimation.setDuration(3000);//设置动画持续时间为3

    alphaAnimation.setFillAfter(true);//设置动画结束后保持当前的位置(即不返回到动画開始前的位置)

    imgShow.startAnimation(alphaAnimation);

     

    //方式二通过在xml中定义透明度动画

    第一步:定义xml动画文件:alpha.xml

    <?xmlversion="1.0"encoding="utf-8"?>

    <alphaxmlns:android="http://schemas.android.com/apk/res/android"

       android:fromAlpha="1.0"

       android:toAlpha="0.1"

       android:duration="3000"

       android:fillAfter="true"

       android:repeatCount="2"></alpha>

    第二步:载入xml动画文件并将其设置到指定的View

    AnimationalphaAnimation2=AnimationUtils.loadAnimation(this, R.anim.alpha);//载入Xml文件里的动画

    imgShow.startAnimation(alphaAnimation2);

    程序执行效果图:


     

     

    1.3.RotateAnimation实现旋转的动画效果

    主要属性及说明:

     

    repeatCount 反复次数

    fromDegrees为动画起始时物件的角度:

    当角度为负数——表示逆时针旋转

    当角度为正数——表示顺时针旋转

    (负数fromDegrees——toDegrees正数:顺时针旋转)

    (负数fromDegrees——toDegrees负数:逆时针旋转)

    (正数fromDegrees——toDegrees正数:顺时针旋转)

    (正数fromDegrees——toDegrees负数:逆时针旋转)

    toDegrees属性为动画结束时物件旋转的角度能够大于360

    pivotX,pivotY  为动画相对于物件的XY坐标的開始位.说明:以上两个属性值0%-100%中取值,50%为物件的XY方向坐标上的中点位置。

     

    实例:

    //方式一通过代码的方式定义旋转动画

    AnimationrotateAnimation=new RotateAnimation(0, 45);

    rotateAnimation.setDuration(3000);//设置动画持续时间为3

    rotateAnimation.setFillAfter(true);//设置动画结束后保持当前的位置(即不返回到动画開始前的位置)

    imgShow.startAnimation(rotateAnimation); 

     

    //方式二通过在xml中定义旋转动画

    第一步:定义xml动画文件:rotate.xml

    <?xmlversion="1.0"encoding="utf-8"?>

    <rotatexmlns:android="http://schemas.android.com/apk/res/android"

       android:fromDegrees="0"

       android:toDegrees="45"

       android:duration="300"

       android:fillAfter="true"></rotate>

     

    第二步:载入xml动画文件并将其设置到指定的View

    Animation rotateAnimation2=AnimationUtils.loadAnimation(this, R.anim.rotate);//载入Xml文件里的动画

    imgShow.startAnimation(rotateAnimation2);

    程序执行效果图:


     


    1.4.ScaleAnimation实现缩放动画效果


    主要属性及说明:

    fromXScale(浮点型)属性为动画起始时X坐标上的缩放尺寸

    fromYScale(浮点型)属性为动画起始时Y坐标上的缩放尺寸

    toXScale(浮点型)  属性为动画结束时X坐标上的缩放尺寸

    toYScale(浮点型)  属性为动画结束时Y坐标上的缩放尺寸

    说明: 以上四种属性值

    0.0表示收缩到没有

    1.0表示正常无缩放

    值小于1.0表示收缩

    值大于1.0表示放大

    pivotX(浮点型)    属性为动画相对于物件的X坐标的開始位置

    pivotY(浮点型)    属性为动画相对于物件的Y坐标的開始位置

    说明:

    以上两个属性值0%-100%中取值

    50%为物件的XY方向坐标上的中点位置

    duration(长整型)属性为动画持续时间。说明:  时间以毫秒为单位

    fillAfter(布尔型)属性当设置为true,该动画转化在动画结束后被应用

    实例:

    //方式一通过代码的方式定义缩放动画

    AnimationscaleAnimation=new ScaleAnimation(0.5f, 1.0f,1.0f, 1.0f);

    scaleAnimation.setDuration(2000);//设置动画持续时间为3

    scaleAnimation.setFillAfter(true);//设置动画结束后保持当前的位置(即不返回到动画開始前的位置)

    scaleAnimation.setRepeatCount(3);

    imgShow.startAnimation(scaleAnimation);  

     

    //方式二通过在xml中定义缩放动画

    第一步:定义xml动画文件:scale.xml

    <?xmlversion="1.0"encoding="utf-8"?>

    <scalexmlns:android="http://schemas.android.com/apk/res/android"

       android:fromXScale="0.5"

       android:toXScale="1.0"

       android:fromYScale="1.0"

       android:toYScale="1.0"

       android:duration="3000"

       android:fillAfter="true"></scale>

     

     

    第二步:载入xml动画文件并将其设置到指定的View

    AnimationscaleAnimation2=AnimationUtils.loadAnimation(this, R.anim.scale);//载入Xml文件里的动画imgShow.startAnimation(scaleAnimation2);

    程序执行效果图:



    1.5. TranslateAnimation实现位移动画效果

    //方式一通过代码的方式定义位移动画

    AnimationtranslateAnimation=new TranslateAnimation(0, 100, 0, 0);

    translateAnimation.setDuration(3000);//设置动画持续时间为3

    translateAnimation.setInterpolator(this, android.R.anim.cycle_interpolator);//设置动画插入器

    translateAnimation.setFillAfter(true);//设置动画结束后保持当前的位置(即不返回到动画開始前的位置)

    imgShow.startAnimation(translateAnimation);  

     

    //方式二通过在xml中定义位移动画

    第一步:定义xml动画文件:translate.xml

    <?

    xmlversion="1.0"encoding="utf-8"?>

    <translate xmlns:android="http://schemas.android.com/apk/res/android"

       android:fromXDelta="0"

       android:toXDelta="260"

       android:fromYDelta="0"

       android:toYDelta="600"

       android:duration="3600"

       android:fillAfter="true"

       android:interpolator="@android:anim/accelerate_decelerate_interpolator">

    </translate>

     

    第二步:载入xml动画文件并将其设置到指定的View

    AnimationtranslateAnimation2=AnimationUtils.loadAnimation(this, R.anim.translate);//载入Xml文件里的动画

    imgShow.startAnimation(translateAnimation2); 

     

    程序执行效果图:



    1.6.AnimationSet实现多种动画混合效果

    定义动画集主要用到了AnimationSet类,该类能够加入多个补间动画啊。

    //方式一通过代码的方式定义动画集

    AnimationSetanimationSet=new AnimationSet(true);//定义一个动画集,并设定全部的动画使用一个动画插入其

    Animation translateAnimation2=AnimationUtils.loadAnimation(this, R.anim.translate);//载入Xml文件里的动画

    AnimationalphaAnimation2=AnimationUtils.loadAnimation(this, R.anim.alpha);//载入Xml文件里的动画

    Animation rotateAnimation2=AnimationUtils.loadAnimation(this, R.anim.rotate);//载入Xml文件里的动画

    Animation scaleAnimation2=AnimationUtils.loadAnimation(this, R.anim.scale);//载入Xml文件里的动画

    animationSet.addAnimation(translateAnimation2);

    animationSet.addAnimation(alphaAnimation2);

    animationSet.addAnimation(rotateAnimation2);

    animationSet.addAnimation(scaleAnimation2);

    animationSet.setInterpolator(this, android.R.anim.anticipate_interpolator);

    imgShow.startAnimation(animationSet);

    //方式二在xml文件里设置动画集合

    第一步:定义xml动画文件:animset.xml

    <?

    xmlversion="1.0"encoding="utf-8"?>

    <setxmlns:android="http://schemas.android.com/apk/res/android">   

       <alpha

          android:fromAlpha="1.0"

          android:toAlpha="0.1"

          android:duration="3000"

          android:fillAfter="true"

          android:repeatCount="2"></alpha>

       <rotate

          android:fromDegrees="0"

          android:toDegrees="45"

          android:duration="300"

          android:fillAfter="true"></rotate>

       <scale

          android:fromXScale="0.5"

          android:toXScale="1.0"

          android:fromYScale="1.0"

          android:toYScale="1.0"

          android:duration="3000"

          android:fillAfter="true"></scale>

       <translate 

          android:fromXDelta="0"

          android:toXDelta="260"

          android:fromYDelta="0"

          android:toYDelta="600"

          android:duration="3600"

          android:fillAfter="true"

          android:interpolator="@android:anim/accelerate_decelerate_interpolator">

       </translate>

    </set>

     

    第二步:载入xml动画文件并将其设置到指定的View

    AnimationSetanimationSet2=(AnimationSet) AnimationUtils.loadAnimation(this, R.anim.animset);

    程序执行效果图:



     

    提示:尽管能够通过代码的方式定义动画。可是Android官方还是建议在xml中定义动画效果。这样可做到最大程度上的解耦,方便项目的后期维护。

     

    2.   帧动画(Frame


    Frame动画,即顺序播放事先做好的图像。跟放胶片电影类似。

    开发步骤:

    1)把准备好的图片放进项目res/ drawable下。

    2)在项目的drawable目录以下定义动画XML文件,文件名能够自己定义。当然也能够採用编码方式定义动画效果(使用AnimationDrawable类)。

    3)为View控件绑定动画效果。

    调用代表动画的AnimationDrawablestart()方法開始动画。

    实例:

    framelist.xml

    <?

    xmlversion="1.0"encoding="utf-8"?

    >

    <animation-listxmlns:android="http://schemas.android.com/apk/res/android"

         android:oneshot="false">

       <itemandroid:drawable="@drawable/zzlx1"android:duration="200"/>

       <itemandroid:drawable="@drawable/zzlx2"android:duration="200"/>

       <itemandroid:drawable="@drawable/zzlx3"android:duration="200"/>

       <itemandroid:drawable="@drawable/zzlx4"android:duration="200"/>

       <itemandroid:drawable="@drawable/zzlx5"android:duration="200"/>

       <itemandroid:drawable="@drawable/zzlx6"android:duration="200"/>

       <itemandroid:drawable="@drawable/zzlx7"android:duration="200"/>

       <itemandroid:drawable="@drawable/zzlx8"android:duration="200"/>

    </animation-list>

    代码分析:

    上面的XML就定义了一个Frame动画,其包括8帧动画,8帧动画中分别应用了drawable中的8张图片:zzlx1zzlx2zzlx3....。每帧动画持续200毫秒。

    android:oneshot属性假设为true。表示动画仅仅播放一次停止在最后一帧上,假设设置为false表示动画循环播放。

    Xml中定义好帧动画之后就能够将其设置到View上了。请看以下代码:

    //第一步将animation-list设置为ImageView的背景

    imgShow.setBackgroundResource(R.drawable.framelist);

    //第二步获取ImagView的背景并将其转换成AnimationDrawable

    AnimationDrawableanimationDrawable=(AnimationDrawable)imgShow.getBackground();      

    //第三步開始播放动画

    animationDrawable.start();       

     

    提示:

    有一点须要强调的是:启动Frame动画的代码animationDrawable.start();不能应用在OnCreate()方法中,由于在OnCreate()AnimationDrawable还没有全然的与ImageView绑定。在OnCreate()中启动动画,仅仅能看到第一张图片。这里在触摸事件中实现的

    程序执行效果图:



    3.   属性动画(Property Animation)

    使用属性动画注意事项:

    1). object必需要提供setXxx方法,假设动画的时候没有传递初始值,那么还要提供getXxx方法。由于系统要去拿xxx属性的初始值(假设这条不满足,程序直接Crash

     

    2). objectsetXxx对属性xxx所做的改变必须可以通过某种方法反映出来,比方会带来ui的改变啥的(假设这条不满足。动画无效果但不会Crash 

     以上条件缺一不可。

    3).相应没有getXxxsetXxx方法或有getXxxsetXxx方法但和getXxxsetXxx方法设置的属性不是我们想要的效果如,我们对Buttonwidth属性做动画没有效果?这是由于Button内部尽管提供了getWidthsetWidth方法。可是这个setWidth方法并非改变视图的大小。它是TextView新加入的方法。View是没有这个setWidth方法的。由于Button继承了TextView。所以Button也就有了setWidth方法.getWidth的确是获取View的宽度的,而setWidthTextView和其子类的专属方法,它的作用不是设置View的宽度,而是设置TextView的最大宽度和最小宽度的。这个和TextView的宽度不是一个东西,详细来说,TextView的宽度相应Xml中的android :layout_width属性。而TextView另一个属性android :width。这个android:width属性就相应了TextViewsetWidth方法。

    这里给出一种解决方法及使用包装类:用一个类来包装原始对象。间接为其提供getset方法例如以下:

    /**

     *包装类用于封装Viewwithheight,

     *你能够通过getXxx以及setXxx方法设置View的宽和高

     *@author jph

     */

    class WrapView{

       private Viewview;

       privateintwidth;

       privateintheight;     

       public WrapView(View view){

          this.view=view;

       }     

       publicint getWidth() {

          returnview.getLayoutParams().width;

       }

       publicvoid setWidth(int width) {

          this.width = width;

          view.getLayoutParams().width=width;//改动View的高度

          view.requestLayout();//刷新View的布局

       }

       publicint getHeight() {

          returnview.getLayoutParams().height;

       }

       publicvoid setHeight(int height) {

          this.height=height;

          view.getLayoutParams().height = height;

          view.requestLayout();

       }            

    }

     

    实例:

     

    package com.jph.anim;
    
    import android.animation.ObjectAnimator;
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.ImageView;
    
    /**
     * 属性动画实例
     * @author jph
     *
     */
    public class PropertyActivity extends Activity {
    	private ImageView imgShow;
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.property);
    		imgShow=(ImageView)findViewById(R.id.imgShow);		
    	}
    	public void play(View view) {
    		switch (view.getId()) {
    		case R.id.btnStart:
    			ObjectAnimator animator=ObjectAnimator.ofInt(new WrapView(imgShow),
    					"width", 10);
    			animator.setDuration(2000);//设置动画持续的时间
    			animator.setRepeatCount(2);//设置动画反复的次数	
    			animator.start();//开启动画
    		default:
    			break;
    		}
    	}
    	/**
    	 * 包装类用于封装View的with、height,
    	 * 你能够通过getXxx以及setXxx方法设置View的宽和高
    	 * @author jph
    	 */
    	class WrapView{
    		private View view;
    		private int width;
    		private int height;		
    		public WrapView(View view){
    			this.view=view;
    		}		
    		public int getWidth() {
    			return view.getLayoutParams().width;
    		}
    		public void setWidth(int width) {
    			this.width = width;
    			view.getLayoutParams().width=width;//改动View的高度
    			view.requestLayout();//刷新View的布局
    		}
    		public int getHeight() {
    			return view.getLayoutParams().height;
    		}
    		public void setHeight(int height) {
    			this.height=height;
    			view.getLayoutParams().height = height;
    			view.requestLayout();
    		}				
    	}
    }
    

    程序执行效果图:


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    探讨SQL Server并发处理存在就更新七种解决方案
    集合随机打乱
    订单并发5000的排队机制
    10款面向HTML5 画布(Canvas)的JavaScript库
    抽象类和接口的区别以及使用场景(记)
    常用的正则表达式
    webview加载url出现空白页面,有些页面没问题
    SQL常用语句
    Android Studio 简单介绍和使用问题小结
    Android中获取应用程序(包)的信息-----PackageManager的使用(一)
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4841249.html
Copyright © 2011-2022 走看看