android属性动画

来源:互联网 发布:淘宝店铺转让怎么弄 编辑:程序博客网 时间:2024/06/13 06:50

以前碰到自定义控件计算位置的时候,我直接用个线程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()
 @Override    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);            //必须调用该方法,否则不一定能看到滚动效果            postInvalidate();        }        super.computeScroll();    }

(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属性操作)
 ObjectAnimator animater = ObjectAnimator.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 color){    setBackgroundColor(color);}}

调用:

 WrapperView wrapper = new WrapperView(view); 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

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

 ValueAnimator animator = ValueAnimator.ofInt(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);// 取得变换后的矩阵            camera.getMatrix(matrix);            camera.restore();            matrix.preTranslate(-centerX, -centerY);            matrix.postTranslate(centerX, centerY);        }    }

调用:

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

原创粉丝点击