Динамическое использование RelativeLayout и установка полей в px, dp, inch, mm - PullRequest
9 голосов
/ 17 мая 2011

Мое приложение - это просто модифицированный ImageViewer с параметрами масштабирования и перетаскивания.Содержащий этот измененный Imageviewer, существует RelativeLayout (который я хочу использовать в качестве AbsoluteLayout).

Затем в макет можно добавить новые элементы, чтобы расположить их в определенных точках изображения.Позиция (x, y) в пикселях элементов находится в базе данных, поэтому я полагаю, что нет другого способа добавить их программно, а не с помощью XML.

Тогда положение этих элементов обновляется каждый разчто выполняется действие перетаскивания или масштабирования.

Проблема в том, что пиксели изображения каким-то образом не совпадают с пикселями в RelativeLayout!Таким образом, элементы «более или менее» расположены, но не в нужном месте (чем дальше от (0,0), тем больше ошибка).

Вещи, которые я уже пробовал:

  • Попробуйте различные преобразования, потому что, возможно, проблема связана с разницей плотностей между растровым изображением и макетом:

    Resources r = getResources();
    float x = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, r.getDisplayMetrics());
    
  • Попробуйте использовать разные методы вмакет для установки полей:

    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    params.leftMargin = (int) newPosition.x;
    params.topMargin = (int) newPosition.y;
    element.setLayoutParams(params);
    
  • Я также хотел использовать опции, доступные для RelativeLayout в XML, но я действительно не могу найти его программно, но я могу найти способ указатьЯ имею в виду измерение:

    android:layout_marginLeft ="50px" // or "50mm", or dp, or inches...
    

Ответы [ 3 ]

20 голосов
/ 03 апреля 2012

Вы можете установить высоту, ширину и поле, используя следующий код:

//headView
RelativeLayout.LayoutParams head_params = (RelativeLayout.LayoutParams)headView.getLayoutParams();
head_params.setMargins(80, 0, 0, 0); //substitute parameters for left, top, right, bottom
head_params.height = 60; head_params.width = 200;
headView.setLayoutParams(head_params);

Где headView - это вид вашего приложения.

4 голосов
/ 17 мая 2011

Попробуйте: для относительного макета вы можете установить поля следующим образом: params.setMargins(left, top, right, bottom);

3 голосов
/ 17 мая 2011

Я нашел ответ, проблема была на самом деле с плотностью, поэтому я сделал:

    DisplayMetrics metrics = getResources().getDisplayMetrics();
    float density = metrics.density;
    //And then I add a new element like: realX*density, realY*density

Я не очень понимаю, что он делает, но это работает ... На самом делечто я не понимаю значение metrics.density Любое объяснение приветствуется.

...