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