Layout flicker when dragging view in its MotionEvent.ACTION_MOVE android

1.4k views Asked by At

Here is a picture of what I'm trying to do:

enter image description here

So, I want to resize a single cell while dragging resize anchors (black quads) which are ImageViews. To do this I attached custom onTouchListener to them that does next in MotionEvent.ACTION_MOVE:

  • calculate drag offset
  • set cell height/width based on this offset
  • reposition anchor point by changing it's layout params

The outcome of this is that the cell resizes but there is some king of flicker, more like shaking left/right or up/down, by some small offset.

My guess is that the problem comes when it catches move event, then I manualy change position of anchor and then, when it catches move event again it doesn't handle that change well...or something

I have an idea to put invisible ImageViews under each anchor and do resize based on their movement but do not move that anchor while draging. Then when I relese it, it lines up with coresponding visible anchor. But this is more hacking than solution :)

And finally, does anubody know why is this happening?

EDIT: Here is the code where I'm handlign move event:

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();

and here is where I reposition it:

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

There are 0 answers