以前碰到自定义控件计算位置的时候,我直接用个线程Thread来计算,然后postInvalidate(),当然,特殊情况下,这种做法有必要,但是在看过android各种属性动画,及滑动之后,感觉自己傻透了,为了让大家远离二货,向大神迈进,所以,把在《android群英传》学习到的动画分享给大家,也是自己做的一个小结,对其中的内容有一定的补充修改。里面的动画效果等全部试过之后,会补充资源。

(1)Scroller

优点:用法简单
缺点:局限性大,只支持移动、滑动的相关动画

实际上,这个并不算动画,但是个人感觉这个东西和动画有相似性,很多要做动画的需要移动x和y,如果只是需要移动动画,不需要其他的复杂变化,可以考虑用这个东西代替动画。
用法:

  • 初始化
Scroller scroller = new Scroller(context);
  • 开始移动
scroller.startScroll(startX,startY,dx,dy,duration);
//或
//scroller.startScroll(startX,startY,dx,dy);
invalidate();

其实第一种更像动画,有个时长,解释一下各个参数:
startX:开始的x,可用scroller.getCurrX()
startY:开始的y,可用scroller.getCurrY()
dx:移动的x,比如你startX是100,dx是20,则移动后x为120
dy:移动的y,比如你startY是100,dy是20,则移动后y为120
duration:从(startX,startY),到目标位置(startX+dx,startY+dy)的时间,没有这项则立即移动到该点

  • 移动处理,覆盖View方法computeScroll()
public void computeScroll() {
//先判断mScroller滚动是否完成
if (mScroller.computeScrollOffset()) {

//这里调用View的scrollTo()完成实际的滚动
LinearLayout.LayoutParams params = (LayoutParams) child.getLayoutParams();
params.leftMargin = mScroller.getCurrX();
params.topMargin = mScroller.getCurrY();
child.setLayoutParams(params);

//必须调用该方法,否则不一定能看到滚动效果

(2)ObjectAnimater

优点:用法简单
缺点:需要记得属性名,没有get,set的属性无法起效,常用:
translationX,translationY,父布局左上角偏移量
rotation、rotationX和rotationY:控制view2D和3D旋转
scaleX,scaleY:view对支点2D缩放
pivotX和pivotY:支点位置,默认中心点(类似ps缩放时的中心十字)
x和y:x=父布局x+translationX,y=父布局y+translationY
alpha:值在0-1之间,0透明,1不透明,中间透明度=100*alpha

  • 最简单用法(单、已有set/get属性操作)
.ofFloat(view,"x",500);
animater.setDuration(300);
animater.start();
  • 特殊属性添加(无set/get或自定义属性)
private static class WrapperView{
private View mTarget;
public WrapperView(View target){
mTarget = target;
}
public int getColor(){
Drawable background = mTarget.getBackground();
int color = 0;
//background包括color和Drawable,这里分开取值
if (background instanceof ColorDrawable) {
ColorDrawable colordDrawable = (ColorDrawable) background;
color = colordDrawable.getColor();
}
return color;
}

public void setColor(int color){
mTarget.setBackgroundColor(color);
}
}

public void setColor(int

调用:

;
ObjectAnimator.ofInt(wrapper,"color",500).setDuration(5000).start();
  • 同时作用
PropertyValuesHolder p1 = PropertyValuesHolder.ofFloat("translationX",300f);
PropertyValuesHolder p2 = PropertyValuesHolder.ofFloat("scaleX",1f,0,1f);
ObjectAnimator.ofPropertyValuesHolder(view,p1,p2).setDuration(1000).start();

解释:PropertyValuesHolder.ofFloat(“scaleX”,1f,0,1f);
第一个参数:属性名,后面所有参数,经过的值

(3)ValueAnimator

优点:灵活,方法细腻,可控制动画起始状态,结束状态
缺点:本身不提供动画效果,可以看做是单纯的计时器

0,100);
animator.setTarget(targetBtn);
animator.setDuration(1000).start();
final int height = targetBtn.getHeight();
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener(){
@Override
public void onAnimationUpdate(ValueAnimator animation){
int value = (int) animation.getAnimatedValue();
targetBtn.setLeft(value*height/100);
}
});

(4)view.animate()(android 3.0以后)

优点:好方便一口气“.”到结尾
缺点:不支持3.0以下

view.animate() 
.alpha(0)
.y(300)
.setDuration(300)
.withStartAction(new Runnable(){
@Override
public void run(){
//do start things
}
})
.withEndAction(new Runnable(){
@Override
public void run(){
//do end things
}
}).start();

(5)new Animation()@Override protedted void applyTransformation(float interpolatedTime,Transformation t){}

优点:可控制加速减速,灵活性高,提供matrix参数,适用于3D旋转
缺点:设置相比前面几种方法,稍显麻烦

用法

private class MyAnimation extends Animation
private Camera camera = new Camera();
private int mCenterX;
private int mCenterY;

@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
//通常做一些初始化操作
setDuration(2000);
setInterpolator(new BounceInterpolator());
mCenterX = 2 / width;
mCenterY = 2 / height;
setFillAfter(false);
}

@Override
public void applyTransformation(float interpolatedTime, Transformation t) {
// 生成中间角度

int fromDegrees = 0;
int mToDegrees = 250;
float degrees = fromDegrees
+ ((mToDegrees - fromDegrees) * interpolatedTime);

final float centerX = mCenterX;
final float centerY = mCenterY;

final Matrix matrix = t.getMatrix();

camera.save();
camera.rotateY(-mCenterY);
camera.rotateY(degrees);
// 取得变换后的矩阵

调用:

MyAnimation animation = new MyAnimation();
targetBtn.startAnimation(animation);

(6)android 5.x SVG动画
这个东西在兼容性上,还是存在问题
推荐兼容框架:​​​AnimatedSvgView,14版本及以上兼容​

其实这就相当于onDraw里面的Path path = new Path();
M = path.moveto(x,y);
L = path.lineto(x,y);
H = path.lineto(x,y(当前y,不必写出));
V = path.lineto(x(当前x,不必写出),y);
还有C,S,Q,T,A,Z这些,不一一列举。

可用​​在线编辑器​​​转换:
可用vector和animated-vector的xml文件实现动画,因为公司大多需求要求兼容性,所以个人不推荐。喜欢的可以去学习,效果确实很赞,颜色很亮丽。如果和我一样比较顾虑兼容性,可以直接用path,就是重绘什么的有些麻烦,还是要用上面的动画方式。如果有人有办法让svg兼容2.x版本,请务必告知。

(7)布局动画
设置(不能改):android:animateLayoutChanges = “true”
或者:

SavleAnimation sa = new SaleAnimation(0,1,0,1); 
sa.setDuration(2000);
LayoutAnimationController lac = new LayoutAnimationController(sa,0.2f);
lac.setOrder(LayoutAnimationCOntroller.ORDER_NORMAL);
//设置view显示顺序:ORDER_NORMAL:顺序ORDER_RANDOM:随机ORDER_REVERSE:反序
ll.setLayoutAnimation(lac);

总结
只移动:scroller
改属性:ObjectAnimator,ValueAnimator
子view:LayoutAnimationController
要3D:自定义Animation
超炫酷:SVG