Как исправить начальное положение вида, чтобы перетащить - PullRequest
0 голосов
/ 23 ноября 2018

Когда я удерживаю свой 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;
    }
}       

1 Ответ

0 голосов
/ 23 ноября 2018

Указатель на решение.

Я расширил класс View .Используйте следующий код, чтобы успешно перетащить объект в правильные координаты.

@Override
public boolean onTouchEvent(MotionEvent event)
{
    float oldX, oldY, newX, newY, originalX, originalY;

    switch (event.getAction())
    {
        case MotionEvent.ACTION_DOWN:
            oldX = event.getX();
            oldY = event.getY();
            originalX = oldX;
            originalY = oldY;
            break;
        case MotionEvent.ACTION_MOVE:
            newX = event.getX();
            newY = event.getY();
            updatePositions(oldX, oldY, newX, newY);
            oldX = newX;
            oldY = newY;
            invalidate();
            break;
        case MotionEvent.ACTION_UP:
            newX = event.getX();
            newY = event.getY();

           //  USE ANY OF THE FOLLOWING
           //  updatePositions(oldX, oldY, newX, newY);
           //  updatePositions(originalX, originalY, newX, newY);


            oldX = newX;
            oldY = newY;
    }
}

private void updatePositions(float pt1, float pt2, float pt3, float pt4) {

  // code to change the position of the position

}

Создайте переменные класса из 6 переменных и используйте Toast для отображения позиций.Надеюсь, что это намекает на решение:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...