Android: uso de MotionEvent para arrastrar y soltar el posicionamiento de Vistas en un ViewGroup personalizado

Tengo problemas para colocar elementos de vista en un ViewGroup personalizado que he creado, específicamente en situaciones de arrastrar y soltar. Estoy apuntando a Android 2.2 y versiones posteriores, por lo que realmente no puedo usar la API de arrastrar y soltar que surgió en Android 3.

Mi ViewGroup personalizado se llama "NodeGrid" y extiende "RelativeLayout". Es onLayoutl método @ se reemplaza de manera tal que se ve así:

@Override
protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) 
{
    //pxConversion is a multiplier to convert 1 dip to x pixels.
    //We will use it to convert dip units into px units.
    Resources r = getResources();
    float pxConversion = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, r.getDisplayMetrics());

    //Layout the children of this viewgroup
    int childCount = this.getChildCount();
    for (int i = 0; i < childCount; i++)
    {
        NodeView view = (NodeView) this.getChildAt(i);

        if (view.DataContext != null)
        {
            int left = (int) (view.DataContext.get_left() * pxConversion);
            int top = (int) (view.DataContext.get_top() * pxConversion);
            int right = left + (int) (view.DataContext.get_width() * pxConversion);
            int bottom = top + (int) (view.DataContext.get_height() * pxConversion);

            view.layout(left, top, right, bottom);
        }
    }   
}

Los elementos secundarios de "NodeGrid" son del tipo "NodeView" (como puede ver en el código anterior). NodeView es simplemente una clase de vista personalizada que he creado. Contiene un miembro llamado "DataContext", que es una clase de modelo de vista que contiene algunos captadores / establecedores con información de posición sobre la instancia de NodeView en NodeGrid.

Mi clase "NodeView" captura eventos táctiles por el usuario, por lo que el usuario puede simplemente arrastrar y soltar un nodo en cualquier lugar de la cuadrícula. El controlador de eventos se ve así:

@Override
public boolean onTouchEvent(MotionEvent event) {

    if (event.getAction() == MotionEvent.ACTION_DOWN)
    {
        isBeingDragged = true;
    }
    else if (event.getAction() == MotionEvent.ACTION_UP)
    {
        isBeingDragged = false;
    }
    else if (event.getAction() == MotionEvent.ACTION_MOVE)
    {
        if (DataContext != null && isBeingDragged)
        {
            float xPosition = event.getRawX();
            float yPosition = event.getRawY();

            DataContext.set_left(xPosition);
            DataContext.set_top(yPosition);

            this.requestLayout();
        }
    }

    return true;
}

Mi problema es que la vista que se está arrastrando no está posicionada como lo esperaría en mi "NodeGrid". Parece que la posición del eje x es correcta cuando la arrastro, pero la posición del eje y está compensada por una cantidad constante de píxeles en cualquier momento. ¿Qué estaría causando esto? Intenté usar los métodos getX () y getY () en lugar de getRawX () y getRawY (), pero eso solo hace que sea peor.

No estaba seguro de si getRawX () y getRawY () me devolvían unidades px o unidades de inmersión, así que esperando que me devolviera las unidades px, intenté convertirlas en unidades de inmersión antes de asignar los nuevos valores x e y al nodo, pero eso solo disminuyó el desplazamiento, no lo eliminó.

¿Qué podría estar causando la diferencia en el lugar donde me estoy tocando y donde se está colocando el nodo?

Respuestas a la pregunta(1)

Su respuesta a la pregunta