Android View动画框架

来源:互联网 发布:沙盘模拟软件下载 编辑:程序博客网 时间:2024/05/21 07:49

一,视图动画:

Animation框架定义了透明度alpha/旋转rotate/缩放scale/位移translate四种常见的动画,而且控制的是整个View,实现原理是每次绘制视图时View所在的ViewGroup中的drawChild函数获取该View的Animation的Transformation值,然后调用canvas.concat(transformToApply.getMatrix()),通过矩阵运算成功画帧。如果动画没有完成,就继续调用invalidate()函数,启动下次绘制来驱动动画,从而完成整个动画的绘制。

在Android3.0之前,视图动画一家独大,但随之后属性动画框架的推出,它的风光大不如前了。相比属性动画,视图动画一个非常大的缺陷就是不具备交互性,当某个元素发生视图动画后,其响应事件的位置还依然在动画前的地方,所以视图动画只能做普通的动画效果,避免交互发生,且效率较高使用方便。

视图动画方式

1,透明度:

AlphaAnimation aa=new AlphaAnimation(0,1);

aa.setDuration(1000);

view.startAnimation(aa);

2,旋转动画:

RotateAnimation ra=new RotateAnimation(0,360,RoatateAnimation.RELATIVE_TO_SELF,0.5F,RoatateAnimation.RELATIVE_TO_SELF,0.5F);

ra.setDuration(1000);

view.startAnimation(ra);

3,缩放动画:

ScaleAnimation sa=new ScaleAnimation(0,1,0,1,RoatateAnimation.RELATIVE_TO_SELF,0.5F,RoatateAnimation.RELATIVE_TO_SELF,0.5F);

sa.setDuration(1000);

view.startAnimation(sa);

4,位移动画:

TranslateAnimation ta=new TranslateAnimation(0,200,0,300);

ta.setDuraton(1000);

view.startAnimation(ta);

5,动画集合:

AnimationSet as =new AnimationSet(true);

as.setDuration(1000);

AlphaAnimation aa=new AlphaAnimation(0,1);

aa.setDuration(1000);

as.addAnimation(aa);

TranslateAnimation ta=new TranslateAnimation(0,200,0,300);

ta.setDuraton(1000);

as.addAnimation(ta);

view.startAnimation(as);


视图动画监听回调

animation.setAnimationListener(new Animation.AnimationListener(){

@Override

public void onAnimationStart(Animation animation){

}

@Override

public void onAnimationEnd(Animation animation){

}

@Override

public void onAnimationRepeat(Animation animation){

}

});

二,属性动画:

Animator 框架中使用最多就是AnimatorSet和ObjectAnimator配合,使用ObjectAnimator进行更精细化控制,只控制一个对象的一个属性值,而使用多个ObjectAnimator组合到AnimatorSet形成一个动画。而且ObjectAnimator能够自动驱动,可以调用setFrameDelay(longframeDelay)设置动画帧之间的间隙时间,调整帧率,减少动画过程中频繁绘制界面,而在不影响动画效果的前提下减少CPU资源消耗。最重要的是,属性东湖通过属性的get,set方法来真实地控制一个View的属性值,因此强大的属性动画框架,基本可以实现所有的动画效果。

1,ObjectAnimator

ObjectAnimator animator=ObjectAnimator.ofFloat(view,"translationX",300);

animator.setDuration(300);

animator.start();

不过,在使用ObjectAnimator的时候,有一点非常重要,那就是要操纵属性必须具有get,set方法,不然ObjectAnimator就无法起效。

下面常见的可以直接使用属性值和属性动画:

1.translationX和translationY:这两个属性作为一种增量来控制着View对象从它布局容器的左上角坐标偏移的位置。

2.rotation/rorationX和rorationY:这三个属性控制View对象围绕支点进行2D和3D旋转。

3.scaleX和scaleY:这两个属性控制着View对象围绕它的支点进行2D缩放。

4.pivotX和privotY:这两个属性控制着View对象的支点位置,围绕这个支点进行旋转和缩放变换处理。默认情况下该支点就是View对象中心点。

5.x和y:这是两个简单实用的属性,它描述了View对象在它的容器中的最终位置,它是最初的左上角坐标和translationX/translationY值的累积和。

6.alpha:它表示View对象的alpha透明度。默认值1(不透明),0代表完全透明(不可见)。

属性动画监听回调

ObjectAnimator anima =ObjectAnimator.ofFloat(View,"alpha",0.5f);

anima.addListener(new AnimatorListener(){

@Overrider

public void onAnimationStart(Animator animation){

}

@Overrider

public void onAnimationRepeat(Animator animation){

}

@Overrider

public void onAnimationEnd(Animator animation){

}

@Overrider

public void onAnimationCancel(Animator animation){

}

});

anima.start();

选择性进行监听:

anima.addListener(new AnimatorListenerAdapter(){

@Override

public void onAnimationEnd(Animator animation){

}

});

属性动画集合:

ObjectAnimator animator1 =ObjecteAnimator.ofFloat(view,"translation",300f);
ObjectAnimator animator1 =ObjecteAnimator.ofFloat(view,"scaleX",1);
ObjectAnimator animator1 =ObjecteAnimator.ofFloat(view,"scaleY",1);
AnimatorSet set=new AnimatorSet();
set.setDuration(1000);
set.playTogether(animator1,animator2,animator3);
set.start();
在属性动画中,AnimatoSet正是通过playTogether()/playSequentially()/animSet.play().with()/before()/after(),这些方法来控制多个动画的协同工作方式,从而做到对动画播放顺序的精确控制。


三,自定义动画:

applyTransformation(float interpolatedTime ,transformation t)

第一个参数插值器的时间因子,取值范围为0~1.0之间。就像规定时间内长跑,有的选择开始一段时间加速度,有的选择结束一段时间加速度,最后到终点时间都一样。

第二参数是矩阵的封装类。一般使用它获取矩阵对象 t.getMatrix()。

例:模拟电视机关闭效果,让一个突破纵向比例不断缩小。

final Matrix matrix =t.getMatrix();

matrix.preScale(1,

1-interpolatedTime,

mCenterWidth,

mCenterHeight);

结合矩阵,Camera类实现自定义3D动画效果:想象移动一个真实是相机拍摄固定物体的立体感图像。

@Override

public void initialize(int width ,  int height,

 int parentWidth , int parentHeight){

super.initialize(width, height,patentWidth,patentHeight);

//设置默认时长

setDuration(2000);

//动画结束后保留状态

setFillAfter(ture);

//设置默认插值器

setInterpolator(new BounceInterpolator());

mCenterWidth = width / 2;

mCenterHeight =height / 2;

}

//接下里,自定义动画的核心——如何定义动画的进行过程

@Ovrride

protected void applyTransformation(

float interpolateTime,

Transformation t){

final Matrix matrix =t.getMatrix();

mCamera.save();

//使用Camera设置旋转的角度

mCamera.rotateY(mRotateY * interpolatedTime);

//将旋转变换作用到mateix上

mCamera.getMatrix(matrix);

mCamera.restore();

//通过pre方法设置矩阵作用前的偏移量来改变旋转中心

matrix.pretranslate(mCenterWidth , mCenterHeight);

matrix.posttranslate(-mCenterWidth , -mCenterHeight);

}

2 0
原创粉丝点击