关于ViewDragHelper动态addview的问题

使用ViewDragHelper自定义的Layout实现拖拽功能确实很方便,怎么使用就不写了,记录一下坑,关于ViewDragHelper使用addView来动态添加View的时候,当第一个View 拖动之后,再添加一个View时,第一个View 又回到了起点位置,跟踪addView发现会调用requestLayout();
invalidate(true);
两个方法,知道了问题 就好解决了
首先先创建一个Map来存储已经添加的View的位置

private Map<View, DragLayoutParams> paramsMap = new HashMap<>();

第二在onViewReleased回调中保存位置

             @Override
            public void onViewReleased(View releasedChild, float xvel, float yvel) {
                super.onViewReleased(releasedChild, xvel, yvel);
                DragLayoutParams params = new DragLayoutParams();
                params.mLeft = releasedChild.getLeft();
                params.mTop = releasedChild.getTop();
                params.mRight = releasedChild.getRight();
                params.mBottom = releasedChild.getBottom();
                paramsMap.put(releasedChild, params);
            }

第三重写onLayout方法按照存储的位置来layout子View

@Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        final int count = getChildCount();
        for (int i = 0; i < count; i++) {
            View child = getChildAt(i);
            if (child.getVisibility() != GONE) {
                DragLayoutParams params = paramsMap.get(child);
                if (params != null) {
                    child.layout(params.mLeft, params.mTop, params.mRight, params.mBottom);
                } else {
                    child.layout(0, 0, child.getMeasuredWidth(), child.getMeasuredHeight());
                }
            }
        }
    }

这样再次发生layout的时候 也不会回到原点了

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值