Android动画之补间动画(二)

来源:互联网 发布:互联网十云计算概念股 编辑:程序博客网 时间:2024/06/05 07:58

一 前言

      补间动画它是给出两个关键帧,通过一些算法将给定属性值在给定的时间内在两个关键帧间渐变

      View animation只能应用于View对象,而且只支持一部分属性,如支持缩放旋转而不支持背景颜色的改变。而且对于View animation,它只是改变了View对象绘制的位置,而没有改变View对象本身,比如,你有一个Button,坐标(100,100),Width:200,Height:50,而你有一个动画使其变为Width:100,Height:100,你会发现动画过程中触发按钮点击的区域仍是(100,100)-(300,150)。

      View Animation就是一系列View形状的变换,如大小的缩放,透明度的改变,位置的改变,动画的定义既可以用代码定义也可以用XML定义,当然,建议用XML定义。可以给一个View同时设置多个动画,比如从透明至不透明的淡入效果,与从小到大的放大效果,这些动画可以同时进行,也可以在一个完成之后开始另一个。

       用XML定义的动画放在/res/anim/文件夹内,XML文件的根元素可以为<alpha>,<scale>,<translate>,<rotate>,<set>(表示以上几个动画的集合,set可以嵌套)。默认情况下,所有动画是同时进行的,可以通过startOffset属性设置各个动画的开始偏移(开始时间)来达到动画顺序播放的效果。可以通过设置interpolator属性改变动画渐变的方式,如AccelerateInterpolator,开始时慢,然后逐渐加快。默认为AccelerateDecelerateInterpolator。转载请注明出处:小石头的博客  http://blog.csdn.net/lu1024188315/article/details/74518599

二 补间动画XML

首先在资源文件res中新建一个anim目录,在其中新建xml布局文件。

1 透明度

android:duration   延时
android:fromAlpha  开始的透明度
android:toAlpha    结束的透明度,切记从开始到结束这个过程就是动画的过程。
android:fillAfter  设置最终的结果是不保存,如果是true就保存,否则就不保存
android:repeatMode 设置重复的模式reverse:变化就是从开始的透明度渐变成结束的透明度,再从结束的透明度渐变成开始时的透明度,这样依次循环, restart:变化就是从开始的透明度渐变成结束的透明度,再突然跳转到开始时的透明度再渐变成结束的透明度....这样一次变化。
android:repeatCount 设置渐变循环的次数,如果为0就是不循环,只渐变一次,infinite:无穷循环。
<?xml version="1.0" encoding="utf-8"?><alpha xmlns:android="http://schemas.android.com/apk/res/android"    android:duration="6000"    android:fromAlpha="1.0"    android:fillAfter="true"    android:repeatCount="infinite"    android:repeatMode="reverse"    android:toAlpha="0.5" ></alpha>

2 滚动

android:fromDegrees 开始滚动的角度
android:toDegrees   结束滚动的角度
android:pivotX      滚动轴心在水平方向所占的百分比  一般会和pivotY搭配使用 如果其值都是%50的话就是从控件中心滚动。
android:pivotY      滚动轴心在垂直方向所占的百分比 
<?xml version="1.0" encoding="utf-8"?><rotate xmlns:android="http://schemas.android.com/apk/res/android"    android:duration="1000"    android:fromDegrees="0"    android:pivotX="50%"    android:pivotY="50%"    android:toDegrees="360" ></rotate>

3 缩放

android:fromXScale  开始原件在水平方向的缩放,如果为1就是原本的大小,0就是缩放到看不到,n就是缩放到n倍
android:fromYScale
android:toXScale    结束原件在水平方向的缩放,如果为1就是原本的大小,0就是缩放到看不到,n就是缩放到n倍 
android:toYScale
<?xml version="1.0" encoding="utf-8"?><scale xmlns:android="http://schemas.android.com/apk/res/android"    android:duration="1000"    android:fromXScale="0"    android:fromYScale="0"    android:pivotX="50%"    android:pivotY="50%"    android:toXScale="1"    android:toYScale="1" ></scale>

4 平移

android:fromXDelta 控件在x开始平移的位置,用百分比表示,0就是水平方向最左上角 和fromYDelta搭配使用 值都为0时就是从左上角开始平移。
android:toXDelta   在水平方向上平移原件的多少,用百分比表示。
<?xml version="1.0" encoding="utf-8"?><translate xmlns:android="http://schemas.android.com/apk/res/android"    android:duration="5000"    android:fromXDelta="0"    android:fromYDelta="0"    android:toXDelta="100%"    android:toYDelta="100%" ></translate>

5 混合使用

混合使用时,通常要用set作为标签。
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" >    <alpha        android:duration="6000"        android:fillAfter="true"        android:fromAlpha="1.0"        android:repeatCount="infinite"        android:repeatMode="reverse"        android:toAlpha="0.5" >    </alpha>    <rotate        android:duration="3000"        android:fromDegrees="0"        android:pivotX="50%"        android:pivotY="50%"        android:repeatCount="infinite"        android:repeatMode="restart"        android:toDegrees="360" >    </rotate>    <scale        android:duration="5000"        android:fromXScale="2"        android:fromYScale="2"        android:pivotX="50%"        android:pivotY="50%"        android:repeatCount="infinite"        android:repeatMode="reverse"        android:toXScale="0.0"        android:toYScale="0.0" >    </scale>    <translate        android:duration="5000"        android:fromXDelta="-100%"        android:fromYDelta="-100%"        android:repeatCount="infinite"        android:repeatMode="reverse"        android:toXDelta="100%"        android:toYDelta="100%" >    </translate></set>

在ActivityXML文件使用:

public class ActivityTweenTestActivity extends Activity implements View.OnClickListener {    private ImageView img;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_tween_test);        findViewById(R.id.alpha).setOnClickListener(this);        findViewById(R.id.rotate).setOnClickListener(this);        findViewById(R.id.translate).setOnClickListener(this);        findViewById(R.id.scale).setOnClickListener(this);        findViewById(R.id.set).setOnClickListener(this);        img = (ImageView) findViewById(R.id.imageView1);    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.alpha:                Animation a1 = AnimationUtils.loadAnimation(this, R.anim.tween_alpha);                //使用AnimationUtils工具类,把动画资源加载成动画对象                img.startAnimation(a1);  //对目标的控件启动动画                break;            case R.id.rotate:                Animation a2 = AnimationUtils.loadAnimation(this, R.anim.tween_rotate);                //使用AnimationUtils工具类,把动画资源加载成动画对象                img.startAnimation(a2);  //对目标的控件启动动画                break;            case R.id.scale:                Animation a3 = AnimationUtils.loadAnimation(this, R.anim.tween_scale);                //使用AnimationUtils工具类,把动画资源加载成动画对象                img.startAnimation(a3);                break;            case R.id.translate:                Animation a4 = AnimationUtils.loadAnimation(this, R.anim.tween_translate);                //使用AnimationUtils工具类,把动画资源加载成动画对象                img.startAnimation(a4);                break;            case R.id.set:                Animation a5 = AnimationUtils.loadAnimation(this, R.anim.tween_set);                //使用AnimationUtils工具类,把动画资源加载成动画对象                img.startAnimation(a5);                break;            default:                break;        }    }}

三 补间动画相关类

 补间动画相关的类有:

  Animation   动画

  AlphaAnimation 渐变透明度

  RotateAnimation 画面旋转

  ScaleAnimation 渐变尺寸缩放

  TranslateAnimation 位置移动

  AnimationSet  动画集

AlphaAnimation 渐变透明度

//透明度动画Animation animation= new AlphaAnimation(0.1f,1.0f);animation.setDuration(1*1000);ImageView imageView= (ImageView) findViewById(R.id.imageView);//启动动画imageView.startAnimation(animation);

 第一个参数fromAlpha表示动画起始时的透明度, 第二个参数toAlpha表示动画结束时的透明度,

setDuration用来设置动画持续时间。

2 RotateAnimation 画面旋转

Animation rotateAnimation=new RotateAnimation(0f,360f);rotateAnimation.setDuration(1000);ImageView imageView= (ImageView) findViewById(R.id.imageView);//启动动画imageView.startAnimation(rotateAnimation);
第一个参数fromDegrees表示动画起始时的角度, 第二个参数toDegrees表示动画结束时的角度。

另外还可以设置伸缩模式pivotXType、pivotYType, 伸缩动画相对于x,y 坐标的开始位置pivotXValue、pivotYValue等。

Animation rotateAnimation=new RotateAnimation(0f,360f,0f,200f);rotateAnimation.setDuration(5000);ImageView imageView= (ImageView) findViewById(R.id.imageView);//启动动画imageView.startAnimation(rotateAnimation);
设置伸缩模式(沿着y或者x轴偏转旋转360度):对于y轴负数向上偏转,正数向下偏转。

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坐标的伸缩值。

ScaleAnimation 渐变尺寸缩放

Animation scaleAnimation=new ScaleAnimation(0.1f,5f,0.1f,8f);scaleAnimation.setDuration(5000);ImageView imageView= (ImageView) findViewById(R.id.imageView);//启动动画imageView.startAnimation(scaleAnimation);

第一个参数fromX ,第二个参数toX:分别是动画起始、结束时X坐标上的伸缩尺寸。(如图就是在x轴上从0.1倍到5倍,y轴从0.1倍到8倍)

第三个参数fromY ,第四个参数toY:分别是动画起始、结束时Y坐标上的伸缩尺寸。

另外还可以设置伸缩模式pivotXType、pivotYType, 伸缩动画相对于x,y 坐标的开始位置pivotXValue、pivotYValue等。


4 TranslateAnimation 位置移动

Animation translateAnimation=new TranslateAnimation(-10f,100f,-10f,100f);ImageView imageView= (ImageView) findViewById(R.id.imageView);//启动动画imageView.startAnimation(translateAnimation);

第一个参数fromXDelta ,第二个参数toXDelta:分别是动画起始、结束时X坐标。

第三个参数fromYDelta ,第四个参数toYDelta:分别是动画起始、结束时Y坐标。


AnimationSet  动画集

众多动画集于一身,动画同时发生
AnimationSet sets=new AnimationSet(true);//透明度动画Animation animation= new AlphaAnimation(0.1f,1.0f);animation.setDuration(2 * 1000);sets.addAnimation(animation);Animation rotateAnimation=new RotateAnimation(0f,360f,0f,-50f);rotateAnimation.setDuration(5000);sets.addAnimation(rotateAnimation);Animation scaleAnimation=new ScaleAnimation(0.1f,5f,0.1f,8f);scaleAnimation.setDuration(5000);sets.addAnimation(scaleAnimation);Animation translateAnimation=new TranslateAnimation(-10f,200f,-10f,200f);translateAnimation.setDuration(5000);sets.addAnimation(translateAnimation);ImageView imageView= (ImageView) findViewById(R.id.imageView);//启动动画imageView.startAnimation(sets);

动画的示例代码都在anima目录下:

https://git.oschina.net/lzbgit/androidwindows/tree/master/app/src/main/java/com/eric/windows/anima

原创粉丝点击