Добавление динамического представления с помощью WindowManager.addView

У меня есть код для ICS для планшетов. Я хочу динамически добавлять Imageview в фрагмент. Фрагмент уже содержит preferencelist. Код для добавления представления динамически выглядит следующим образом. Я кодирую эту функцию перетаскивания. Эта часть кода взята из файла TouchInterceptor.java из приложения для Android.

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

Я указываю координату x параметра windowlayout как 0. Событие, а затем, когда отображается представление, оно отображается слева от фрагмента (правая панель), представление отображается с середины правой панели и распространяется справа . Что я делаю неправильно? Что нужно сделать, чтобы исправить это?

Solutions Collecting From Web of "Добавление динамического представления с помощью WindowManager.addView"

Попробуйте установить гравитацию на Gravity.TOP | Gravity.LEFT Gravity.TOP | Gravity.LEFT

Я работаю над тем же кодом, взятым из старого проекта Google Music open souce.

Как и вы, я думаю, у меня был 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() я getAbsoluteLeft() к дереву представления, чтобы получить абсолютное расстояние списка с левой стороны.

Разделив его по ширине окна, вы получите процент от необходимого вам поля.