Пользовательский макет Android

Я провел где-то вчера борется с макетами Android (… или лучше настраиваемых макетов). Для общих целей формы из макетов коробки, что предложения андроидов более чем достаточно. Но когда дело доходит до более сложных вариантов использования (давайте возьмем пример карусели с перекрытием изображений, которые лежат на эллиптическом пути), я быстро понял ограничения и сложность API-интерфейсов Android. Это был мой подход:

  1. Использование компоновки из коробки не является вариантом (для многих неуправляемых проблем для обработки), однако потребность в графических объектах, которые могут быть добавлены в контейнер (скажем, ImageView, например), необходима для того, чтобы легко выполнять переводы, вращения, И т.д … через встроенную анимацию.

  2. AbsoluteLayout представляется наиболее подходящим для этой цели. Он позволяет добавлять производные объекты просмотра и писать собственный алгоритм для их размещения. Но … это устарело. Это позор! Кто хочет использовать устаревшую apis?

  3. Следующее наиболее разумное дело – написать свой собственный макет, подклассифицирующий мистическую ViewGroup .. и вот где все разваливается (по крайней мере, это для меня). Это сложный, вводящий в заблуждение и сложный способ сделать это так же, как писать собственный собственный макет для качания (я действительно делал это много лет назад, и я помню, чтобы быть проще).

  4. Затем (управляемый отчаянием) подкласс классификации View, переопределение метода onDraw и рисование непосредственно на Canvas кажется единственным простым решением (хотя это напоминает мне дни java2D … долгие часы, потраченные на достижение высоких 1% ваших Проект), но затем вы отказываетесь от удобных встроенных API-интерфейсов анимации, которые вы хотите применить к графике, нарисованной на холсте.

Вывод состоит в том, что, если я не пропустил что-то, существующая архитектура Android немного далека от парадигмы программирования, предлагаемой некоторыми другими технологиями пользовательского интерфейса, такими как flash или javafx (я могу легко реализовать описанную выше карусель в javafx и flash). Причина в том, что, например, в javafx объект Scene (сопоставимый с концепцией View and android) предлагает по умолчанию абсолютный макет. Затем вы можете применить другие из макетов коробки, если хотите. Но для сценариев, где требуется настраиваемый макет, вам не нужно ничего делать.

Я немного удивляюсь, что этот вариант недоступен в android, ведь это довольно распространенная потребность, которая рассматривается другими технологиями ui. Мне все еще нравится думать, что есть 5-й вариант в Android, который я не нашел. Любой эксперт, который мог бы предоставить некоторую информацию по этой теме?

Благодарю.

Solutions Collecting From Web of "Пользовательский макет Android"

Я думаю, что Android Layout отлично подходит для большинства случаев использования для взаимодействия с пользователями, НО (большой, но) Механизм макета очень деликатный и сложный для правильного распространения. Для небольших твиков это нормально, но если вы хотите сделать что-то необычное (например, анимированную карусель), вы, вероятно, будете делать бесплатную графику, так что вам не нужна дополнительная сложность расширения макета. Это просто больше ограничений для жизни, без какой-либо обоснованной добавленной стоимости.

Большинство приложений имеют некоторые стандартные элементы (ActionBar, кнопки, настройки, диалоги и т. Д.) И один или несколько «уникальных» элементов. Поэтому мое предложение состоит в том, чтобы использовать стандартную компоновку для стандартного материала, но для ваших уникальных элементов используйте один из них:

1) SurfaceView – очень проста в использовании. См. Официальный пример кода Lunar Lander . Чтобы увидеть SurfaceView в действии, вы также можете посмотреть мое видео приложения , которое использует SurfaceView для анимированного элемента, и все выложено с RelativeLayout.

2) opengl – это самый мощный способ сделать графику на Android. Он работает на графическом процессоре, поэтому процессор может свободно выполнять другие функции. И это 3D (или 2D, если вы просто используете одну плоскость). Я использую libgdx , и это здорово, и не сложно после короткого обучения.

Оба SurfaceView и opengl (GLSurfaceView) представляют собой представления, поэтому их можно добавить в макет, как и любой другой вид

Это ФАНТАСТИЧЕСКИЙ вопрос. В настоящее время я программирую 3,0 и более, и в большинстве случаев решил, что в большинстве случаев придерживаться AbsoluteLayouts. Хотя он настроен на устаревание, компиляция для 3.0ish и ниже, скорее всего, по-прежнему будет работать на 4 и более системах для бит. Я сам ищу этот ответ (для будущих версий ОС, которые его отключили). Причина, по которой они вырезаются, связана с отсутствием стандартизации разрешения экрана на Android.

Мое предложение состояло бы в том, чтобы использовать AbsoluteLayouts для AS LONG AS WE CAN. Я также думаю, что мы должны начать толчок, чтобы сообщить Google, что это все еще очень необходимый API для своей платформы.

Большой вопрос 🙂

Доступная документация по пользовательским макетам кажется довольно расплывчатой ​​для меня, но я, наконец, нашел что-то полезное: вот хороший простой образец макета, который показывает, как подключить XML и код Java: как разместить сетку изображений в центре Screen И вот сообщение, в котором объясняется одна ключевая проблема, которую я отсутствовал: http://www.arpitonline.com/blog/2012/07/01/creating-custom-layouts-for-android/ . По-видимому, нужно переопределить onMeasure и вызвать меру () для каждого ребенка.