一个支持item交换动画的ListView

这篇博客带来一个支持item交换动画的ListView。话不多说,先上效果。实现的效果就是,通过手动操作交换ListView中两个item的位置,并在交换时附带移动交换效果。之前在知乎的app上看到过这种效果,顺手写了一个,搬运上来跟大家分享一下。核心组件就一个 TranslationListView.java :public class TranslationListView extends ListView { /** * 速度模板,影响视图移动时的速度...
摘要由CSDN通过智能技术生成

 

这篇博客带来一个支持item交换动画的ListView。话不多说,先上效果。

实现的效果就是,通过手动操作交换ListView中两个item的位置,并在交换时附带移动交换效果。之前在知乎的app上看到过这种效果,顺手写了一个,搬运上来跟大家分享一下。

 

核心组件就一个 TranslationListView.java :

public class TranslationListView extends ListView {

    /**
     * 速度模板,影响视图移动时的速度变化
     *
     * MODE_LINEAR                 // 线性变化模式
     * MODE_ACCELERATE             // 加速模式
     * MODE_DECELERATE             // 减速模式
     * MODE_ACCELERATE_DECELERATE  // 先加速后加速模式
     *
     */
    public static final int MODE_LINEAR = 0x001;
    public static final int MODE_ACCELERATE = 0x002;
    public static final int MODE_DECELERATE = 0x003;
    public static final int MODE_ACCELERATE_DECELERATE = 0x004;


    /**
     * 可设置选项
     */
    // 移动动画储持续时间,单位毫秒
    private long duration = 300;

    // 速度模板
    private int speedMode = MODE_ACCELERATE_DECELERATE;

    // 移动监听接口
    private OnTranslateListener translateListener;


    // 移动锁定标识
    private boolean isLock;


    public TranslationListView(Context context) {
        super(context);
    }

    public TranslationListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public TranslationListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    /**
     * 将指定项上移一格
     *
     * @param position 指定项的序坐标
     */
    public void moveUp(int position) {
        translate(position, position - 1);
    }

    /**
     * 将指定项下移一格
     *
     * @param position 指定项的坐标
     */
    public void moveDown(int position) {
        translate(position, position + 1);
    }

    /**
     * 执行移动方法
     *
     * @param fromPosition // 起始坐标
     * @param toPosition   // 终点坐标
     */
    private void translate(final int fromPosition, final int toPosition) {
        if (isLock) {
            return;
        }

        View fromView = getChildAt(fromPosition - getFirstVisiblePosition());
        View toView = getChildAt(toPosition - getFirstVisiblePosition());

        if (fromView == null || toView == null) {
            return;
        }

        float distance = toView.getY() - fromView.getY();
        ObjectAnimator fromAnimator = ObjectAnimator.ofFloat(fromView, "translationY", 0, distance);
        ObjectAnimator toAnimator = ObjectAnimator.ofFloat(toView, "translationY", 0, -distance);

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.playTogether(Arrays.asList(new Animator[]{f
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录: 01.《交换那些事儿》- 基础维护篇 - 流统 02.《交换那些事儿》- 基础维护篇 - 镜像 03.《交换那些事儿》- 基础维护篇 - IRF升级指导 04.《交换那些事儿》- 基础维护篇 - IRF替换指导 05.《交换那些事儿》- 基础维护篇 - 机房环境不良导致设备故障案例 06.《交换那些事儿》- 基础维护篇 - IPv6地址分类及配置方法 07.《交换那些事儿》- 基础维护篇 - IPv6邻居发现及状态迁移机制 08.《交换那些事儿》- 基础维护篇 - EPON网络安装维护小贴士 09.《交换那些事儿》- 基础维护篇 - 揭秘STP Dispute保护机制 10.《交换那些事儿》- 基础维护篇 - 常用STP保护功能 11.《交换那些事儿》- 基础维护篇 - STP TC问题排查与优化 12.《交换那些事儿》- 基础维护篇 - 常见问题答复集(一) 13.《交换那些事儿》- 基础维护篇 - 常见问题答复集(二) 14.《交换那些事儿》- 基础维护篇 - 常见问题答复集(三) 15.《交换那些事儿》- 基础维护篇 - 常见问题答复集(四) 16.《交换那些事儿》- 基础维护篇 - 常见问题答复集(五) 17.《交换那些事儿》- 基础维护篇 - 常见问题答复集(六) 18.《交换那些事儿》- 基础维护篇 - 常见问题答复集(七) 19.《交换那些事儿》- 基础维护篇 - 交换机License相关小知识 20.《交换那些事儿》- 技术专题篇 - VXLAN概述及使用场景 21.《交换那些事儿》- 技术专题篇 - 二层手工VXLAN基本配置 22.《交换那些事儿》- 技术专题篇 - EVPN路由消息及三类RT功能介绍 23.《交换那些事儿》- 技术专题篇 - DRNI基本概念及流量转发 24.《交换那些事儿》 -技术专题篇 - DRNI部署网络模型介绍

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值