我正在尝试将ImageView拖放到特定坐标。它按照我的预期移动,但是在“下降”时,图像会瞬间产生单个闪烁。有人可以告诉我我在做什么错吗?
这不是我消除闪烁的唯一尝试。我尝试了不同的布局,使用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;
}
}
答案 0 :(得分:0)
研究了一段时间。我认为DragShadowBuilder
是造成此问题的原因……或者至少是我使用它的方式。
我的解决方案是从代码中删除它,并通过使用view.setLayoutParams()
更新触摸事件的边距来更改视图的位置。
不再闪烁。