删除时闪烁的ImageView

时间:2018-11-08 20:47:07

标签: android

我正在尝试将ImageView拖放到特定坐标。它按照我的预期移动,但是在“下降”时,图像会瞬间产生单个闪烁。有人可以告诉我我在做什么错吗?

这不是我消除闪烁的唯一尝试。我尝试了不同的布局,使用LayoutParams设置ImageView的位置,使用ConstraintSet设置ConstraintLayout中的位置,使用并删除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;
    }
}

1 个答案:

答案 0 :(得分:0)

研究了一段时间。我认为DragShadowBuilder是造成此问题的原因……或者至少是我使用它的方式。

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

不再闪烁。