2012-03-22 18 views
5

El código siguiente es mi intento de enviar mMyView a la parte delantera o la parte trasera del conjunto de los niños de mPivotParent por lo que se representará en la parte superior o detrás de los otros. Ocultar la vista se no ser suficiente en mi caso.Cómo ajustar mediante programación orden z de Vistas

mPivotParent es un FrameLayout.

En cuanto a mPivotParent.mChildren muestra que mi código de abajo "funciona" en la que el orden está siendo ajustado correctamente. Sin embargo, no tiene impacto en el orden z. No solo esto, sino que la velocidad de fotogramas se vuelve acumulativamente más lenta y lenta cuanto más veces se llama al código de reposicionamiento. Hay 4 niños en total y mPivotParent.mChildrenCount permanece en 4 durante todo el tiempo esperado.

estoy focalización API Nivel 7.

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    Display display = getWindowManager().getDefaultDisplay(); 

    float x = event.getRawX(); 
    float sWidth = (int)display.getWidth(); 
    float xLerpFromCenter = ((x/sWidth) - .5f) * 2.f;    // [-1, 1] 
    mRotateAnimation.mfLerp = xLerpFromCenter; 

    if(xLerpFromCenter < -0.2f && mPivotParent.getChildAt(0) != mMyView) 
    { 
     mPivotParent.removeView(mMyView); 
     mPivotParent.addView(mMyView, 0); 
     refreshEverything(); 
    } 
    else if(xLerpFromCenter > 0.2f && mPivotParent.getChildAt(0) == mMyView) 
    { 
     mPivotParent.removeView(mMyView); 
     mPivotParent.addView(mMyView, mPivotParent.getChildCount() - 1); 
     refreshEverything(); 
    } 

    return super.onTouchEvent(event); 
} 

private void refreshEverything() 
{ 
    for(int i = 0; i < mPivotParent.getChildCount(); ++i) 
    { 
     mPivotParent.getChildAt(i).invalidate(); 
     mPivotParent.getChildAt(i).requestLayout(); 
    } 
    mPivotParent.invalidate(); 
    mPivotParent.requestLayout(); 
} 

Respuesta

5

solución parcial

Aquí hay un truco algo ineficaz, pero funciona para mi propósito, que es tomar el primer elemento y enviar en la parte posterior, manteniendo todos los demás artículos en el mismo orden.

private void putFrontAtBack() 
{ 
    for(int i = 0; i < mPivotParent.getChildCount() - 1; ++i) 
    { 
     mPivotParent.getChildAt(0).bringToFront(); 
    } 
    refreshEverything(); 
} 

Nota: esto no funciona en el caso general de arbitraria reordenamiento.

1

probar esto.

private void reorder(int[] order) 
{ 
    if(order == null || order.length != mPivotParent.getChildCount()) return; 
    for(int i = order.length - 1; i >= 0; i--) 
    { 
     mPivotParent.getChildAt(order[i]).bringToFront(); 
    } 
    refreshEverything(); 
} 

Este código proporciona una reordenación arbitraria. La matriz de enteros "orden" se utiliza para indicar la nueva orden de cada punto de vista, donde el orden [n] = x significa el nuevo orden de childAt (x) es n.

Cuestiones relacionadas