Динамическое позиционирование кнопки [Android] - PullRequest
0 голосов
/ 12 апреля 2011

У меня есть RelativeLayout, который содержит ImageView и ImageButton.ImageView служит контейнером для фонового изображения.Теперь я пытаюсь установить кнопку в фиксированном положении, чтобы она всегда появлялась в одной и той же позиции на фоновом изображении.

Вот файл макета, который я использую:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/relativeLayout1" android:layout_height="match_parent"
android:layout_width="match_parent" android:gravity="center_horizontal">

<ImageView android:src="@drawable/bg_1" android:id="@+id/imgView"
    android:adjustViewBounds="true" android:layout_height="match_parent"
    android:layout_width="match_parent" />

<ImageButton android:layout_width="120dp"
    android:background="@drawable/button_1" android:layout_height="30dp"
    android:id="@+id/imgButton" android:layout_marginLeft="100dp"
    android:layout_marginTop="170dp" />
</RelativeLayout>

Как вы можете видеть, я пытался расположить кнопку с левым / верхним полем, используя dp в качестве единицы, но это не работает.Поскольку фоновое изображение масштабируется вниз / вверх, позиция должна быть какой-то динамической.

Я понимаю, что абсолютное позиционирование со значениями пикселей для x- / y-позиции является чем-тоэто не будет работать на Android, как это объясняется здесь .Мне все еще нужно решить эту проблему, и я не уверен, как это сделать.

Нужно ли мне вычислять значения для левого / верхнего поля (не уверен, как это будет), а затем устанавливать для них что-то вроде этого?

final float density = getResources().getDisplayMetrics().density;
int width = (int)((float)120 * density); 
int height = (int)((float)120 * density); 

RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(width, height);
rlp.leftMargin = newMargin;
rlp.topMargin = newTopMargin;

ImageButton imgButton = (ImageButton) findViewById(R.id.imgButton);
imgButton.setLayoutParams(rlp);

Надеюсь, я что-то не забыл ...

// РЕДАКТИРОВАТЬ: я думал, причина проблемы может быть в том, что масштабированное изображение имеет разные "границы",в зависимости от размера экрана.С изображением в формате 1: 1.6 на экране HVGA у меня есть черные полосы слева и справа, тогда как на экране WVGA полосы слева.Учитывая, что я использую масштабирование по умолчанию.Я посмотрю на это и напишу снова, если необходимо ...

1 Ответ

0 голосов
/ 12 апреля 2011

Почему происходит масштабирование? Из-за разных точек на дюйм на разных устройствах? У вас есть разные drawabled для разных настроек dpi? Если это не просто проблема разрешения точек на дюйм, и вы хотите свободно масштабировать фоновое изображение, тогда вы не сможете выполнить работу, используя стандартные макеты. Вы должны реализовать пользовательский.

...