2012-03-13 14 views
10

Ho un codice su ICS per tablet. Voglio aggiungere un Imageview dinamicamente a un frammento. Il frammento contiene già un elenco preferenziale. Il codice per aggiungere la vista in modo dinamico è il seguente. Sto codificando questa funzionalità drag and drop. Questa parte del codice è tratta dal file TouchInterceptor.java dall'app di musica Android.aggiunta visualizzazione dinamica utilizzando 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); 

sto specificando la coordinata x windowlayout param come 0. Eventthen quando viene visualizzata la vista, itstead di visualizzare dal leftside del frammento (riquadro a destra), la vista viene visualizzata da metà destra riquadro e si estende al riquadro destro. Cosa sto facendo di sbagliato? Che cosa si deve fare per correggere questo?

risposta

8

impostazione gravità per Gravity.TOP | Gravity.LEFT

2

I m lavorando ricade perfettamente sullo stesso codice preso dal vecchio progetto open souce Google Music prova.

Come te, suppongo, ho avuto un TouchInterceptor in un frammento. Il mio problema era che il frammento non occupa tutto lo schermo, ha un altro frammento alla sua sinistra.

Ho provato molto usando mWindowParams.gravity per poter specificare una x assoluta, ma non sono riuscito a trovare una soluzione. Alla fine l'ho risolto con mWindowParams.horizontalMargin.

ecco il codice mi si avvicinò con:

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 ho aggiunto è:

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

Questo parametro mWindowParams.horizontalMargin specificare il margine della finestra dal lato gravità specificata (Gravity.Left) in% € [0,1].

Quindi con getAbsoluteLeft() Salendo all'albero Visualizza per ottenere la distanza assoluta dell'elenco dal lato sinistro.

Dividendolo per la larghezza della finestra, si ottiene la percentuale del margine necessario.

Problemi correlati