Android动画之补间动画(二)
2017-07-31 15:18
393 查看
一 前言
补间动画它是给出两个关键帧,通过一些算法将给定属性值在给定的时间内在两个关键帧间渐变。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 动画集
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);
第一个参数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坐标的伸缩值。
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
相关文章推荐
- android使用属性动画代替补间动画
- android 动画 补间动画,渐变动画 Tween Animation
- Android动画详解-补间动画-基础篇
- Android补间动画
- Android补间动画(Tween Animation)的使用总结
- Android中的动画,逐帧动画,补间动画
- Android 动画--补间动画(Tween Animation)
- Android 动画:手把手教你使用 补间动画 (视图动画)
- android基本动画,Tween补间动画,属性动画
- android 学习笔记13-新特性Fragment 帧动画 补间动画 属性动画
- android res/anim 定义补间动画文件
- Android动画效果之Tween Animation(补间动画)(一)
- Android Animation之补间动画
- Android两大动画之Tween(补间动画)详解
- Android动画之补间动画(Tween Animation)实例详解
- android使用属性动画代替补间动画
- Android中的补间动画
- 《疯狂Android讲义》 -- Android 动画系列之自定义补间动画(三维动画)
- (转)Android中属性动画和补间动画的区别
- android动画之补间动画