android 动画大致分为以下几种
1 帧动画:
这也是最简单一种,具体使用方式 在res/drawable目录下奖励一个animlist.xml 文件内容如下:
<<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item
android:drawable="@mipmap/a1a"
android:duration="200" />
<item
android:drawable="@mipmap/b2b"
android:duration="200" />
<item
android:drawable="@mipmap/c3c"
android:duration="200" />
</animation-list>
在代码中引用如下
ImageView images = (ImageView) findViewById(R.id.iv_images); images.setBackgroundResource(R.drawable.anim_list); final AnimationDrawable animi = (AnimationDrawable) images.getBackground(); findViewById(R.id.start).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { animi.start(); } });注意:图片较多时候容易内存溢出
补间动画
补间动画与逐帧动画在本质上是不同的,逐帧动画通过连续播放图片来模拟动画的效果,而补间动画则是通过在两个关键帧之间补充渐变的动画效果来实现的。补间动画的优点是可以节省空间。目前Android应用框架支持的补间动画效果有以下5种
AlphaAnimation:透明度(alpha)渐变效果,对应<alpha/>标签。
TranslateAnimation:位移渐变,需要指定移动点的开始和结束坐标,对应<translate/>标签。
ScaleAnimation:缩放渐变,可以指定缩放的参考点,对应<scale/>标签。
RotateAnimation:旋转渐变,可以指定旋转的参考点,对应<rotate/>标签。
AnimationSet:组合渐变,支持组合多种渐变效果,对应<set/>标签。
代码定义非常简单new 出来设置时间,播放即可。说一下在xml 中定义方式:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:interpolator= "@android:anim/accelerate_decelerate_interpolator" android:fromXScale="1.0" android:toXScale="1.4" android:fromYScale="1.0" android:toYScale="1.4" android:pivotX="50%" android:pivotY="50%" android:fillAfter="false" android:duration="2000" /> </set>注意 帧动画,跟补间动画都是android3.0之前出现的,他只是对图像做的一个影像上的移动,如果不处理他结束后还回回到初始位置,如果给他设置点击事件,他只在原来位置能响应事件。不改变动画实际位置。为了解决这个问题,3.0之后��️出现了属性动画。
属性动画:
基本用法:objectAnimtion.ofInt();
objectAnimtion.ofFloat();
objectAnimtion.ofObject();
ValueAnimation():
前面两张大家用的比较多,这里就不介绍了需要说的一点是,属性动画也可以在xml 中定义,为什么把xml中定义拿出来说呢?因为本人感觉在代码中定义,显的代码太乱,至于你习惯在xml中还是代码中,根据你的个人喜好。
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <objectAnimator android:duration="1000" android:propertyName="scaleX" android:valueFrom="1.0" android:valueTo="2.0" android:valueType="floatType"> </objectAnimator> <objectAnimator android:duration="1000" android:propertyName="scaleY" android:valueFrom="1.0" android:valueTo="2.0" android:valueType="floatType"> </objectAnimator> <objectAnimator android:duration="1000" android:propertyName="alpha" android:valueFrom="0.1" android:valueTo="1" android:valueType="floatType"> </objectAnimator> </set>代码中加载
final ImageView images = (ImageView) findViewById(R.id.iv_images); final Animator animator = AnimatorInflater.loadAnimator(this, R.animator.objectanim); findViewById(R.id.start).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { animator.setTarget(images); animator.start(); } });
这里对属性的动画必须是有set跟get方法的,也就说属性动画师基于控件的set跟get方法的。这里为什么必须要这个属性有set跟get方法,我们后面会继续说,这里只是动画的用法。
valaueAnimation 只是将值 按一个动画序列播放出来,不会对控件真正的做动画操做,一般要集合组件的属性来实现动画效果。
最后是objectAnimation。onObject方法。别的不多说
先上代码
ValueAnimator valueAnimator = ObjectAnimator.ofObject(new PointTypeTypeEvaluator(), new point(0, 0), new point(100, 100)); valueAnimator.setDuration(2000); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { point animatedValue = (point) animation.getAnimatedValue(); Log.e("point", "X:" + animatedValue.X + " " + "Y:" + animatedValue.Y); } }); valueAnimator.start();
public class PointTypeTypeEvaluator implements TypeEvaluator<point> { @Override public point evaluate(float fraction, point startValue, point endValue) { float x = endValue.X; return new point((endValue.X - startValue.X) * fraction, (endValue.Y - startValue.Y) * fraction); } }
public class point { public float X; public float Y; public point(float x, float y) { X = x; Y = y; } }
这里要说一下typeEvaluator 成为估值器,什么意思呢 ?fraction 就是百分百的意思 就是动画 进行的进度,后面两个参数就是开始跟结束的object ,也就是通过百分百,来构建一个新的objec 传出去,最终生成的objcet 是fraction的或者说是时间(如果是线性插值器)的一维函数。插值器,我后面会继续说。这里还是想讲基础用法。
最后要的的比较少见的一种情况,自定义动画了,这里通过一个例子来说,虽然用的比较少但是有时可以做出一些意想不到的效果。 其实就是继承animation 重写2个方法:
在这个方法进行初始化操作,
public void initialize(int width, int height, int parentWidth, int parentHeight)
在这个方法通过矩阵的行列变换操作来实现一些动画效果(特别是使用Camera来实现矩阵操作)
protected void applyTransformation(float interpolatedTime, Transformation t)