Подтвердить что ты не робот

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

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

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

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

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

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

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

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

Спасибо.

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

Мое предложение было бы использовать AbsoluteLayouts для КАК МЫ МОЖЕМ. Я также думаю, что мы должны начать толчок, чтобы сообщить Google, что он все еще является очень необходимым API для своей платформы.

Великий вопрос: -)

Ответ 4

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