Когда я удерживаю свой ImageView
, чтобы перетащить его по экрану, ImageView
становится невидимым, и перетаскиваемая версия ImageView
появится на экране с центром появившегося вида под кончиком моего пальца.;это не органично.Я хочу, чтобы перетаскиваемая версия вида появлялась прямо над ImageView
, а не под моим кончиком пальца.
Например, если мой ImageView
- это Ace of Diamonds поверх колоды карт, и я хочу перетащить карту из колоды, карта должна плавно перетаскиваться из колоды, а не перемещаться сама по себепод моим пальцем, а затем перетащите, если это имеет смысл.
Это мой код для перетаскиваемого ImageView;Я не уверен, как сделать анимацию перетаскивания более плавной, как описано выше.
public class DragView2 extends AppCompatImageView
implements View.OnDragListener, View.OnTouchListener{
private static final String TAG = DragView2.class.getSimpleName();
public DragView2(Context context)
{
super(context, null);
this.setOnTouchListener(this);
this.setOnDragListener(this);
}
public DragView2(Context context, AttributeSet attrs)
{
super(context, attrs, 0);
this.setOnTouchListener(this);
this.setOnDragListener(this);
}
@Override
public boolean onTouch(View view, MotionEvent motionEvent)
{
switch (motionEvent.getAction())
{
case ACTION_DOWN:
Log.d(TAG, "ACTION_DOWN");
ClipData data = ClipData.newPlainText("", "");
DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
this.setVisibility(View.INVISIBLE);
view.startDrag(data, shadowBuilder, view, 0);
return true;
}
return false;
}
@Override
public boolean onDrag(View view, DragEvent event)
{
final View viewToDrag = (View) event.getLocalState();
switch (event.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
Log.d(TAG,"ACTION_DRAG_STARTED");
break;
case DragEvent.ACTION_DRAG_ENTERED:
Log.d(TAG,"ACTION_DRAG_ENTERED");
break;
case DragEvent.ACTION_DRAG_EXITED:
Log.d(TAG,"ACTION_DRAG_EXITED");
break;
case DragEvent.ACTION_DROP:
Log.d(TAG,"ACTION_DROP");
break;
case DragEvent.ACTION_DRAG_ENDED:
Log.d(TAG,"ACTION_DRAG_ENDED");
view.post(new Runnable() {
public void run() {
viewToDrag.setVisibility(View.VISIBLE);
}
});
break;
default:
Log.d(TAG,"default");
break;
}
return true;
}
}