view动画/补间动画
补间动画较为简单,不做过多描述,只给出一个例子.具体可参考http://www.jianshu.com/p/420629118c10
慢慢过渡,设置初值和末值,可以用插值器来控制过渡,页面切换的动画多为补间动画。缺点,视觉上变化,并不是真正的位置上的变化
xml例子如下:
在activity中的调用
Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.alpha_anim);
mImgTest = (ImageView) findViewById(R.id.img);
mImgTest.startAnimation(animation);
属性动画
属性动画通过操作属性值实现了位置+视觉的变化。并且可以自定义插值器,实现各种效果
例子:
ObjectAnimator anim = ObjectAnimator.ofFloat(myView, "rotation", 0f, 360f);
anim.setDuration(1000);
anim.start();
也可以组合
ObjectAnimator scaleXAnim = ObjectAnimator.ofFloat(myView, "scaleX", 0.0f, 1.0f);
ObjectAnimator transXAnim = ObjectAnimator.ofFloat(myView, "translationX", 100, 400);
AnimatorSet set = new AnimatorSet();
set.playTogether(scaleXAnim,transXAnim);
set.setDuration(3000);
set.start();
属性动画的原理
ObjectAnimator类继承自ValueAnimator,属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。自定义属性动画的实现具体可以参考http://www.jianshu.com/p/420629118c10
属性动画与补间动画都是不断ondraw但是属性动画改变了真实属性
属性动画自定义实现
用TypeEvaluator 确定运动轨迹,TypeEvaluator决定了动画如何从初始值过渡到结束值
public class MyEvaluator implements TypeEvaluator {
@Override
public Object evaluate(float fraction, Object startValue, Object endValue) {
//startValue起始值,endValue结束值,fraction完成的百分比
Point point = new Point(x, y);
return point;
}
}
startPoint起始的坐标,endPoint结束的坐标
final ValueAnimator valueAnimator = ValueAnimator.ofObject(new MyEvaluator(), startPoint, endPoint);
valueAnimator.setRepeatCount(-1);
valueAnimator.setRepeatMode(ValueAnimator.REVERSE);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
}
});
valueAnimator.start()
帧动画
原理多张图片连续播放,难点在于如何解决内存问题,以及过量的图片造成apk的体量过大
思路这个主要是参考别人实现的,思路就是播放一张图片就释放一张,原文找不到了,因为这个文章跟我做帧动画的时候已经隔了太久
xml实现:
在activty中的调用
ImageView imgView = (ImageView) findViewById(R.id.iv_frame);
AnimationDrawable frameAnim=(AnimationDrawable)getResources().getDrawable(R.drawable.test_anim);
imgView.setBackgroundDrawable(frameAnim);
帧动画需要解决内存问题,否则过量的图片加载容易造成oom
解决办法,这里是用到了一个帧动画的处理工具类,该类的原理就是监听帧动画的动作,执行一张图片就释放一张图片
loadRaw(resourceId, imageView.getContext(),
new OnDrawableLoadedListener() {
@Override
public void onDrawableLoaded(List myFrames) {
mMethodCallFlag++;
if (mMethodCallFlag != mLastMethodCallFlag && imageView.getDrawable() != null) {
((BitmapDrawable) imageView.getDrawable()).getBitmap().recycle();
}
mLastMethodCallFlag = mMethodCallFlag;
}
});
解析得到执行完的图片资源,回调出去进行释放
/**
* 解析Xml文件 得到图片资源
*
* @param resourceId id
* @param context 上下文
* @param onDrawableLoadedListener 资源加载回调接口
*/
private void loadFromXml(final int resourceId, final Context context, final OnDrawableLoadedListener onDrawableLoadedListener)
lottie动画库
lottie为airbnb公司出的一个很强大的动画使用库,可以制作很多复杂的动画
- 使用原理
主要是AE生成一段json描述,描述动画的运动轨迹,变化程度等相关信息,交由lottie解析,解析之后进行动画的绘制,执行等 - 缺点
对复杂程度支持有限,不支持高斯模糊等较难描述的动画 - 具体使用
使用起来较为简单具体,官方地址https://github.com/airbnb/lottie-android
Demo实现
和AE同事,做验证的一个lottieDemo,多了支持压缩文件等接口 https://github.com/Johncuiqiang/lottie.git
失量动画机制
Android 5.x 之后提供了对 SVG 的支持,通过 VectorDrawable、AnimatedVectorDrawable 的结合可以实现一些稍微复杂的动画
了解即可,基本可以被该动画库取代,而且需要为各种屏幕尺寸、分辨率做适配,使用较麻烦
facebook的动画框架
主要是对弹性动画的应用,一般我们在做动画的过程中加入一些加速度或者弹性等效果会让动画更好看,facebook为我们封装了一个比较强大的库,弹性动画的实现我自己也有一个demo及仿写小黄鸡的项目及博客,具体看我另一篇文章,facebook开源动画库的github官方地址https://github.com/facebook/pop