Пользовательский макет Android - PullRequest
29 голосов
/ 16 июля 2010

Я провел некоторое время вчера, борясь с макетами 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 (сравнимый с концепцией представления Android) по умолчанию предлагает абсолютный макет. Затем вы можете применить другие макеты из коробки, если хотите. Но для сценариев, где требуется пользовательский макет, вам не нужно ничего делать.

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

Спасибо.

Ответы [ 4 ]

4 голосов
/ 23 мая 2012

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

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

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

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

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

2 голосов
/ 22 мая 2012

Это фантастический вопрос. Я программирую на 3.0 и выше в настоящее время, и решил по большей части придерживаться AbsoluteLayouts во многих случаях. Несмотря на то, что он устарел, компиляция для версии 3.0 и ниже, скорее всего, все равно будет работать некоторое время на 4 и более системах. Я сам ищу этот ответ (для будущих версий ОС, которые его вырезали). Причина, по которой они его исключают, заключается в том, что на Android отсутствует стандартизация разрешения экрана.

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

Отличный вопрос: -)

1 голос
/ 21 декабря 2012

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

1 голос
/ 01 февраля 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...