概述

魅族的滑动选择和拖拽删除是很棒的交互,但是 Flyme5 上去掉了这一特性,魅族源码中实现滑动选择是直接在 ListView 源码中修改的,目的是为了让所有三方开发者开发的列表也具备滑动选择的特性,但这样实现侵入性比较强;我花了点时间使用了些黑科技采用继承 ListView 的方式实现,这样可以在任何 Android 手机上使用这种交互形式。

看看效果

ActionMode SelectionAttacher 滑动选择

实现原理

  1. Drag&Drop 的实现方式
    • 这里是使用弹窗的方式实现,而非系统自带的 Drag-Drop:
      • 长按的时候获取当前 item 的视图并转换成一张图片, 同时弹一个悬浮窗, 把这个图片作为悬浮窗的背景
      • 然后跟着手指移动, 如果手指移动到 Menu 的区域则改变颜色, 此时放下,则回调 Drop 方法
      • 注: 这里需要指出的是悬浮窗的弹出方式是, 先弹了一个全屏的 Layout, 真正可见的悬浮窗是该 Layout 的子视图, 这样做的目的是优化动画效果, 如果不这样做, 悬浮窗滑动到边缘会有视图绘制掉帧的情况(计算器悬浮窗就有这个问题)
  2. 多选模式的 SelectionAttacher
    • 由于是继承于 ListView, 为了扩展一些功能, 就没有使用原生的 ActionMode 和原生的多选模式, 使用 CHOICE_MODE_MULTIPLE 来模拟了 CHOICE_MODE_MULTIPLE_MODAL;
    • 这里 SelectionAttacher 包含 HeaderTransformer 和 FooterTransformer 支持自定义, 可以实现 Flyme5.0 的交互,Transformer 添加到 Activity 的 DecorView 中
  3. 滑动选择
    • 实现 Google I/O 2015 发布的 Photos 的交互, 实现起来也很简单, 就是多选长按滑动后, 去选中滑动掠过的 item,自定义 Layout 重写 setActivated 方法,来实现缩放动画

代码

https://github.com/gavinliu/Android-AbsListView-Drag-And-Drop