记录一些设计上的事儿

不知道今天能不能写完一篇完整的文章,除非没人打扰我。设计模式

书归正传!动画

前段时间给人家作了一个应用,有一个相似于展现详情信息的界面,以下图所示,我想说一下关于动画对象的事,ui

在应用中使用动画时很是常见的,我本身比较喜欢加一些小的动画来让应用更加的生动,调节一下气氛。如今用的最多的Animator这个对象,以前用Animation,慢慢的被淘汰了,由于它只能改变试图,却没法真正的改变对象的属性(表面上是动了)。设计

因此,Animator是我不二的选择。对象

第一次用这个对象的时候觉的特别的好用,又一次我把一个物体从屏幕的上面移动到了下边,并且物体的属性是实实在在的被改变了,而后需求让我再一次的让物体回到原位(仍是以动画的形式,至关于倒着播放一次),因而我开始找back()或者reverse()这样的方法,可是,没有!我尚未放弃,我查看了和Animator相关的类,包括AniamtorSet,Aniamtor.Builder等,都好像没有直接能够达到目的的方法,这样我该放弃了,必定是要从新建立animator对象的。blog

  上面一次动画的显示牵动了6个对象,也就是建立出6个Animator对象一块儿执行或在某个地方触发执行,当列表被推到上面后,动画执行结束,当列表被拉下后,以前的动画要被从新反着执行一次。队列

  思考:资源

  一、6个对象,起码要有6组动画起始数据要保存,难道都要做为成员变量放在一个类里面?起名字就够累的。get

  二、建立了6个动画对象在所不免,可是每次动画都要从新建立一次吗?尤为是镜像返回的动画,可不能够重复利用建立好的动画对象,把起始和结束的值相互换一下位置就能够了呢?io

  带着以上的问题,为了让代码更加的紧凑和有良好的设计感,我作了些封装,只是封装和一些经常使用的设计。

  首先,我设计了一个类,起名叫作AnimtorsHolder,

  

  首先它是个单例,里面只有两个私有成员变量,一个是它本身自己,另一个是ArrayList容器,里面放的是AnimatorObject,大家都见过ObjectAnimator,可是没加过它吧,顺便多一嘴,ValueAnimator要比ObjectAnimator更加节省资源(播放动画卡不卡很明显)多用ValueAnimator吧。这个AnimatorObject也是我设计的类,放到后面说。

  再看AnimtorsHolder类,有四个公有方法,getInstance返回一个单例,add方法是向ArrayList里添加对象,只用add的是(Object obj),看到这里应该知道用到那几个设计模式了吧,嘿嘿。

  public void add(AnimatorObject object) {
    animatorObjects.add(object);
  }

  getAnimators方法

  public ArrayList<Animator> getAnimators() {
    ArrayList<Animator> animators = new ArrayList<Animator>();
    for (AnimatorObject object : animatorObjects) {
      animators.add(object.getAnimator());
    }
    return animators;
  }

  这个方法其实就是建立一个装Animator的容器,将外部的成员容器遍历一遍从AnimatorObject获取到Animator对象

  getBackAnimators(),同样,先建立一个装Animator的容器,将外部的成员容器遍历一遍从AnimatorObject获取到Animator对象,而且获取到起始和结束的值(改进,把这些值放入到队列里,这样正序倒序随意取)反着赋值,这里因为不肯定是Int仍是Float,为此还判断了一下,这样处理事后,容器里存放的Animator对象的属性就是反着的了,而且经过这样的设计,也没有从新建立Aniamtor对象。

  public ArrayList<Animator> getBackAnimators() {

    ArrayList<Animator> animators = new ArrayList<Animator>();
    for (AnimatorObject object : animatorObjects) {
      ValueAnimator animator = (ValueAnimator) object.getAnimator();
      Object start = object.getStart();
      Object end = object.getEnd();
      if(start instanceof Integer) {
        animator.setIntValues((int)end, (int)start);
      } else if (start instanceof Float){
        animator.setFloatValues((float)end, (float)start);
      }
      animators.add(animator);
    }
    return animators;
  }

 

  看如何使用的

  /*初始化AnimatorsHolder*/ 

  animators = AnimatorsHolder.getInstance();

  /*建立一个动画对象*/ 

  ValueAnimator moveY = ValueAnimator.ofInt(start, end);


  /*调用AnimatorsHolder的add方法,而且建立一个AnimatorObject对象他是个泛型(改进:应该使用动态参数的设计)*/

  animators.add(new AnimatorObject<Integer>(moveY, start, end));

 

  /*播放动画*/

  AnimatorSet palySet = new AnimatorSet();

  palySet.setDuration(300);
  palySet.playTogether(animators.getAnimators());
  palySet.start();

  若是想把以前建立的动画反着播一遍,这样。

  AnimatorSet palySet = new AnimatorSet();
  palySet.setDuration(300);
  palySet.playTogether(animators.getBackAnimators());
  palySet.start();

  就这样简单的几句就搞定。是否是很节省资源。

相关文章
相关标签/搜索