首页 > 学院 > 开发设计 > 正文

动画(一)

2019-11-09 18:11:56
字体:
来源:转载
供稿:网友

1.View动画是通过平移,缩放,旋转,透明度改变图片的一种渐进式的动画

2.帧动画类似于放电影一样切换一张张准备好的图片而形成的动画

3.属性动画是通过改变对象每个时段的属性值而形成的动画

注意:动画中尽量使用dp做单位,使用硬件加速

一。View动画

xml方式:

在res/anim/filename.xml

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"android:interpolator="@[package:]anim/interpolator_resource"   //插值器android:shareInterpolator="true" | "false"      //集合中动画是否和集合共享插值器,若为false则不共享android:duration=“integer” //动画持续时间android:fillAfter="true|false" //动画结束后是否停留在结束位置 >         <alpha                            //透明度        android:fromAlpha="float"        android:toAlpha="float" />    <scale                            //缩放        android:fromXScale="float"        android:toXScale="float"        android:fromYScale="float"        android:toYScale="float"        android:pivotX="float"        android:pivotY="float" />    <translate                         //位移        android:fromXDelta="float"        android:toXDelta="float"        android:fromYDelta="float"        android:toYDelta="float" />    <rotate                           //旋转        android:fromDegrees="float"        android:toDegrees="float"        android:pivotX="float"        android:pivotY="float" />    <set>        ...    </set></set>使用上面的动画:

TextView v = (TextView)findViewById(R.id.test);Animation a = AnimationUtils.loadAnimation(this,R.anim.filename);v.startAnimation(a);

代码方式:

TextView v = (TextView)findViewById(R.id.test);AlphaAnimation a = new AlphaAnimation(0,1);a.setDuration(300);v.startAnimation(a);TranslateAnimation/ScaleAnimation/RotateAnimation用法同上

注意:View使用setVisbility(View.GONE)失效时,可以使用view.clearAnimation清除

可以通过setAnimationListener方法设置AnimationListener来对动画进行监听,在动画开始,结束,和重复播放时进行操作

a.setAnimationListener(new Animation.AnimationListener() {    @Override    public void onAnimationStart(Animation animation) {            }    @Override    public void onAnimationEnd(Animation animation) {    }    @Override    public void onAnimationRepeat(Animation animation) {    }});

当以上动画不能满足要求时,我们可以通过继承Animation进行动画自定义

需要重写initialize和applyTransformation两个方法

public class a extends Animation{    @Override    public void initialize(int width, int height, int parentWidth, int parentHeight) {        super.initialize(width, height, parentWidth, parentHeight);        //完成一些初始化的工作:如mCamera = new Camera();    }    @Override    PRotected void applyTransformation(float interpolatedTime, Transformation t) {           //当前值 = 初始值 + (最终值 - 初始值) * interpolatedTime;           Matrix matrix = t.getMatrix();         //通过camera进行一些矩阵操作,最后对matrix进行变化    }}

二。帧动画

在res/drawable/filename.xml:

<?xml version="1.0" encoding="utf-8"?><animation-list xmlns:android="http://schemas.android.com/apk/res/android"    android:oneshot=["true" | "false"] >    <item        android:drawable="@[package:]drawable/drawable_resource_name"        android:duration="integer" /></animation-list>

使用以上动画:

TextView v = (TextView)findViewById(R.id.test);v.setBackgroundResource(R.drawable.filename);AnimationDrawable a = (AnimationDrawable)v.getBackground();a.start();注意:图片数量多且图片较大容易出现OOM,尽量避免使用帧动画

三。LayoutAnimation

xml形式:

res/anim/finename.xml

<?xml version="1.0" encoding="utf-8"?><layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"android:delay="float"  android:animationOrder="normal|reverse|random”//子元素按什么顺序播放动画   正序/逆序/随机android:animation="@anim/~"/>      //动画样式在ViewGroup的xml文件中指定android:layoutAnimation = "@anim/filename"

则ViewGroup入场时,他的item就会开始播放动画

代码形式:

ListView v = (ListView)findViewById(R.id.listview);Anaimation a = AnimationUtils.loadAnimation(this,R.anim.a);LayoutAnimationController con = new LayoutAnimationController(a);con.setDelay(0.5f);con.setOrder(LayoutAnimationController.ORDER_REVERSE);v.setLayoutAnimation(con);

四.属性动画

ObjectAnimator实现属性动画

ObjectAnimator.ofFloat(Object,"alpha",1,0,1).start();ValueAnimator实现属性动画:

ValueAnimator anim = ObjectAnimator.ofInt(this,"backgroundColor",0xffffffff,0x00000000);anim.setDuration(1000);anim.setEvaluator(new ArgbEvalutor);    //颜色估值器anim.setRepeatCount(ValueAnimator.INFINITE);anim.setRepeatMode(ValueAnimator.REVERSE);anim.start();属性动画的监听器AnimatorListener,AnimatorUpdateListener.AnimatorUpdateListener:动画每播放一帧,调用一次AnimatorListener:监听动画开始,结束,取消以及重复播放注意:属性动画有一类无限循环动画在Activity退出时要让它停止否则会让Activity无法释放而造成内存泄露动画集合:xml形式:

<setandroid:ordering=["together" | "sequentially"]>      //集合中的动画是同时播放还是依次播放<objectAnimatorandroid:propertyName="string"      //属性名android:duration="int"android:valueFrom="float | int | color"android:valueTo="float | int | color"android:startOffset="int"android:repeatCount="int"           //重复次数android:repeatMode=["repeat" | "reverse"]      android:valueType=["intType" | "floatType"]/><animator android:duration="int"android:valueFrom="float | int | color"android:valueTo="float | int | color" android:startOffset="int"android:repeatCount="int" android:repeatMode=["repeat" | "reverse"]android:valueType=["intType" | "floatType"]/><set>...</set></set>使用以上动画:
TextView v = (TextView)findViewById(R.id.textview);AnimatorSet set = (AnimatorSet)AnimatorInflater.loadAnimator(this,R.anim.filename);set.setTarget(v);set.start();

代码形式:
//利用AnimatorSet和ObjectAnimator实现缩放动画final AnimatorSet animatorSet = new AnimatorSet();image.setPivotX(image.getWidth()/2);image.setPivotY(image.getHeight()/2);animatorSet.playTogether(ObjectAnimator.ofFloat(image, "scaleX", 1, 0).setDuration(5000),ObjectAnimator.ofFloat(image, "scaleY", 1, 0).setDuration(5000));animatorSet.start();

参考:Android的View动画和属性动画


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表