Как создать панель кнопок с скользящим управлением в Android?

Приложение Footprints и часы на телефонах HTC Sense используют ползунок на нижней панели кнопок (см. Пример этого фильма: https://docs.google.com/leaf?id=0B9hmEy_z2CRzOTJmYTVlNDktYjkwMS00YTM5LTk3ODQtYmIzODU4Yzk1YjA0&hl=en&authkey=CMWwwegG).

Из средства просмотра иерархии я вижу, что для этого они используют собственный элемент управления. Я ищу способ добиться того же эффекта. Я хочу кнопку в нижней части моего приложения с подвижным селектором, который я могу перетаскивать слева направо и назад, выбирая тем самым различные вкладки.

Кто-нибудь может дать несколько советов о том, как мне этого добиться? Какие элементы управления макетом я могу использовать для этой цели? Я знаю, как создавать вкладки и панель кнопок, но я немного озадачен скользящим селектором.

Спасибо и всего наилучшего, Иво

2 ответа

Для создания представления у вас есть два основных варианта.

Один из них - определить его в XML, в файле макета, который будет использовать ваша активность.

<LinearLayout ... > <!-- or any other layout, see layout documentation in the SDK -->
  <ImageView ...    <!-- or another view as fits your needs -->
    android:id="@+id/myview"
    android:src="@drawable/myimage" ... />
</LinearLayout>

После этого вы можете ссылаться на свое представление в своем коде после вызова setContentView с помощью findViewById(R.id.myview). (конечно, если бы вы сказали, скажем, "@+foo/bar" в XML-файле, вы бы использовали R.foo.bar).

Другой способ - создать его динамически и прикрепить к иерархии представлений.

ImageView v = new ImageView();
v.setImageResource(R.drawable.myimage);
... // initialize your view here
parent.addChild(v);

...Или так.

Чтобы получить события, у вас есть несколько вариантов снова. Одним из них является создание подкласса View (или ImageView в этом отношении) и реализация onTouchEvent. Вам нужно будет адаптировать приведенный выше код для создания экземпляра вашего нового класса вместо ImageView (это очевидно в коде Java, для XML вы должны написать имя тега и убедиться, что вы реализуете конструктор, который принимает (Context, AttributeSet) назвать его конструктор суперкласса). Или вы можете написать TouchDelegate и использовать setTouchDelegate в вашем ImageView, что, вероятно, проще в вашем случае.

Другой подход заключается в создании GestureDetector и сопоставлении касаний с вашим видом с помощью метода hitTest. Для описываемой вами задачи это излишне, но может пригодиться, когда ваше приложение станет более сложным.

Я бы расширил класс TabWidget, чтобы сделать мой собственный рендеринг. У вас были бы преимущества горячей замены с другими системами вкладок и унифицированным интерфейсом, при этом вы все равно могли рисовать панель вкладок так, как вам хочется. Вы начали бы свою анимацию в setCurrentTab.

Другие вопросы по тегам