在其MotionEvent.ACTION_MOVE android中拖动视图时布局闪烁

时间:2015-06-26 11:51:36

标签: android drag-and-drop resize layoutparams

这是我想要做的事情的照片:

enter image description here

所以,我想在拖动调整大小的锚点(黑色四边形)时调整单个单元格的大小,这些锚点是ImageViews。为此,我将自定义onTouchListener附加到MotionEvent.ACTION_MOVE中的下一个:

  • 计算拖曳偏移量
  • 根据此偏移设置单元格高度/宽度
  • 通过更改它的布局参数来重新定位锚点

这样做的结果是细胞大小调整,但有一些闪烁之王,更像是左/右或上/下摇动,有一些小偏移。

我的猜测是问题来自于捕获移动事件,然后我手动改变锚点的位置然后,当它再次捕获移动事件时它不会很好地处理这个改变......或者某事

我有一个想法是在每个锚点下放置不可见的ImageViews,并根据它们的移动调整大小,但在拖动时不要移动该锚点。然后,当我解除它时,它与相应的可见锚点对齐。但这比解决方案更具攻击性:)

最后,anubody知道为什么会这样吗?

编辑: 这是我手动移动事件的代码:

float dragY = event.getRawY() - resizePreviousPositionY;

                    LinearLayout.LayoutParams componentParams = (LinearLayout.LayoutParams)selectedComponent.layout.getLayoutParams();
                    LinearLayout parrent = (LinearLayout)selectedComponent.layout.getParent();
                    View topSibling = parrent.getChildAt(parrent.indexOfChild(selectedComponent.layout) - 1);
                    LinearLayout.LayoutParams topSiblingParams = (LinearLayout.LayoutParams)topSibling.getLayoutParams();

                    if(dragY > 0 && selectedComponent.layout.getHeight() > 100 ||
                            dragY < 0 &&  topSibling.getHeight() > 100)
                    {
                        componentParams.height = selectedComponent.layout.getHeight() - (int)dragY;
                        topSiblingParams.height = topSibling.getHeight() + (int)dragY;
                        //bottomSiblingParams.height = bottomSibling.getHeight();
                        selectedComponent.layout.setLayoutParams(componentParams);

                        repositionResizeAnchors(selectedComponent);
                    }
                    resizePreviousPositionY = event.getRawY();

这是我重新定位的地方:

if(((LinearLayout)viewHolder.layout.getParent()).getOrientation() == LinearLayout.VERTICAL)
        {
            leftMargin = ((LinearLayout)viewHolder.layout.getParent()).getLeft() + 
                    viewHolder.layout.getLeft() + viewHolder.layout.getWidth()/2;
        }
        else
        {
            leftMargin = viewHolder.layout.getLeft() + viewHolder.layout.getWidth()/2;
        }
        topMargin = viewHolder.layout.getTop();
        params = (RelativeLayout.LayoutParams)resizeTop.getLayoutParams();
        params.leftMargin = leftMargin - dpToPx(resizeAnchorRadius/2);
        params.topMargin = topMargin - dpToPx(resizeAnchorRadius/2);
        resizeTop.setLayoutParams(params);

0 个答案:

没有答案