Tween动画

来源:互联网 发布:python运维实战 pdf 编辑:程序博客网 时间:2024/06/01 07:39

动画:Tween动画(Animation)、Frame动画(AnimationDrawable)、属性动画(Animator)

Tween动画

通过对一个视图不断的进行平移、旋转、放大、缩小、透明变换所形成的动画

透明度动画

//创建动画对象AlphaAnimation anim = new AlphaAnimation(1.0f,0);//设置时间anim.setDuration(1000);//重复次数(0则表示之执行一次不重复)anim.setRepeatCount(3);//设置监听anim.setAnimationListener(new Animation.AnimationListener() {   //动画开始   @Override   public void onAnimationStart(Animation animation) {    }    //动画结束    @Override    public void onAnimationEnd(Animation animation) {         tv.setVisibility(View.INVISIBLE);    }    //动画重复    @Override    public void onAnimationRepeat(Animation animation) {      }   });//对View启动动画tv.startAnimation(anim);

平移动画

 //(起始的x,结束的x,起始的y,结束的y) TranslateAnimation anim = new TranslateAnimation(0,100,0,400); anim.setDuration(3000); //保持动画之后的状态 anim.setFillAfter(true); anim.setFillBefore(true); tv.startAnimation(anim);

旋转动画

默认参考左上角RotateAnimation anim = new RotateAnimation(0, 180)//(起始角度,结束的角度,中心点x的参考方式,相对比例,中心点y的参考方式,y的相对比例)RotateAnimation anim = new RotateAnimation(0, 180,            Animation.RELATIVE_TO_SELF, 0.5f,            Animation.RELATIVE_TO_PARENT, 0.5f);

缩放动画

默认参考左上角 ScaleAnimation anim = new ScaleAnimation(0,1,0,1)//(x方向起始倍数,x方向结束的倍数,y方向起始的倍数,y方向结束的倍数,后面4个是中心点的配置)ScaleAnimation anim = new ScaleAnimation(0,1,0,1,     Animation.RELATIVE_TO_SELF,0.5f,     Animation.RELATIVE_TO_PARENT,1.0f);

动画集

AnimationSet set = new AnimationSet(true);...//将动画添加到set中set.addAnimation(scale);set.addAnimation(alpha);set.addAnimation(anim);//启动动画tv.startAnimation(set);

动画速率

Interpolater描述动画的辅助效果,一般用其子类

OvershootInterplator 向前甩一下再回来anim.setInterpolator(new OvershootInterpolator(2.0f));AccelerateDecelerateInterplator在动画开始于结束的地方速率改变比较慢,中间加速AccelerateInterplator 越来越快DecelerateInterplator 越来越慢CycleInterplator动画循环按照正弦曲线方向改变速率LinearInterplator匀速运动

XML中定义动画

可以在res/anim文件夹中新建动画文件,如anim.xml<set xmlns:android="http://schemas.android.com/apk/res/android"android:shareInterpolator="true"><alpha    android:duration="2000"    android:fromAlpha="0.5"    android:toAlpha="1.0" /><rotate    android:duration="2000"    android:fromDegrees="0"    android:interpolator="@android:anim/accelerate_interpolator"    android:pivotX="50%"    android:pivotY="50%p"    android:toDegrees="360" /></set>

java中加载

Animation anim = AnimationUtils.loadAnimation(MainActivity.this, R.anim.move_anim);tv.startAnimation(anim);

Frame动画

AnimationDrawable,管理帧,时间和内容的管理工具(控制某个画面停留多久)

AnimationDrawable d = new AnimationDrawable();for(int i = 1; i < 10 ; i++){    int id = getResources().getIdentifier    ("pic"+i,"drawable",getApplication().getPackageName());    Drawable frame = getResources().getDrawable(id);    //添加帧    d.addFrame(frame,500);  }  //设置是否一次性   d.setOneShot(false);  //显示  mIv.setImageDrawable(d);

XML中可以定义跟节点animation-list的xml文件文件(定义在drawable下即可)

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"android:oneshot="false"><item    android:drawable="@drawable/pic1"    android:duration="500" /><item    android:drawable="@drawable/pic2"    android:duration="500" /></animation-list>布局加载<ImageView    android:id="@+id/m_image2"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:src="@drawable/frame_amin"/>

Animator

通过不断的修改对象的属性形成的动画(ObjectAnimator结合时间使用了对象的get/set修改属性)时间计算因子

class Util {    View v;    Util(View v) {        this.v = v;    }    public void setWidth(int width){        Log.e("m_tag","width:"+width);        v.getLayoutParams().width = width;        v.requestLayout();  //刷新布局    }    public int getWidth(){        return v.getLayoutParams().width;    }}

针对getWidth以及setWidth方法做属性修改

 Util u = new Util(btn); ObjectAnimator.ofInt(u,"width",150,300).setDuration(2000).start();
ValueAnimator表示某个值在某段时间的变化
ValueAnimator anim = ValueAnimator.ofInt(1, 100);anim.setDuration(2000);//值变化监听anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {     //整数变化的转换因子     private IntEvaluator mEvaluator = new IntEvaluator();     @Override     public void onAnimationUpdate(ValueAnimator animation) {            //获取当前值            int currentValue = (Integer) animation.getAnimatedValue();            float fraction = (float)currentValue/100;            int width = mEvaluator.evaluate(fraction,150,500);            Log.e("m_tag","width:"+width);            btn.getLayoutParams().width = width;            btn.requestLayout();        }    });    anim.start();