android三种动画详解(补间动画、帧动画、属性动画)

一.补间(View)动画Tween Animation:(平移,透明,旋转,缩放,动画集合).

创建方式2种

<1>.通过java代码创建补间动画:

//fromXType:

//Animation.RELATIVE_TO_SELF:0.5f--->控件自身x轴的起点值+0.5*自身的宽度

//Animation.RELATIVE_TO_PARENT,0.5f--->自身起点的值+0.5*控件父窗体的宽度

TranslateAnimation ta = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 1.5f, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0);

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

ra.setDuration(3000); 动画的执行时间

ra.setRepeatCount(2); 设置重复的次数.

ra.setRepeatMode(Animation.REVERSE); RESTART重新开始/反转模式

ra.setFillAfter(true); 保持结束时的状态

ra.setInterpolator(new BounceInterpolator()); 特效

ivHouzi.startAnimation(ra); 开始动画

AlphaAnimation aa = new AlphaAnimation(0, 0.8f);

RotateAnimation ra = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 1f, Animation.RELATIVE_TO_SELF, 1f);

ScaleAnimation sa = new ScaleAnimation(1, 2, 1, 3, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);

动画集合:

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

AlphaAnimation aa = new AlphaAnimation(0, 0.8f);

....

AnimationSet set = new AnimationSet(true); //参数:是否共用同一个插值器效果.

set.addAnimation(aa);

    set.addAnimation(ta);

....

ivHouzi.startAnimation(set);

<2>.通过xml文件创建补间动画:

在res目录下建立一个anim文件夹,然后建立对应的xml文件.(translate/set)



      android:duration="2000"

      android:fromXDelta="0"

      android:fromYDelta="0"

      android:repeatCount="2"

      android:interpolator="@android:anim/anticipate_overshoot_interpolator"

      android:toXDelta="200"

      android:toYDelta="200">

然后在代码中:

//补间动画资源引用的方式:

Animation ta = AnimationUtils.loadAnimation(this, R.anim.trans_animation);

ivHouzi.startAnimation(ta);

//动画监听

  setAnimationListener(new AnimationListener() {

onAnimationStart//动画开始

onAnimationEnd //动画结束

            if (ivA.getVisibility() == View.VISIBLE) {

              ivA.setAnimation(null); 启动置空

                showImageB();

                ivB.startAnimation(sa2);

          }else{

              ivB.setAnimation(null);

                showImageA();

              ivA.startAnimation(sa2); }

onAnimationRepeat//动画重复

  });```

二.帧动画Frame Animation:

可以顺序的播放排列好的图片,来实现类似电影的效果

步骤:

①.建立一个drawable-hdpi文件夹,放置多张图片;

②.在drawable目录,建立一个xml文件,该文件的根节点(类型),animation-list.

在这个文件中,写多个item:drawable和duration.

③.把这个xml文件作为某个控件的background.

④.在java代码中,AnimationDrawable drawable=(AnimationDrawable)iv.getBackground();

drawable.start();

三.属性动画(Property Animation):

通过改变控件自身的属性,来使得该控件动起来.

当属性动画移动后,如果不会到原来的位置,那么点击新的位置,将接受不到Click事件,点击原来的位置可以接收到点击事件

使用方法:

<1>.java代码创建:

ObjectAnimator oa = ObjectAnimator.ofFloat(ivShow, "translationX", 0, 200, 0, 300, 0, 400);

ObjectAnimator alpha = ObjectAnimator.ofFloat(ivShow, "alpha", 0, 0.2f, 0, 0.4f, 0, 0.8f, 1);

ObjectAnimator oaX = ObjectAnimator.ofFloat(ivShow, "rotationX", 0, 360, 0, -360);

ObjectAnimator oaX = ObjectAnimator.ofFloat(ivShow, "scaleX", 1, 4, 1, -4);

alpha.setRepeatCount(2);

alpha.setDuration(3000);

alpha.start();

属性动画的动画集合有多重方式:

    AnimatorSet set = new AnimatorSet();

    ObjectAnimator transX = ObjectAnimator.ofFloat(ivShow, "translationX", 0, 200, 0, 300, 0, 400);

    ObjectAnimator alpha = ObjectAnimator.ofFloat(ivShow, "alpha", 0, 0.2f, 0, 0.4f, 0, 0.8f, 1);

    //①.动画序列

    //set.playSequentially(transX);

    //set.playSequentially(alpha);

    //②.动画集合.

    //        List list=new ArrayList<>();

    //        list.add(transX);

    //        list.add(alpha);

    //        set.playSequentially(list);

    //③.playTogether

    //set.playTogether(transX, alpha, rotateY, scaleX);

    //④.

    set.play(transX).with(alpha).after(rotateY).after(scaleX);

    set.setDuration(4000);

    set.start();

<2>.xml文件创建:

在res/文件夹下,创建一个animator文件夹,然后创建一个根节点(类型)是objectAnimator的xml文件.

//加载一个动画资源

Animator animator = AnimatorInflater.loadAnimator(this, R.animator.trans_animator);创建xml文件

//动画的执行目标

animator.setTarget(ivShow);

//2秒后开始执行

//animator.setStartDelay(2000);

animator.start();

属性动画的监听方法:

①.监听动画的执行过程:

animator.addListener(new AnimatorListenerAdapter() {<---可选方法 不可选方法 ---> AnimatorListener

Statr/End/Canal/Repeat(Pause/Resume)

        @Override

        public void onAnimationEnd(Animator animation) {

            super.onAnimationEnd(animation);

            Toast.makeText(MainActivity.this, "平移完毕了", Toast.LENGTH_SHORT).show();

        }

});

②.监听动画的取消过程:

//判断版本号

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//写数字也行19

    //判断动画是否被取消了...

    animator.addPauseListener(new Animator.AnimatorPauseListener() {

    @Override

    public void onAnimationPause(Animator animation) {  }

    @Override

    public void onAnimationResume(Animator animation) { }

    });

}

③.监听动画值的改变:

  //Animator:"爷爷"

    //ValueAnimator:"爹"--->ValueAnimator就相当于是一个"数值生成器".用来产生和管理动画运行时所需要的一些值.

    //一般不产生具体的动画效果.

    //ObjectAnimator:"孙子"--->在实际的开发过程中,用这个ObjectAnimator来实现具体的动画效果.

    //ValueAnimator anim = new ValueAnimator();

    ValueAnimator anim = (ValueAnimator) animator;

    anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

        @Override

        public void onAnimationUpdate(ValueAnimator animation) {

            float value = (float) animation.getAnimatedValue();

            Log.i("TAG", "value=" + value);

        }

    });
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • Animation Animation类是所有动画(scale、alpha、translate、rotate)的基...
    四月一号阅读 1,900评论 0 10
  • Android中动画分为三种: 逐帧动画 补间动画 属性动画 逐帧动画 逐帧动画类似于gif或是电影的原理,通过将...
    fengmlo阅读 711评论 0 2
  • 安卓动画目前共分为三种动画逐帧动画、补间动画和属性动画。 一、逐帧动画(frame-by-frame animat...
    V1tas阅读 419评论 0 1
  • 从小到大,我观察身边的人,发现那些最后能把事儿做成了的人,往往都有一个特质,那就是极端。 你一定对这样的故事不陌生...
    白玉汤阅读 1,081评论 0 5
  • 主方法: 显示当天的星期: 显示具体时间的星期: 有需要显示星期需求的,建议写在NSString的分类里,这样比较...
    施忆阅读 2,003评论 1 0