【发布时间】: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