当拖放时图像闪烁

3

我试图将ImageView拖放到特定的坐标上,它移动得像我预期的那样,但在放下时,图片会短暂地闪烁一次。有人能告诉我我做错了什么吗?

这不是我唯一试图消除闪烁的尝试。 我尝试过不同的布局,使用LayoutParams来设置ImageView的位置,在ConstraintLayout中使用ConstraintSet设置位置,使用和删除invalidate()函数等等。所有都可以移动ImageView,但结果都会产生这种闪烁:

Example of the flicker

(所有放下操作都会产生闪烁...有些并没有被捕捉到)

我感觉可能是我不理解图片在屏幕上的绘制或重绘方式?

我可能忽略了某些东西或者有一些我不理解的东西。我会感激任何洞察力。

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ImageView iv = findViewById(R.id.home_image_view);
    ConstraintLayout constraintLayout = (ConstraintLayout) iv.getParent();

    iv.setOnTouchListener(new MyTouchListener());
    constraintLayout.setOnDragListener(new MyDragListener());
}

private final class MyTouchListener implements View.OnTouchListener{

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            ClipData data = ClipData.newPlainText("", "");
            View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(
                    v);
            v.startDragAndDrop(data, shadowBuilder, v, View.DRAG_FLAG_OPAQUE);

            v.setVisibility(View.INVISIBLE);
            return true;
        } else {
            return false;
        }
    }
}

class MyDragListener implements View.OnDragListener {

    @Override
    public boolean onDrag(View v, DragEvent event) {
        int action = event.getAction();
        View view = (View) event.getLocalState();

        switch (action) {
            case DragEvent.ACTION_DRAG_STARTED:
                break;

            case DragEvent.ACTION_DRAG_ENTERED:

                break;

            case DragEvent.ACTION_DRAG_EXITED:

                break;

            case DragEvent.ACTION_DRAG_LOCATION:

                break;

            case DragEvent.ACTION_DROP:
                view.setX(event.getX() - (view.getWidth()/2));
                view.setY(event.getY() - (view.getHeight()/2));
                view.invalidate();
                view.setVisibility(View.VISIBLE);

                break;

            case DragEvent.ACTION_DRAG_ENDED:

                break;

            default:
                break;
        }
        return true;
    }
}

如果从DragEvent.ACTION_DROP开关语句中删除view.invalidate();会有帮助吗? - Aaron
感谢您的回复,@Aaron。 移除 view.invalidate() 不会消除闪烁。 - jnutttzzz
1个回答

0

这个问题我已经研究了一段时间。我认为DragShadowBuilder可能是引起问题的原因...或者至少是我使用它的方式有问题。

我的解决方案是从代码中删除它,并通过使用view.setLayoutParams()在触摸事件中更新视图的边距来改变视图的位置。

不再出现闪烁。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接