一 前言
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
1 透明度
<?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 滚动
<?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 动画集
1 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);
另外还可以设置伸缩模式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);
float pivotXValue:X坐标的伸缩值。
int pivotYType:Y轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
float pivotYValue:Y坐标的伸缩值。
3 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坐标。
5 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