我试图将ImageView拖放到特定的坐标上,它移动得像我预期的那样,但在放下时,图片会短暂地闪烁一次。有人能告诉我我做错了什么吗?
这不是我唯一试图消除闪烁的尝试。 我尝试过不同的布局,使用LayoutParams来设置ImageView的位置,在ConstraintLayout中使用ConstraintSet设置位置,使用和删除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;
}
}
DragEvent.ACTION_DROP
开关语句中删除view.invalidate();
会有帮助吗? - Aaronview.invalidate()
不会消除闪烁。 - jnutttzzz