2012-03-13 23 views
10

私は、タブレット用のICSのコードを持っています。私はImageviewを動的にフラグメントに追加したい。フラグメントには、事前参照が含まれています。ビューを動的に追加するコードは次のとおりです。私はこのドラッグアンドドロップ機能をコーディングしています。コードのこの部分は、アンドロイドの音楽アプリからTouchInterceptor.javaファイルから取得されます。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は、Xビューが表示されている0 Eventthen、断片(右ペイン)の左側から表示itsteadとしてwindowlayoutパラメーターの座標、ビューは右の途中から表示されている指定してい右ペインにまたがっています。私が間違っていることは何ですか?これを修正するために何をしなければならないのですか?

答えて

8

Gravity.TOP | Gravity.LEFT

2

に重力を設定してみてください、私は古いGoogleの音楽オープン源泉プロジェクトから取られた同じコードにexatly取り組んメートル。

私が推測するように、私はTouchInterceptorを断片にしました。私の問題は、フラグメントが画面全体を占めていないことです。左側に他のフラグメントがあります。

mWindowParams.gravityを使って絶対的なx、yを指定することができましたが、解決策が見つかりませんでした。結局私はmWindowParams.horizontalMarginで解決しました。ここで

は私が思いついたコードです:

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; 
} 

私は追加部分です:

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

このパラメータmWindowParams.horizontalMarginは、指定された重力側から窓のマージンを指定します(Gravity.Left) %€[0,1]として表示されます。

したがって、getAbsoluteLeft()の場合は、リストの絶対距離を左側から取得するために、ビューツリーに行きます。

ウィンドウの幅で分割すると、必要なマージンの割合が得られます。

関連する問題