2010-07-16 5 views
29

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

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

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

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

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

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

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

Спасибо.

+2

Отличный вопрос! Heres мой почти такой же вопрос: http://stackoverflow.com/questions/4953351/android-how-to-draw-a-letter-at-a-specific-point ... Почему все эти взгляды и анимации, если вы не можете их использовать? – Mark

ответ

1
+0

Обе ссылки сейчас сломаны. Вы всегда должны предоставлять сводку ответа, когда вы включаете внешние ссылки в свои ответы. – manfcas

2

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

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

Большой вопрос :-)

+0

[Per Dianne Hackborn из группы разработчиков Android] (http://androiddiscuss.com/1-android-discuss/38183.html): «Я еще раз скажу: мы не собираемся удалять AbsoluteLayout из будущего выпуска, но мы решительно препятствуем людям использовать его ». Поэтому, если это действительно то, что наилучшим образом соответствует вашим потребностям, используйте его. – jk7

4

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

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

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

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

Оба SurfaceView и OpenGL (GLSurfaceView) представляют собой виды, так что они могут быть добавлены в макет, как и любой другой точки зрения

1

Имеющаяся документация на пользовательских макетов кажется довольно расплывчато для меня, но я, наконец, нашел что-то полезное: Вот хороший простой пример макета, который показывает, как подключить XML и код Java: How to layout a 'grid' of images in the center of the screen И вот сообщение, которое объясняет один ключевой вопрос, который мне не хватало: http://www.arpitonline.com/blog/2012/07/01/creating-custom-layouts-for-android/. По-видимому, нужно переопределить onMeasure и вызвать меру() для каждого ребенка.

Смежные вопросы