(译)如何使用 Micro-Transitions 在 To-Do List 中实现流畅的动画

原文链接: https://yalantis.com/blog/how-we-used-micro-transitions-for-smooth-android-to-do-list-animations/
译者: Eirture

列表(Lists)在各种应用中都是重要的控件,包括时间管理、购物和健身等各种应用。

To-do list作为一个独自的类别,经常能在意志(motivation)类应用中找到它,它帮助人们管理时间,避免拖延症,提高效率。To-do list 的工作模式是去提醒人们完成排满的日程。

在Yalantis近期的一个项目,我们有一个小任务,是创建一个 To-do list ,挑战在于我们要做的与众不同并且能给用户带来乐趣,目的是我们需要一些工具,使管理任务列表变得快速和直观。

我们想让用户感觉与他们在屏幕上交互的,就好像是生活中真实立体的物品一样。

使用微变换(microtransitions),能让一个对象平滑的过渡到另一个对象。
微变换的使用再一次证明,使用一些小的动画会有画龙点睛的效果,让看似简介的设计更有新鲜感,也会带来更真实的体验。

在定下这个设计理念后,我们与工程师一起来实现它。

我们不得不把动画拆成可以单独工作的几个部分:“加”的动画、“光标”的动画、添加列表项的动画,以及列表项的移动动画。

如何实现“加”按钮的动画

在屏幕上实现从“加号”变成“光标”的小动画对开发部分来说是一个挑战。我们在控件中使用 ViewPropertyAnimationCompat 类来实现所有的动画,使用 ‘rotation()’ 方法来旋转视图

public void rotate(@Nullable Runnable endAction) {
   AnimationUtil.rotate(mHorizontalView, 180, endAction);
}
public static void rotate(View view, int value, @Nullable Runnable endAction) {
   ViewPropertyAnimatorCompat animator = ViewCompat.animate(view).rotation(value);
   if (endAction != null) {
       animator.withEndAction(endAction);
   }
   animator.setDuration(Constant.ANIM_DURATION_MILLIS).start();
}

光标动画

有挑战的部分是,在相同的位置上,让“加号”变换成输入框内部的光标。

Android EditText 控件默认的光标不能达到这个目的,因为它不容易控制。因此我们用一个自定义的光标来实现它。我们自定义了一个BarEditText控件:包含了默认的 EditText 和在它上面的作为光标的视图。

当用户输入时,如何移动光标的位置

RxTextView.textChanges(mEditText).subscribe(new Action1<CharSequence>() {
   @Override
   public void call(CharSequence charSequence) {
       if (!TextUtils.isEmpty(charSequence)) {
           moveCursor();
       } else {
           moveToStart();
      }
   }
});

private void moveCursor() {
   mCursor.setX(getCursorPosition() + mCursor.getWidth() * 1.5f);
   mCursor.setY(mEditText.getY());
}
private float getCursorPosition() {
   Layout layout = mEditText.getLayout();
   if (layout == null) {
       return 0;
   }
   int position = mEditText.getSelectionStart();
   return layout.getPrimaryHorizontal(position);
}

public void moveToStart() {
   mCursor.setX(mEditText.getX());
   mCursor.setY(mEditText.getY());
}

我们使用了 RxBinding 来接收用户在输入框内改变文本的事件。

因此可以通过 'call()' 方法的参数拿到编辑的文本。如何文本存在,通过 'getCursorPosition()' 方法来计算自定义光标的位置,然后改变自定义光标的X、Y值来改变光标位置。

如何实现列表添加条目的动画

当用户输入文字并且点击‘添加’按钮时,输入框应当平滑的向下移动,变成 to-do 列表的首项。我们创建一个自定义视图来实现这个动画,其中包含了 RecyclerView 和一个顶部的视图,这个顶部视图像首部一样,其中包含了带光标 (BarEditText) 的自定义 EditText 。因此,当用户点击"添加"时,这个首部视图移动到 RecyclerView 的首项位置的上方,与此同时,添加一个新的条目,但是在首部移动期间它是不可见的。完成之后,再让列表首项可见,并且开始执行首部入场动画。

如何实现列表项动画

为了实现列表项动画,我们不得不创建一个自定义列表项动画,将移动动画分成了几个重要的步骤:

  1. 升起当前点击的列表项
  2. 移动到指定的位置
  3. 放下它

每一步都要一步接一步,因此我们使用** ‘withEndAction()’** 方法来等待上一部分的动画完成,再去执行下一个动画。

private void animateMoveImpl(final BatAdapter.ViewHolder holder) {
   final View view = holder.itemView;
//needed to increase checked item only, not all moved items
//仅升起需要的列表项,不是所有
   final boolean isMainView = isMainListItem(holder.getItemPosition());
//increasing checked item.  升起被点击的列表项
   ViewCompat.animate(view).scaleX(isMainView ? 1.05f : 1).scaleY(isMainView ? 1.05f : 1)
           .setDuration(mAnimationType == AnimationType.MOVE ? Constant.ANIM_DURATION_MILLIS : 0)
           .withEndAction(new Runnable() {
               @Override
               public void run() {                  
//moving item to needed position.   移动到需要的位置
ViewCompat.animate(view).translationX(0).translationY(0).setDuration(Constant.ANIM_DURATION_MILLIS)
                           .withEndAction(new Runnable() {
                               @Override
                               public void run() {
                                   if (isMainListItem(holder.getItemPosition())) {
            //descreasing checked item.       放下被点击的列表项
                                       ViewCompat.animate(view).scaleX(1).scaleY(1).start();
                                       mPosition = -1;
                                   }
                              }
                           });

我们需要用 ‘isMainView’ 字段来存储用户点击列表项的位置。用于帮助我们区分被点击的和普通的列表项。如果不用 ‘isMainView’,所有的列表项都会被提升起来。

精心设计的 to-do list 可以提升用户体验,即使在一个简洁的产品也应该添加一个优秀的交互。不要犹豫,吸取我们的经验,应用在你自己的 to-do list 上。

查看我们 To-Do List 的动画:

Dribbble

GitHub

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,787评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,065评论 4 62
  • 我们每个人都会有这样的经历,情绪有时不受我们的控制的表现出来。但是,真的是这样的吗? 试想一下,你要发脾气...
    snailwww阅读 256评论 0 2
  • 要是能多些幻想就好了 你也不会呆呆的望着天 飘来一朵云 飘走一朵云 收割者来了 热闹的蝉鸣鸟叫 很多时候 ...
    Doobe阅读 170评论 0 0
  • "聋子听见哑巴说瞎子看见了爱情"…… 芥末小姐人如其名,性格直爽很有冲劲儿的女汉子。论其颜值不漂亮也不丑,正常人范...
    两百斤的瘦子阅读 709评论 0 2