2012-03-13 20 views
10

tengo un código en ICS para tabletas. Quiero agregar una Imageview dinámicamente a un fragmento. El fragmento ya contiene preferencelist. El código para agregar la vista dinámicamente es el siguiente. Estoy codificando esta funcionalidad de arrastrar y soltar. Esta parte del código se toma del archivo TouchInterceptor.java de la aplicación de música Android.adición de vista dinámico utilizando WindowManager.addView

mWindowParams = new WindowManager.LayoutParams(); 
mWindowParams.gravity = Gravity.TOP ; 
mWindowParams.x = 0; 
mWindowParams.y = y 
mWindowParams.height = WindowManager.LayoutParams.WRAP_CONTENT; 
mWindowParams.width = WindowManager.LayoutParams.WRAP_CONTENT; 
mWindowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 
    | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 
    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
    | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; 
mWindowParams.format = PixelFormat.TRANSLUCENT; 
mWindowParams.windowAnimations = 0; 

ImageView v = new ImageView(mContext); 
int backGroundColor = mContext.getResources().getColor(R.color.bg_background); 
v.setBackgroundColor(backGroundColor); 
v.setImageBitmap(bm); 

mWindowManager = (WindowManager)mContext.getSystemService("window"); 
mWindowManager.addView(v, mWindowParams); 

I estoy especificando la coordenada x de PARAM windowlayout como 0. Eventthen cuando se visualiza la vista, itstead de visualizar desde el lado izquierdo del fragmento (el panel derecho), la vista se visualiza desde mediados de la derecha y se extiende al panel derecho. Que estoy haciendo mal ? ¿Qué hay que hacer para corregir esto?

Respuesta

8

establecer la gravedad para Gravity.TOP | Gravity.LEFT

2

Yo estoy trabajando exatly en el mismo código tomado del antiguo proyecto Souce abierta Google Music intento.

Al igual que supongo, que tenían un TouchInterceptor en un fragmento. Mi problema es que el fragmento no ocupa toda la pantalla, tiene otro fragmento a la izquierda.

He intentado un montón usando mWindowParams.gravity para poder especificar una absoluta x, y, pero no pude encontrar una solución. Eventualmente lo resolví con mWindowParams.horizontalMargin.

Este es el código que se me ocurrió:

private int getAbsoluteLeft(){ 
    ViewGroup parent; 
    View child = this; 
    int left_absolute_position = 0; 
    try{ 
     while((parent = (ViewGroup) child.getParent()) != null) { 
      left_absolute_position += child.getLeft(); 
      child = parent; 
     } 
    }catch(ClassCastException e){ 
    } 

    return left_absolute_position; 
} 

private void startDragging(Bitmap bm, int x, int y) { 
    stopDragging(); 
    //build the view 
    Context context = getContext(); 
    ImageView v = new ImageView(context); 
    //int backGroundColor = context.getResources().getColor(R.color.dragndrop_background); 
    //v.setBackgroundColor(backGroundColor); 
    //v.setBackgroundResource(R.drawable.playlist_tile_drag); 
    v.setPadding(0, 0, 0, 0); 
    v.setImageBitmap(bm); 
    mDragBitmap = bm; 

    mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); 

    //Build Params 
    mWindowParams = new WindowManager.LayoutParams(); 
    mWindowParams.gravity = Gravity.TOP | Gravity.LEFT; 
    mWindowParams.x = (x - mDragPointX + mXOffset); 
    mWindowParams.y = (y - mDragPointY + mYOffset); 

    DisplayMetrics metrics = new DisplayMetrics(); 
    mWindowManager.getDefaultDisplay().getMetrics(metrics); 
    mWindowParams.horizontalMargin = (float)getAbsoluteLeft()/(float)metrics.widthPixels; 

    mWindowParams.height = WindowManager.LayoutParams.WRAP_CONTENT; 
    mWindowParams.width = WindowManager.LayoutParams.WRAP_CONTENT; 
    mWindowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 
      | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 
      | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
      | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN 
      | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; 
    mWindowParams.format = PixelFormat.TRANSLUCENT; 
    mWindowParams.windowAnimations = 0; 

    mWindowManager.addView(v, mWindowParams); 
    mDragView = v; 
} 

La parte añadí es:

DisplayMetrics metrics = new DisplayMetrics(); 
mWindowManager.getDefaultDisplay().getMetrics(metrics); 
mWindowParams.horizontalMargin = (float)getAbsoluteLeft()/(float)metrics.widthPixels; 

Este parámetro mWindowParams.horizontalMargin especifique el margen de la ventana desde el lado gravedad indicada (Gravity.Left) como% € [0,1].

Así que con getAbsoluteLeft() que ir hasta el árbol Vista para obtener la distancia absoluta de la lista del lado izquierdo.

dividiéndolo por el ancho de la ventana, se obtiene por ciento de margen que necesita.

Cuestiones relacionadas