Android Custom Compoent, расширяющий FrameLayout в коде - PullRequest
0 голосов
/ 13 февраля 2011

Я хотел бы создать пользовательский компонент Android для игры.Основная идея заключается в том, что пользовательский компонент будет иметь квадратную форму и содержать внутри него другие квадратные компоненты ImageView.Компоненты ImageView внутри могут масштабироваться и / или обрезаться по мере необходимости, но должны оставаться квадратными.Количество строк == столбцов, всегда.Уровень сложности определяет точное значение строк и столбцов во время выполнения.По мере того как игра усложняется, количество строк и столбцов будет увеличиваться одинаково, но масштабированный размер каждого ImageView будет соответственно уменьшаться.Я бы хотел, чтобы между компонентами было небольшое фиксированное расстояние, в основном, чтобы оно выглядело хорошо.Дисплей не будет прокручиваться, все элементы должны помещаться на дисплее одновременно.

После нескольких неудачных попыток я расстраиваюсь и не уверен, что лучший подход - создать этот пользовательский компонент.

Моей последней идеей будет примерно следующее:

Я создаю свой собственный класс компонентов с помощью "extends FrameLayout".В моем конструкторе я создаю произвольный маленький квадратный объект ImageView в коде.Я бы хотел, чтобы другие когда-нибудь повторно использовали мой пользовательский компонент, поэтому я делаю это в коде, а не в XML, чтобы пользовательский компонент не полагался на какой-либо внешний XML-объект, который необходимо определить.Я установил тип масштаба так, чтобы ImageView сохранил его «прямоугольность» (думаю, я хочу fitStart?).Я установил для поля Image_width и layout_height для ImageView значение «fill_parent», чтобы ImageView заполнял пространство настолько большое, насколько это доступно в содержащем FrameLayout.Я добавляю теперь большой и квадратный ImageView к своему макету, используя addView ().

Далее я создаю объект RelativeLayout, а также программно добавляю его себе, используя addView ().Поскольку моим базовым классом является FrameLayout, я думаю, что это сделает размер RelativeLayout таким же, как ранее добавленный квадратный ImageView.По крайней мере, так я читаю документацию.

Далее я измеряю ImageView, чтобы увидеть, насколько он большой.Я не думаю, что могу измерить себя, потому что мои предыдущие попытки потерпели неудачу в этом.Я продолжал получать 0 для моего размера.Мои исследования показали, что это потому, что я не могу измерить себя во время строительства.Это превратилось в Catch-22.Когда я пытался масштабировать свое изображение до доступного пространства, я не мог, потому что еще не было свободного места.Я надеюсь, что, поскольку я перешел на использование FrameLayout в качестве базового класса и добавил к нему ImageView, я смогу измерить свой недавно созданный и правильно масштабированный ImageView с большим квадратом.

Если все пойдет по плану, теперь я знаю, насколько велико место на устройстве пользователя для моего RelativeLayout, потому что оно совпадает с моим ImageView.Зная, сколько места доступно и сколько строк и столбцов необходимо отобразить, я могу правильно масштабировать каждое добавляемое изображение, соответствующим образом добавляя, предполагая, что не забываю учесть расстояние между добавляемыми изображениями.Теперь мне больше не нужен квадратный ImageView, и я могу его убрать, если захочу.

Если это целесообразно, я бы хотел, чтобы у большого ImageView были закругленные углы, а у каждого добавленного ImageView также были закругленные углы.С небольшим промежутком между ImageViews это будет здорово смотреться в игровом процессе.Таким образом, я могу оставить это в качестве фона.

Это похоже на хорошее решение, и лучше, чем мои предыдущие попытки, которые не сработали, но если есть лучший способ ..., я слушаю.

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

construct()
{
    ImageView squareImageView = new ImageView(Square);
    LayoutParams squareImageLayoutParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    squareImageLayoutParams.addRule(fitStart);
    addView(squareImageView, squareImageLayoutParams);

    RelativeLayout relativeLayout = new RelativeLayout(context);
    LayoutParams relativeLayoutParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    addView(relativeLayout, relativeLayoutParams);

    int size = squareImageView.getWidth(); // Should be the scaled size and square.  
    squareImageView.setVisibility(INVISIBLE); // maybe?

    loop for each row and col
    {
        crop, scale and add each image to the relativeLayout object.  
    }
}

Мой самый основной вопрос - кажется ли это разумным решением?Если так, в psuedocode есть куча вещей, которые я не знаю, как сделать (пока).

  • Как создать маленький квадрат ImageView в коде?
  • Как установить scaleType в коде?
  • Смогу ли я измерить свой квадрат ImageViewи получить правильный размер?
  • Есть ли лучший способ удалить квадрат ImageView, кроме как сделать его невидимым?
  • Сделает ли мой квадратный ImageView невидимым, сделает его неизмеримым?
  • Я вижу нечто, называемое ShapeDrawable, будет ли это лучше, чем ImageView для создания квадрата?
  • Как обрезать ImageView, чтобы он был квадратным, распределяя потери равномерно по обеим сторонам?

Я, конечно, не ожидаю, что кто-нибудь узнает все эти ответы, но если вы знаете ответы, которыми можете поделиться, я был бы признателен.

Спасибо.

1 Ответ

0 голосов
/ 24 мая 2011

Существует множество встроенных функций для правильного масштабирования доступного пространства экрана. Я не совсем понимаю, почему вы хотите измерить ImageView s.

Рассматривали ли вы использовать weight? Я бы попробовал фиксированный размер GridView (или TableLayout, или LinearLayout из LinearLayout с). Если содержимое правильно оформлено, оно сохранит свою «прямоугольность». Вы можете использовать атрибуты verticalSpacing или horizontalSpacing для GridView, или вы можете сделать пустыми View s для пробелов, чтобы также поставить weight для пробелов.

Не устанавливайте атрибут weightsum родительского элемента, но убедитесь, что сумма весов ваших элементов по горизонтали равна их сумме по вертикали, и ваши квадратные ImageViews всегда будут правильно масштабироваться, независимо от того, сколько элементов вы получили там.

...