добавление динамического представления с помощью WindowManager.addView - PullRequest
10 голосов
/ 13 марта 2012

У меня есть код на ICS для планшетов. Я хочу динамически добавить изображение в фрагмент. Фрагмент уже содержит список предпочтений. Код для динамического добавления представления выглядит следующим образом. Я кодирую эту функциональность перетаскивания. Эта часть кода взята из файла 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. Если при отображении представления его положение отображается с левой стороны фрагмента (правая панель), оно отображается с середины правой панели и охватывает его. на правой панели. Что я делаю не так? Что нужно сделать, чтобы исправить это?

Ответы [ 2 ]

8 голосов
/ 18 мая 2012

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

2 голосов
/ 24 мая 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...