【问题标题】:Flickering ImageView When Dropped掉落时闪烁的 ImageView
【发布时间】:2018-12-07 00:14:04
【问题描述】:

我正在尝试将 ImageView 拖放到特定坐标。它按照我的预期移动,但在 Drop 时,图像会在一瞬间产生一次闪烁。谁能告诉我我做错了什么?

这不是我消除闪烁的唯一尝试。我尝试了不同的布局,使用 LayoutParams 设置 ImageView 的位置,使用 ConstraintSet 在 ConstraintLayout 中设置位置,使用和删除 invalidate()。把ImageView都移动好,都导致这个闪烁:

(所有水滴都会产生闪烁......有些没有被捕获)

我觉得我不明白图像在屏幕上的绘制或重绘方式?

我忽略了一些东西,或者有些东西我不明白。如有任何见解,我将不胜感激。

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;
    }
}

【问题讨论】:

  • 如果将view.invalidate();DragEvent.ACTION_DROP 开关盒中删除会有帮助吗?
  • 感谢@Aaron 的回复。删除 view.invalidate() 不会删除闪烁。

标签: android


【解决方案1】:

在这方面工作了一段时间。我认为DragShadowBuilder 导致了这个问题......或者至少是我使用它的方式。

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

不再闪烁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    相关资源
    最近更新 更多