Подтвердить что ты не робот

Как влияют значения Gravity PopupWindow.showAtLocation() в Android

Как различные эффекты Gravity влияют на PopupWindow.showAtLocation() в Android?

Я не могу найти хорошие документы в PopupWindows showAtLocation и Gravity.

4b9b3361

Ответ 1

После взлома в течение нескольких часов, пробовав некоторые черные магические математики, чтобы вычислить центры и попытаться выровнять представление с помощью Gravity.TOP, я нашел сообщение, которое использовало Gravity.CENTER. Я собираю свои результаты здесь, надеясь, что он спасет кого-то еще от боли.

popupWindow.showAtLocation(anyViewOnlyNeededForWindowToken, Gravity.CENTER, 0, 0);

Вид необходим только для токена окна, он не оказывает другого влияния на местоположение.

Gravity сообщает менеджеру компоновки, где следует начинать систему координат и как обрабатывать эти координаты. Я не могу найти документы, но хакинг показывает мне, что:

  • CENTER использует середину всплывающего окна для выравнивания по указанному x, y. Таким образом, 0,0 имеет ориентацию экрана, без корректировки размера панели уведомлений.

Gravity.CENTER 0,0

  • BOTTOM использует нижнюю часть всплывающего окна для выравнивания с указанными x, y. Таким образом, 0,0 имеет выпадающее меню, выровненное со дном экрана. Если вы хотите заполнить 10px, тогда y = 10 (не -10), чтобы переместить всплывающее окно на 10 пикселей.

Gravity.BOTTOM 0,10

  • TOP использует верхнюю часть всплывающего окна для выравнивания с указанными x, y. Таким образом, 0,0 имеет всплывающее окно, совпадающее с верхней частью экрана. Если вы хотите 10px padding, тогда y = 10. ПРИМЕЧАНИЕ Если вы не находитесь в полноэкранном режиме, вы также должны внести коррективы в панель уведомлений.

Gravity.TOP 0,48

  • Gravity.LEFT и Gravity.RIGHT теперь должны быть очевидны, поскольку для моих иллюстраций изображения они слишком велики, чтобы соответствовать на экране, поэтому они зажимаются до размера экрана минус заполнение, которое я использую.

Ответ 2

Вы можете изменить гравитацию PopupWindow, Gravity.CENTER в методе showAtLocation:

popupWindow.showAtLocation(anyView, Gravity.CENTER, 0, 0);

Изображения ниже показывают эффекты:

Центр

  • Gravity.CENTER

PopupWindow center gravity

Ребра

  • Gravity.TOP
  • Gravity.BOTTOM
  • Gravity.LEFT
  • Gravity.RIGHT

PopupWindow edge gravity

уголки

  • Gravity.TOP | Gravity.LEFT
  • Gravity.TOP | Gravity.RIGHT
  • Gravity.BOTTOM | Gravity.LEFT
  • Gravity.BOTTOM | Gravity.RIGHT

PopupWindow corner gravity

Смещения

Вы можете дополнительно расположить его, изменив (x,y) смещения в

popupWindow.showAtLocation(anyView, gravity, x, y);

Например

popupWindow.showAtLocation(anyView, Gravity.BOTTOM, 0, 300);

PopupWindow bottom gravity with offsets

Код

Вот код для примеров выше. См. Как создать простое всплывающее окно Android для получения более подробной справки.

int gravity = Gravity.CENTER;

LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View popupView = inflater.inflate(R.layout.popup_window, null);
int width = LinearLayout.LayoutParams.WRAP_CONTENT;
int height = LinearLayout.LayoutParams.WRAP_CONTENT;
boolean focusable = true;
final PopupWindow popupWindow = new PopupWindow(popupView, width, height, focusable);
popupView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        popupWindow.dismiss();
        return true;
    }
});

popupWindow.showAtLocation(anyView, gravity, 0, 0);

Смотрите также

  • Используйте showAsDropDown если вы хотите привязать всплывающее окно к представлению.