1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/goweii-ActionBarEx

Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Поиск работы

ActionBarEx

Расширяемый и гибко настраиваемый ActionBar, полноценная замена стандартному Android ActionBar.

  • Поддержка кастомизации заголовочного интерфейса, возможность написания подложки непосредственно в XML
  • Поддержка кастомизации переднего плана, например, отображение эффекта загрузки
  • Поддержка кастомизации заднего плана, например, использование изображений
  • Поддержка кастомизации нижней разделительной линии, позволяющая отображать тень на внешней стороне
  • Поддержка адаптации иконок для темной и светлой темы статус-бара, возможность динамического обновления
  • Поддержка темной и светлой темы иконок статус-бара, адаптирована для популярных китайских ROM, подробнее в StatusBarCompat
  • Включены три стандартных стиля, которые можно использовать по необходимости

GitHub страница

Демо-версия

Проектное описание

Почему нужно создать свой ActionBar? Ведь есть официальные и множество открытых проектов.

Во-первых, остановимся на официальном. Официальный имеет не унифицированный стиль на разных системах, слишком мало опций для кастомизации, что не удовлетворяет потребности разработчиков, поэтому и появляются множество открытых проектов.Во-вторых, остановимся на открытых проектах. Большинство открытых проектов, которые я нашёл и использовал, представляют собой просто упакованные фиксированные стили или управление видимостью элементов. Но они ограничены кастомизацией левого и правого иконок и стиля центрального заголовка. А что, если нужно кастомизировать фон ActionBar? Что, если нужно отобразить изображение на фоне? Что, если нужно растянуть изображение под статус-бар? Что, если нужно сделать фон полупрозрачным с эффектом размытия? Что, если нужно ограничить размер иконок кнопок? Что, если нужно кастомизировать фон центрального заголовка? Что, если нужно отобразить поле поиска? Что, если нужно добавить иконки очистки и поиска в поле поиска? Что, если нужно кастомизировать стиль поля поиска? Что, если нужно отобразить эффект загрузки при сетевых запросах? И так далее. И я уверен, что таких требований немало.

Может быть, есть фреймворки, которые могут это сделать, но я пока не нашёл.

Почему этот проект может реализовать то, что не могут сделать проекты с большим количеством звезд на GitHub?

Конечно, это не означает, что это возможно, но я уверен, что этот проект может удовлетворить более 99% требований на рынке.

**Откуда такая уверенность? Давайте сначала посмотрим на структуру всего проекта.**Проект ActionBarEx состоит из трех основных уровней, каждый из которых отвечает за определенные функции и имеет свои названия и соглашения. | Ключевой уровень | Подуровень | Описание | Примечания | | ------------------------------ | --------------- | ---------- | :------------------ | | BackgroundLayer | | Фоновый слой | Допускается кастомизация размещения | | ActionBarLayer | | Слой действий | Вертикальное линейное размещение | | | StatusBar | Статусная панель | | | | TitleBar | Заголовочная панель | Допускается кастомизация размещения | | | BottomLine | Разделительная линия | | | ForegroundLayer | | Фронтальный слой | Допускается кастомизация размещения |- BackgroundLayer Слой фона, отвечающий за отрисовку фона всего Action Bar, например, для реализации полупрозрачного фона, фона изображения или эффекта размытия Гаусса.

  • ActionBarLayer Основной слой, представляющий собой объединение следующих трёх слоёв:
    • StatusBar Системный слой состояния, который позволяет контролировать отдельное отображение фона, а также переключение между светлым и тёмным режимами изображения состояния.
    • TitleBar Слой навигации, который используется для отображения значков, кнопок и других элементов, поддерживает пользовательские стили разметки для реализации сложных требований. - BottomLine Слой нижней границы, который позволяет контролировать цвет и высоту границы.
  • ForegroundLayer Слой переднего плана, используемый для отображения специальных состояний, таких как полоса прогресса загрузки LoadingBar, поддерживает пользовательские стили разметки.## Не будем многословны, давайте посмотрим на результат

Ого, выглядит неплохо, расскажите, как это использовать?

Не спеши, я расскажу о деталях реализации.

Хорошо, не спеши, я всё расскажу. Положи этот кубический объект на место...

Чтобы использовать, нужно ещё разобраться с несколькими классами:

  • ActionBarEx Это и есть вышеупомянутый базовый класс, который разделяется на три уровня.
  • ActionBarCommon Наследуется от ActionBarEx, разметка заголовка имеет вид [иконка-текст-заголовок-текст-иконка].
  • ActionBarSearch Наследуется от ActionBarEx, разметка заголовка имеет вид [иконка-текст-поле поиска-текст-иконка].
  • ActionBarSuper Наследуется от ActionBarEx
    • Поддерживает пользовательские заголовки и подзаголовки.
    • Поддерживает центрирование или выравнивание заголовка по левому краю.
    • Поддерживает до пяти кнопок слева и справа.
    • Поддерживает точную настройку отступов для каждой кнопки.

Способы интеграции

Добавление зависимости

  1. В файле build.gradle проекта добавьте адрес репозитория
allprojects {
	repositories {
		...
		maven { url 'https://www.jitpack.io' }
	}
}
  1. В файле build.gradle модуля app добавьте зависимость от фреймворкаПоследняя версия доступна по ссылке Releases

С версии 2.2.9 и выше, убрана буква "v" в начале версии, обратите внимание при указании версии.

С версии 3.0.0 разделены ActionBarEx и ActionBarCommon/Search.

С версии 3.1.0 добавлен класс ActionBarSuper```groovy dependencies { // Fully introduce implementation 'com.github.goweii:ActionBarEx:3.2.2'

// Only introduce ActionBarEx
implementation 'com.github.goweii.ActionBarEx:actionbarex:3.2.2'
// Introduce ActionBarCommon/Search/Super, depending on ActionBarEx
implementation 'com.github.goweii.ActionBarEx:actionbarex-common:3.2.2'

}




## Простые требования можно выполнить за 2 шага

Вот пример с использованием ActionBarCommon

1. Включение в разметку

```xml
<per.goweii.actionbarex.common.ActionBarCommon
    android:id="@+id/simple_action_bar_3"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:background="#ccffffff"
    app:ab_autoImmersion="false"
    app:ab_bottomLineColor="@color/line"
    app:ab_bottomLineHeight="0dp"
    app:ab_foregroundLayerLayout="@layout/loading_bar"
    app:ab_statusBarColor="@color/transparent"
    app:ab_statusBarMode="dark"
    app:ab_statusBarVisible="false"
    app:ab_titleBarHeight="48dp"
    app:abc_leftIconColor="@color/black"
    app:abc_leftIconRes="@mipmap/back"
    app:abc_leftText="Вернуться"
    app:abc_leftTextPaddingLeft="0dp"
    app:abc_leftTextPaddingRight="0dp"
    app:abc_rightIconColor="@color/black"
    app:abc_rightIconRes="@mipmap/search"
    app:abc_rightText="Подтвердить"
    app:abc_rightTextPaddingLeft="0dp"
    app:abc_rightTextPaddingRight="0dp"
    app:abc_titleText="Этот заголовок немного длинный, я попробую длинный заголовок"
    app:abc_titleTextMaxWidth="180dp" />
  1. Привязка событий в коде
actionBarCommon.setOnLeftIconClickListener(new OnActionBarChildClickListener() {
    @Override
    public void onClick() {
        Toast.makeText(context, "onLeftIconClick", Toast.LENGTH_SHORT).show();
    }
});
```## Для более сложных требований необходимо создать кастомное навигационное меню

Использование выглядит так

1. Кастомная разметка файла title_bar_custom.xml

```xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="48dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/iv_back"
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:padding="15dp"
            android:scaleType="fitCenter"
            android:src="@mipmap/back" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="Пользовательский макет"
            android:textColor="@color/white"
            android:textSize="17sp" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="right"
        android:orientation="horizontal">

        <ImageView
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:padding="15dp"
            android:scaleType="fitCenter"
            android:src="@mipmap/download" />

        <ImageView
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:padding="15dp"
            android:scaleType="fitCenter"
            android:src="@mipmap/delete" />

        <ImageView
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:padding="15dp"
            android:scaleType="fitCenter"
            android:src="@mipmap/еще" />

    </LinearLayout>

</RelativeLayout>
  1. Ссылка на макет```xml <per.goweii.actionbarex.ActionBarEx android:id="@+id/action_bar_ex" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:background="@drawable/title_bar_custom_bg" app:ab_bottomLineColor="@color/line" app:ab_bottomLineHeight="0dp" app:ab_foregroundLayerLayout="@layout/loading_bar" app:ab_statusBarColor="@color/transparent" app:ab_statusBarMode="dark" app:ab_statusBarVisible="48dp" app:ab_titleBarLayout="@layout/title_bar_custom" />

```java
actionBarEx.getView(R.id.iv_back).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        finish();
    }
});

Более сложные требования могут потребовать создания пользовательского подкласса

Создание пользовательского подкласса требует следующих трех шагов, переопределения двух методов:

  1. initAttrs(AttributeSet attrs): Получение пользовательских атрибутов подкласса, не забудьте вызвать super.initAttrs(attrs);
  2. inflateTitleBar(): Инициализация макета TitleBar
  3. Персонализация обратного вызова событий нажатия Приведу пример:
@Override
protected void initAttrs(AttributeSet attrs) {
    super.initAttrs(attrs);

    TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.ActionBarCommon);

    float titleTextMaxWidthDef = getContext().getResources().getDimension(R.dimen.title_bar_title_text_max_width_def);
    float iconPaddingDef = getContext().getResources().getDimension(R.dimen.title_bar_icon_padding_def);
    float textSizeDef = getContext().getResources().getDimension(R.dimen.title_bar_text_size_def);
    float textPaddingLeftDef = getContext().getResources().getDimension(R.dimen.title_bar_text_padding_left_def);
    float textPaddingRightDef = getContext().getResources().getDimension(R.dimen.title_bar_text_padding_right_def);
    float titleTextSizeDef = getContext().getResources().getDimension(R.dimen.title_bar_title_text_size_def);
    int iconColorDef = ContextCompat.getColor(getContext(), R.color.title_bar_icon_color_def);
    int textColorDef = ContextCompat.getColor(getContext(), R.color.title_bar_text_color_def);
    int titleTextColorDef = ContextCompat.getColor(getContext(), R.color.title_bar_title_text_color_def);
}```java
    leftTextClickToFinish = typedArray.getBoolean(R.styleable.ActionBarCommon_abc_leftTextClickToFinish, false);
    leftIconClickToFinish = typedArray.getBoolean(R.styleable.ActionBarCommon_abc_leftIconClickToFinish, false);
    leftText = typedArray.getString(R.styleable.ActionBarCommon_abc_leftText);
    leftTextSize = typedArray.getDimension(R.styleable.ActionBarCommon_abc_leftTextSize, textSizeDef);
    leftTextColor = typedArray.getColor(R.styleable.ActionBarCommon_abc_leftTextColor, textColorDef);
    leftTextPaddingLeft = (int) typedArray.getDimension(R.styleable.ActionBarCommon_abc_leftTextPaddingLeft, textPaddingLeftDef);
    leftTextPaddingRight = (int) typedArray.getDimension(R.styleable.ActionBarCommon_abc_leftTextPaddingRight, textPaddingRightDef);
    leftIconRes = typedArray.getResourceId(R.styleable.ActionBarCommon_abc_leftIconRes, 0);
    leftIconColor = typedArray.getColor(R.styleable.ActionBarCommon_abc_leftIconColor, iconColorDef);
    leftIconPadding = (int) typedArray.getDimension(R.styleable.ActionBarCommon_abc_leftIconPadding, iconPaddingDef);
    leftIconMarginLeft = (int) typedArray.getDimension(R.styleable.ActionBarCommon_abc_leftIconMarginLeft, 0);
}
```java
    rightText = typedArray.getString(R.styleable.ActionBarCommon_abc_rightText);
    rightTextSize = typedArray.getDimension(R.styleable.ActionBarCommon_abc_rightTextSize, textSizeDef);
    rightTextColor = typedArray.getColor(R.styleable.ActionBarCommon_abc_rightTextColor, textColorDef);
    rightTextPaddingLeft = (int) typedArray.getDimension(R.styleable.ActionBarCommon_abc_rightTextPaddingLeft, textPaddingLeftDef);
    rightTextPaddingRight = (int) typedArray.getDimension(R.styleable.ActionBarCommon_abc_rightTextPaddingRight, textPaddingRightDef);
    rightIconRes = typedArray.getResourceId(R.styleable.ActionBarCommon_abc_rightIconRes, 0);
    rightIconColor = typedArray.getColor(R.styleable.ActionBarCommon_abc_rightIconColor, iconColorDef);
    rightIconPadding = (int) typedArray.getDimension(R.styleable.ActionBarCommon_abc_rightIconPadding, iconPaddingDef);
    rightIconMarginRight = (int) typedArray.getDimension(R.styleable.ActionBarCommon_abc_rightIconMarginRight, 0);
``````markdown
LinearLayout.LayoutParams leftIconViewParams = (LinearLayout.LayoutParams) leftIconView.getLayoutParams();
leftIconViewParams.leftMargin = leftIconMarginLeft;
leftIconView.setLayoutParams(leftIconViewParams);
if (leftIconRes > 0) {
    leftIconView.setVisibility(VISIBLE);
    leftIconView.setPadding(leftIconPadding, leftIconPadding, leftIconPadding, leftIconPadding);
    leftIconView.setImageResource(leftIconRes);
    leftIconView.setColorFilter(leftIconColor);
    if (leftIconClickToFinish) {
        leftIconView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finishActivity();
            }
        });
    }
} else {
    leftIconView.setVisibility(GONE);
}

Примечание: В данном контексте finishActivity() переведено как завершитьАктивность(). В реальном коде это должно быть finish() или соответствующий метод завершения активности в зависимости от используемой библиотеки или фреймворка. Хорошо, я признаю, что просто скопировал реализацию кода из ActionBarCommon, но процесс действительно такой, и он довольно прост.


Круто, хотел пропустить, но ты всё равно заметил.

Посмотри на предыдущий пользовательский интерфейс навигационного бара, там есть такая строка:

```xml
app:ab_foregroundLayerLayout="@layout/loading_bar"

Ну и как выглядит этот макет?

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:visibility="gone"
    android:layout_height="50dp">

    <me.zhanghai.android.materialprogressbar.MaterialProgressBar
        android:id="@+id/loading_bar"
        style="@style/loading_bar"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_gravity="bottom"
        android:indeterminate="true"
        app:mpb_progressStyle="horizontal"
        app:mpb_useIntrinsicPadding="false" />

</FrameLayout>

Это просто ProgressBar высотой 1dp, который используется для отображения эффекта загрузки.

В коде можно использовать следующий способ:

actionBarEx.getForegroundLayer().setVisibility(View.VISIBLE);
actionBarEx.getForegroundLayer().setVisibility(View.GONE);

Не кажется ли вам это простым?

Раз уж мы дошли до этого, давайте перечислим некоторые часто используемые методы и свойства

Часто используемые методы

ActionBarEx- getBackgroundLayer() — Получить слой фона

  • getActionBar() — Получить основной элемент

  • getForegroundLayer() — Получить слой переднего плана

  • getStatusBar() — Получить строку состояния

  • getTitleBar() — Получить строку заголовка

  • getTitleBarChild() — Получить дочерний элемент строки заголовка

  • getBottomLine() — Получить нижнюю линию раздела

  • getView(@IdRes int id) — Получить дочерний элемент по идентификатору

  • getActionBarHeight() — Получить высоту элемента ActionBar

  • getStatusBarHeight() — Получить высоту строки состояния

  • getTitleBarHeight() — Получить высоту строки заголовка

  • getBottomHeight() — Получить высоту нижней линии раздела

  • initAttrs(AttributeSet attrs) — Инициализировать атрибуты

  • inflateTitleBar() — Инициализировать макет строки заголовка#### ActionBarCommon- getLeftIconView():получить левую иконку-вид

  • getLeftTextView():получить левый текстовый-вид

  • getTitleTextView():получить центральный заголовок-вид

  • getRightTextView():получить правый текстовый-вид

  • getRightIconView():получить правую иконку-вид

  • setOnLeftIconClickListener(final OnActionBarChildClickListener onLeftIconClickListener):установить слушатель кликов для левой иконки

  • setOnLeftTextClickListener(final OnActionBarChildClickListener onLeftTextClickListener):установить слушатель кликов для левого текста

  • setOnRightTextClickListener(final OnActionBarChildClickListener onRightTextClickListener):установить слушатель кликов для правого текста

  • setOnRightIconClickListener(final OnActionBarChildClickListener onRightIconClickListener):установить слушатель кликов для правой иконки#### ActionBarSearch

  • getLeftIconView():получить левую иконку-вид

  • getLeftTextView():получить левый текстовый-вид

  • getEditTextView():получить центральный текстовый-вид для ввода

  • getRightTextView():получить правый текстовый-вид

  • getRightIconView():получить правую иконку-вид

  • setOnLeftIconClickListener(final OnActionBarChildClickListener onLeftIconClickListener):установить обработчик кликов для левой иконки

  • setOnLeftTextClickListener(final OnActionBarChildClickListener onLeftTextClickListener):установить обработчик кликов для левого текста

  • setOnRightTextClickListener(final OnActionBarChildClickListener onRightTextClickListener):установить обработчик кликов для правого текста

  • setOnRightIconClickListener(final OnActionBarChildClickListener onRightIconClickListener):установить обработчик кликов для правой иконки#### ActionBarSuper

  • getTitleTextView():получить основной текст заголовка

  • getSubtitleTextView():получить текст подзаголовка

  • getLeftActionViews():получить коллекцию левых действий

  • getRightActionViews():получить коллекцию правых действий

  • getLeftActionView(int index):получить левое действие по указанному индексу (начиная с 0, 0 соответствует XML-индексу 1)

  • getRightActionView(int index):получить правое действие по указанному индексу (начиная с 0, 0 соответствует XML-индексу 1)

Описание свойств#### ActionBarEx```xml

```#### ActionBarCommon```xml ```#### ActionBarSearch```xml ```#### ActionBarSuperНекоторые особенности для следующих свойств:- Свойства, не содержащие left/right, применяются одновременно к обеим сторонам. - Свойства, содержащие left/right, переопределяют свойства без указания left/right. - Свойства без указания числового индекса применяются к всему набору индексов на данной стороне. - Свойства с указанием числового индекса переопределяют свойства без указания числового индекса.
<!-- Эти атрибуты должны быть понятны по их названиям, да, потому что я ленивый -->
<attr name="absuper_titleGravity" format="enum">
    <enum name="center" value="0" />
    <enum name="left" value="1" />
    <enum name="right" value="2" />
</attr>
<attr name="absuper_titleTextStyle" format="enum">
    <enum name="normal" value="0" />
    <enum name="bold" value="1" />
</attr>
<attr name="absuper_titleText" format="string|reference" />
<attr name="absuper_titleTextSize" format="dimension|reference" />
<attr name="absuper_titleTextColor" format="color|reference" />
<attr name="absuper_titleTextMaxWidth" format="dimension|reference" />
<attr name="absuper_titlePadding" format="dimension|reference" />
<attr name="absuper_titlePaddingLeft" format="dimension|reference" />
<attr name="absuper_titlePaddingRight" format="dimension|reference" />
<attr name="absuper_titlePaddingTop" format="dimension|reference" />
<attr name="absuper_titlePaddingBottom" format="dimension|reference" />
<attr name="absuper_titleMargin" format="dimension|reference" />
<attr name="absuper_titleMarginLeft" format="dimension|reference" />
<attr name="absuper_titleMarginRight" format="dimension|reference" />
<attr name="absuper_titleMarginTop" format="dimension|reference" />
<attr name="absuper_titleMarginBottom" format="dimension|reference" />
<attr name="absuper_subtitleTextStyle" format="enum">
    <enum name="normal" value="0" />
    <enum name="bold" value="1" />
</attr>
<attr name="absuper_subtitleText" format="string|reference" />
<attr name="absuper_subtitleTextSize" format="dimension|reference" />
<attr name="absuper_subtitleTextColor" format="color|reference" />
<attr name="absuper_subtitleTextMaxWidth" format="dimension|reference" />
```<attr name="absuper_subtitlePadding" format="dimension|reference" />
 <attr name="absuper_subtitlePaddingLeft" format="dimension|reference" />
 <attr name="absuper_subtitlePaddingRight" format="dimension|reference" />
 <attr name="absuper_subtitlePaddingTop" format="dimension|reference" />
 <attr name="absuper_subtitlePaddingBottom" format="dimension|reference" />
 <attr name="absuper_subtitleMargin" format="dimension|reference" />
 <attr name="absuper_subtitleMarginLeft" format="dimension|reference" />
 <attr name="absuper_subtitleMarginRight" format="dimension|reference" />
 <attr name="absuper_subtitleMarginTop" format="dimension|reference" />
 <attr name="absuper_subtitleMarginBottom" format="dimension|reference" />
 ``````markdown
 <attr name="absuper_textStyle" format="enum">
     <enum name="обычный" value="0" />
     <enum name="жирный" value="1" />
 </attr>
 <attr name="absuper_textSize" format="dimension|reference" />
 <attr name="absuper_textColor" format="color|reference" />
 <attr name="absuper_textPadding" format="dimension|reference" />
 <attr name="absuper_textPaddingLeft" format="dimension|reference" />
 <attr name="absuper_textPaddingRight" format="dimension|reference" />
 <attr name="absuper_textPaddingTop" format="dimension|reference" />
 <attr name="absuper_textPaddingBottom" format="dimension|reference" />
 <attr name="absuper_textMargin" format="dimension|reference" />
 <attr name="absuper_textMarginLeft" format="dimension|reference" />
 <attr name="absuper_textMarginRight" format="dimension|reference" />
 <attr name="absuper_textMarginTop" format="dimension|reference" />
 <attr name="absuper_textMarginBottom" format="dimension|reference" />
 <attr name="absuper_iconColor" format="color|reference" />
 <attr name="absuper_iconPadding" format="dimension|reference" />
 <attr name="absuper_iconPaddingLeft" format="dimension|reference" />
 <attr name="absuper_iconPaddingRight" format="dimension|reference" />
 <attr name="absuper_iconPaddingTop" format="dimension|reference" />
 <attr name="absuper_iconPaddingBottom" format="dimension|reference" />
 <attr name="absuper_iconMargin" format="dimension|reference" />
 <attr name="absuper_iconMarginLeft" format="dimension|reference" />
 <attr name="absuper_iconMarginRight" format="dimension|reference" /><attr name="absuper_iconMarginTop" format="размер|ссылка" />
<attr name="absuper_iconMarginBottom" format="размер|ссылка" />
```<attr name="absuper_leftTextStyle" format="enum">
    <enum name="обычный" value="0" />
    <enum name="жирный" value="1" />
</attr>
<attr name="absuper_leftPadding" format="размер|ссылка" />
<attr name="absuper_leftPaddingLeft" format="размер|ссылка" />
<attr name="absuper_leftPaddingRight" format="размер|ссылка" />
<attr name="absuper_leftPaddingTop" format="размер|ссылка" />
<attr name="absuper_leftPaddingBottom" format="размер|ссылка" />
<attr name="absuper_leftTextSize" format="размер|ссылка" />
<attr name="absuper_leftTextColor" format="цвет|ссылка" />
<attr name="absuper_leftTextPadding" format="размер|ссылка" />
<attr name="absuper_leftTextPaddingLeft" format="размер|ссылка" />
<attr name="absuper_leftTextPaddingRight" format="размер|ссылка" />
<attr name="absuper_leftTextPaddingTop" format="размер|ссылка" />
<attr name="absuper_leftTextPaddingBottom" format="размер|ссылка" />
<attr name="absuper_leftTextMargin" format="размер|ссылка" />
<attr name="absuper_leftTextMarginLeft" format="размер|ссылка" />
<attr name="absuper_leftTextMarginRight" format="размер|ссылка" />
<attr name="absuper_leftTextMarginTop" format="размер|ссылка" />
<attr name="absuper_leftTextMarginBottom" format="размер|ссылка" />
<attr name="absuper_leftIconColor" format="цвет|ссылка" />
<attr name="absuper_leftIconPadding" format="размер|ссылка" />
<attr name="absuper_leftIconPaddingLeft" format="размер|ссылка" />
<attr name="absuper_leftIconPaddingRight" format="размер|ссылка" />
<attr name="absuper_leftIconPaddingTop" format="размер|ссылка" />
<attr name="absuper_leftIconPaddingBottom" format="размер|ссылка" />
<attr name="absuper_leftIconMargin" format="размер|ссылка" />
<attr name="absuper_leftIconMarginLeft" format="размер|ссылка" />
<attr name="absuper_leftIconMarginRight" format="размер|ссылка" />
<attr name="absuper_leftIconMarginTop" format="размер|ссылка" />
<attr name="absuper_leftIconMarginBottom" format="размер|ссылка" />```<attr name="absuper_rightTextStyle" format="enum">
     <enum name="обычный" value="0" />
     <enum name="жирный" value="1" />
 </attr>
 <attr name="absuper_rightPadding" format="размер|ссылка" />
 <attr name="absuper_rightPaddingLeft" format="размер|ссылка" />
 <attr name="absuper_rightPaddingRight" format="размер|ссылка" />
 <attr name="absuper_rightPaddingTop" format="размер|ссылка" />
 <attr name="absuper_rightPaddingBottom" format="размер|ссылка" />
 <attr name="absuper_rightTextSize" format="размер|ссылка" />
 <attr name="absuper_rightTextColor" format="цвет|ссылка" />
 <attr name="absuper_rightTextPadding" format="размер|ссылка" />
 <attr name="absuper_rightTextPaddingLeft" format="размер|ссылка" />
 <attr name="absuper_rightTextPaddingRight" format="размер|ссылка" />
 <attr name="absuper_rightTextPaddingTop" format="размер|ссылка" />
 <attr name="absuper_rightTextPaddingBottom" format="размер|ссылка" />
 <attr name="absuper_rightTextMargin" format="размер|ссылка" />
 <attr name="absuper_rightTextMarginLeft" format="размер|ссылка" />
 <attr name="absuper_rightTextMarginRight" format="размер|ссылка" />
 <attr name="absuper_rightTextMarginTop" format="размер|ссылка" />
 <attr name="absuper_rightTextMarginBottom" format="размер|ссылка" />
 <attr name="absuper_rightIconColor" format="цвет|ссылка" />
 <attr name="absuper_rightIconPadding" format="размер|ссылка" />
 <attr name="absuper_rightIconPaddingLeft" format="размер|ссылка" />
 <attr name="absuper_rightIconPaddingRight" format="размер|ссылка" />
 <attr name="absuper_rightIconPaddingTop" format="размер|ссылка" />
 <attr name="absuper_rightIconPaddingBottom" format="размер|ссылка" />
 <attr name="absuper_rightIconMargin" format="размер|ссылка" />
 <attr name="absuper_rightIconMarginLeft" format="размер|ссылка" />
 <attr name="absuper_rightIconMarginRight" format="размер|ссылка" />
 <attr name="absuper_rightIconMarginTop" format="размер|ссылка" />
 <attr name="absuper_rightIconMarginBottom" format="размер|ссылка" />
 
```<attr name="absuper_left1TextStyle" format="enum">
      <enum name="обычный" value="0" />
      <enum name="жирный" value="1" />
  </attr>
  ``` <attr name="absuper_left1TextClickToFinish" format="boolean|reference" />
  <attr name="absuper_left1IconClickToFinish" format="boolean|reference" />
  <attr name="absuper_left1Text" format="string|dimension" />
  <attr name="absuper_left1TextSize" format="dimension|reference" />
  <attr name="absuper_left1TextColor" format="color|reference" />
  <attr name="absuper_left1TextPadding" format="dimension|reference" />
  <attr name="absuper_left1TextPaddingLeft" format="dimension|reference" />
  <attr name="absuper_left1TextPaddingRight" format="dimension|reference" />
  <attr name="absuper_left1TextPaddingTop" format="dimension|reference" />
  <attr name="absuper_left1TextPaddingBottom" format="dimension|reference" />
  <attr name="absuper_left1TextMargin" format="dimension|reference" />
  <attr name="absuper_left1TextMarginLeft" format="dimension|reference" />
  <attr name="absuper_left1TextMarginRight" format="dimension|reference" />
  <attr name="absuper_left1TextMarginTop" format="dimension|reference" />
  <attr name="absuper_left1TextMarginBottom" format="dimension|reference" />
  <attr name="absuper_left1Icon" format="reference" />
  <attr name="absuper_left1IconColor" format="color|reference" />
  <attr name="absuper_left1IconPadding" format="dimension|reference" />
  <attr name="absuper_left1IconPaddingLeft" format="dimension|reference" />
  <attr name="absuper_left1IconPaddingRight" format="dimension|reference" />
  <attr name="absuper_left1IconPaddingTop" format="dimension|reference" />
  <attr name="absuper_left1IconPaddingBottom" format="dimension|reference" />
  <attr name="absuper_left1IconMargin" format="dimension|reference" />
  <attr name="absuper_left1IconMarginLeft" format="dimension|reference" />
  <attr name="absuper_left1IconMarginRight" format="dimension|reference" />
  <attr name="absuper_left1IconMarginTop" format="dimension|reference" />
  <attr name="absuper_left1IconMarginBottom" format="dimension|reference" />
  <!-- Пропущены конфигурации для левого 2-4 -->
  <attr name="absuper_left5TextStyle" format="enum">
      <enum name="normal" value="0" />
      <enum name="bold" value="1" />
  </attr>
  <attr name="absuper_left5TextClickToFinish" format="boolean|reference" />
  <attr name="absuper_left5IconClickToFinish" format="boolean|reference" />
  <attr name="absuper_left5Text" format="string|dimension" />
  <attr name="absuper_left5TextSize" format="dimension|reference" /><attr name="absuper_left5TextColor" format="color|reference" />
<attr name="absuper_left5TextPadding" format="dimension|reference" />
<attr name="absuper_left5TextPaddingLeft" format="dimension|reference" />
<attr name="absuper_left5TextPaddingRight" format="dimension|reference" />
<attr name="absuper_left5TextPaddingTop" format="dimension|reference" />
<attr name="absuper_left5TextPaddingBottom" format="dimension|reference" />
<attr name="absuper_left5TextMargin" format="dimension|reference" />
<attr name="absuper_left5TextMarginLeft" format="dimension|reference" />
<attr name="absuper_left5TextMarginRight" format="dimension|reference" />
<attr name="absuper_left5TextMarginTop" format="dimension|reference" />
<attr name="absuper_left5TextMarginBottom" format="dimension|reference" />
<attr name="absuper_left5Icon" format="reference" />
<attr name="absuper_left5IconColor" format="color|reference" />
<attr name="absuper_left5IconPadding" format="dimension|reference" />
<attr name="absuper_left5IconPaddingLeft" format="dimension|reference" />
<attr name="absuper_left5IconPaddingRight" format="dimension|reference" />
<attr name="absuper_left5IconPaddingTop" format="dimension|reference" />
<attr name="absuper_left5IconPaddingBottom" format="dimension|reference" />
<attr name="absuper_left5IconMargin" format="dimension|reference" />
<attr name="absuper_left5IconMarginLeft" format="dimension|reference" />
<attr name="absuper_left5IconMarginRight" format="dimension|reference" />
<attr name="absuper_left5IconMarginTop" format="dimension|reference" />
<attr name="absuper_left5IconMarginBottom" format="dimension|reference" />
<attr name="absuper_right1TextStyle" format="enum">
      <enum name="normal" value="0" />
      <enum name="bold" value="1" />
</attr>
<attr name="absuper_right1TextClickToFinish" format="boolean|reference" />
<attr name="absuper_right1IconClickToFinish" format="boolean|reference" />
<attr name="absuper_right1Text" format="string|dimension" />
<attr name="absuper_right1TextSize" format="dimension|reference" />
<attr name="absuper_right1TextColor" format="color|reference" />
<attr name="absuper_right1TextPadding" format="dimension|reference" />
<attr name="absuper_right1TextPaddingLeft" format="dimension|reference" />
<attr name="absuper_right1TextPaddingRight" format="dimension|reference" />
<attr name="absuper_right1TextPaddingTop" format="dimension|reference" /> <attr name="absuper_right1TextPaddingBottom" format="dimension|reference" />
  <attr name="absuper_right1TextMargin" format="dimension|reference" />
  <attr name="absuper_right1TextMarginLeft" format="dimension|reference" />
  <attr name="absuper_right1TextMarginRight" format="dimension|reference" />
  <attr name="absuper_right1TextMarginTop" format="dimension|reference" />
  <attr name="absuper_right1TextMarginBottom" format="dimension|reference" />
  <attr name="absuper_right1Icon" format="reference" />
  <attr name="absuper_right1IconColor" format="color|reference" />
  <attr name="absuper_right1IconPadding" format="dimension|reference" />
  <attr name="absuper_right1IconPaddingLeft" format="dimension|reference" />
  <attr name="absuper_right1IconPaddingRight" format="dimension|reference" />
  <attr name="absuper_right1IconPaddingTop" format="dimension|reference" />
  <attr name="absuper_right1IconPaddingBottom" format="dimension|reference" />
  <attr name="absuper_right1IconMargin" format="dimension|reference" />
  <attr name="absuper_right1IconMarginLeft" format="dimension|reference" />
  <attr name="absuper_right1IconMarginRight" format="dimension|reference" />
  <attr name="absuper_right1IconMarginTop" format="dimension|reference" />
  <attr name="absuper_right1IconMarginBottom" format="dimension|reference" />
  <!-- Пропущены конфигурации правой стороны 2-4 -->
  <attr name="absuper_right5TextStyle" format="enum">
      <enum name="normal" value="0" />
      <enum name="bold" value="1" />
  </attr>
  <attr name="absuper_right5TextClickToFinish" format="boolean|reference" />
  <attr name="absuper_right5IconClickToFinish" format="boolean|reference" />
  <attr name="absuper_right5Text" format="string|dimension" />
  <attr name="absuper_right5TextSize" format="dimension|reference" />
  <attr name="absuper_right5TextColor" format="color|reference" />
  <attr name="absuper_right5TextPadding" format="dimension|reference" />
  <attr name="absuper_right5TextPaddingLeft" format="dimension|reference" />
  <attr name="absuper_right5TextPaddingRight" format="dimension|reference" />
  <attr name="absuper_right5TextPaddingTop" format="dimension|reference" />
  <attr name="absuper_right5TextPaddingBottom" format="dimension|reference" />
  <attr name="absuper_right5TextMargin" format="dimension|reference" />
  <attr name="absuper_right5TextMarginLeft" format="dimension|reference" /><attr name="absuper_right5TextMarginRight" format="dimension|reference" />
<attr name="absuper_right5TextMarginTop" format="dimension|reference" />
<attr name="absuper_right5TextMarginBottom" format="dimension|reference" />
<attr name="absuper_right5Icon" format="reference" />
<attr name="absuper_right5IconColor" format="color|reference" />
<attr name="absuper_right5IconPadding" format="dimension|reference" />
<attr name="absuper_right5IconPaddingLeft" format="dimension|reference" />
<attr name="absuper_right5IconPaddingRight" format="dimension|reference" />
<attr name="absuper_right5IconPaddingTop" format="dimension|reference" />
<attr name="absuper_right5IconPaddingBottom" format="dimension|reference" />
<attr name="absuper_right5IconMargin" format="dimension|reference" />
<attr name="absuper_right5IconMarginLeft" format="dimension|reference" />
<attr name="absuper_right5IconMarginRight" format="dimension|reference" />
<attr name="absuper_right5IconMarginTop" format="dimension|reference" />
<attr name="absuper_right5IconMarginBottom" format="dimension|reference" />
```# Реализационные детали```Теперь перейдем к основному содержанию. Начнем с рассмотрения структуры по уровням.

### Повторное рассмотрение структуры по уровням

- FrameLayout (ActionBarEx сам по себе, наследуется от FrameLayout)
  - ImageView или пользовательский макет (фоновый слой BackgroundLayer)
  - LinearLayout (основной слой ActionBar)
    - View (панель состояния StatusBar)
    - FrameLayout (панель заголовка TitleBar)
    - View (нижняя разделительная линия BottomLine)
  - Пользовательский макет (передний слой ForegroundLayer)

Таким образом, вы должны лучше понять структуру.

### Рассмотрим основные функции по коду

- ActionBarEx (пользовательский элемент управления, отвечающий за отображение макета)
- StatusBarUtils (отвечает за погружение системной панели состояния и переключение режима яркости и темноты значков)

### Рассмотрим процесс настройки ActionBarEx

#### Сначала рассмотрим, что делает конструктор

```java
public ActionBarEx(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    this.mContext = context;
    mDisplayInfoUtils = DisplayInfoUtils.getInstance(context);
    mStatusBarHeight = mDisplayInfoUtils.getStatusBarHeight();
    initAttrs(attrs);
    makeImmersion();
    initView();
}

Здесь инициализируется объект DisplayInfoUtils, а также получается высота системной панели состояния.

Затем вызываются три метода, рассмотрим их по отдельности:

initAttrs(AttributeSet attrs)

Основная цель — получить пользовательские атрибуты и установить значения по умолчанию. Это стандартная операция для пользовательских элементов управления.#### makeImmersion()

Из названия можно понять, что это метод для настройки沉浸模式。Сначала приведём код:

private void makeImmersion() {
    if (!mAutoImmersion) {
        return;
    }
    Activity activity = getActivity();
    if (activity == null) {
        return;
    }
    setSystemStatusBar(activity);
    hintSystemActionBar(activity);
}

В двух последних строках устанавливается системный沉浸状态栏 и скрываются встроенные навигационные элементы.Как реализовать погружение статус-бара, я не буду подробно описывать, так как это просто методы, найденные на Бaidu, и код от некоторых экспертов на GitHub, адаптированный для устройств Xiaomi, Meizu и VIVO. Это не гарантирует работоспособность на всех системах. Если у вас есть лучшее решение для адаптации, присоединяйтесь к обсуждению, или вы можете установить mAutoImmersion=false для отключения автоматической адаптации и реализовать свои методы в Activity.

метод initView()

Этот метод является ключевым для проекта, но он очень простой и не представляет собой большого труда.```java private void initView() { // 1 Initialization of BackgroundLayer // 1.1 Initialization of background image if (mBackgroundLayerLayoutRes > 0) { mBackgroundLayer = inflate(getContext(), mBackgroundLayerLayoutRes, null); mBackgroundLayer.setLayoutParams(makeLayerLayoutParams()); addView(mBackgroundLayer); } else { if (mBackgroundLayerImageRes > 0) { ImageView actionBarImageView = new ImageView(mContext); actionBarImageView.setLayoutParams(makeLayerLayoutParams()); actionBarImageView.setImageResource(mBackgroundLayerImageRes); actionBarImageView.setScaleType(ImageView.ScaleType.CENTER_CROP); addView(actionBarImageView); } } }

// 2 Initialization of ContentLayer (ActionBar)
mActionBar = (LinearLayout) inflate(getContext(), R.layout.action_bar, null);
mActionBar.setLayoutParams(makeLayoutParamsWithHeight(getActionBarHeight()));
// 2.1 Initialization of StatusBar
mStatusBar = mActionBar.findViewById(R.id.status_bar);
mStatusBar.setLayoutParams(makeLayoutParamsWithHeight(mStatusBarHeight));
mStatusBar.setBackgroundColor(mStatusBarColor);
mStatusBar.setVisibility(mStatusBarVisible ? VISIBLE : GONE);
// 2.2 Initialization of TitleBar
mTitleBar = mActionBar.findViewById(R.id.title_bar);
mTitleBar.setClickable(true);
mTitleBar.setFocusable(true);
mTitleBar.setFocusableInTouchMode(true);
mTitleBar.setLayoutParams(makeLayoutParamsWithHeight(mTitleBarHeight));
mTitleBarChild = inflateTitleBar();
if (mTitleBarChild != null) {
    mTitleBar.addView(mTitleBarChild);
}
// 2.3 Initialization of BottomLine
mBottomLine = mActionBar.findViewById(R.id.bottom_line);
mBottomLine.setLayoutParams(makeLayoutParamsWithHeight(mBottomLineHeight));
mBottomLine.setBackgroundColor(mBottomLineColor);
addView(mActionBar);    
// 3 Initialization of ForegroundLayer
if (mForegroundLayerLayoutRes > 0) {
    mForegroundLayer = inflate(getContext(), mForegroundLayerLayoutRes, null);
    mForegroundLayer.setLayoutParams(makeLayerLayoutParams());
    addView(mForegroundLayer);
}
}
```Здесь есть метод `inflateTitleBar()`, добавленный для наследования и реализации. Он выглядит следующим образом:

```java
protected View inflateTitleBar() {
    if (mTitleBarLayoutRes > 0) {
        return inflate(getContext(), mTitleBarLayoutRes, null);
    }
    return null;
}

Затем. И ещё затем? О, нет, всё.

Всё, что было сделано, не привело к какому-либо эффекту, это просто пустая оболочка. Да, любой эффект требует настройки.

ActionBarEx просто разделяет уровни навигационной панели и ограничивает функциональность каждого уровня.

Конечно, каждый проект имеет свой уникальный стиль дизайна, и невозможно каждый раз добавлять в разметку ActionBarEx, затем использовать собственную разметку и в коде получать элементы управления для их инициализации и привязки событий. Для более сложных случаев, конечно, потребуется наследование и создание собственных подклассов, что можно увидеть в примерах SimpleActionBar или SearchActionBar.

Заключение

Это полностью личный проект, и есть несколько моментов, которые стоит упомянуть:

  1. Если вам понравился проект, пожалуйста, оставьте звёздочку (GitHub).

  2. Если вы обнаружили ошибку, пожалуйста, сообщите об этом или оставьте Issue (Issues).

  3. Любое использование или распространение должно сопровождаться ссылкой на источник.

  4. Если у вас есть идеи по улучшению, пожалуйста, сообщите об этом, проект находится в разработке.# Если вам понравилось приложение, пожалуйста, поддержите меня, купив мне кофе!

wx_qrcode

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Тао расширяет и настраивает ActionBar, идеально заменяя стандартную систему Android. Развернуть Свернуть
LGPL-3.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Язык

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/goweii-ActionBarEx.git
git@api.gitlife.ru:oschina-mirror/goweii-ActionBarEx.git
oschina-mirror
goweii-ActionBarEx
goweii-ActionBarEx
master