Расширяемый и гибко настраиваемый ActionBar, полноценная замена стандартному Android ActionBar.
Во-первых, остановимся на официальном. Официальный имеет не унифицированный стиль на разных системах, слишком мало опций для кастомизации, что не удовлетворяет потребности разработчиков, поэтому и появляются множество открытых проектов.Во-вторых, остановимся на открытых проектах. Большинство открытых проектов, которые я нашёл и использовал, представляют собой просто упакованные фиксированные стили или управление видимостью элементов. Но они ограничены кастомизацией левого и правого иконок и стиля центрального заголовка. А что, если нужно кастомизировать фон ActionBar? Что, если нужно отобразить изображение на фоне? Что, если нужно растянуть изображение под статус-бар? Что, если нужно сделать фон полупрозрачным с эффектом размытия? Что, если нужно ограничить размер иконок кнопок? Что, если нужно кастомизировать фон центрального заголовка? Что, если нужно отобразить поле поиска? Что, если нужно добавить иконки очистки и поиска в поле поиска? Что, если нужно кастомизировать стиль поля поиска? Что, если нужно отобразить эффект загрузки при сетевых запросах? И так далее. И я уверен, что таких требований немало.
Может быть, есть фреймворки, которые могут это сделать, но я пока не нашёл.
Конечно, это не означает, что это возможно, но я уверен, что этот проект может удовлетворить более 99% требований на рынке.
**Откуда такая уверенность? Давайте сначала посмотрим на структуру всего проекта.**Проект ActionBarEx состоит из трех основных уровней, каждый из которых отвечает за определенные функции и имеет свои названия и соглашения. | Ключевой уровень | Подуровень | Описание | Примечания | | ------------------------------ | --------------- | ---------- | :------------------ | | BackgroundLayer | | Фоновый слой | Допускается кастомизация размещения | | ActionBarLayer | | Слой действий | Вертикальное линейное размещение | | | StatusBar | Статусная панель | | | | TitleBar | Заголовочная панель | Допускается кастомизация размещения | | | BottomLine | Разделительная линия | | | ForegroundLayer | | Фронтальный слой | Допускается кастомизация размещения |- BackgroundLayer Слой фона, отвечающий за отрисовку фона всего Action Bar, например, для реализации полупрозрачного фона, фона изображения или эффекта размытия Гаусса.
Не спеши, я расскажу о деталях реализации.
Хорошо, не спеши, я всё расскажу. Положи этот кубический объект на место...
Чтобы использовать, нужно ещё разобраться с несколькими классами:
allprojects {
repositories {
...
maven { url 'https://www.jitpack.io' }
}
}
С версии 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" />
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>
```java
actionBarEx.getView(R.id.iv_back).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
Создание пользовательского подкласса требует следующих трех шагов, переопределения двух методов:
@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);
Не кажется ли вам это простым?
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)
<!-- Эти атрибуты должны быть понятны по их названиям, да, потому что я ленивый -->
<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, а также получается высота системной панели состояния.
Затем вызываются три метода, рассмотрим их по отдельности:
Основная цель — получить пользовательские атрибуты и установить значения по умолчанию. Это стандартная операция для пользовательских элементов управления.#### 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.
Этот метод является ключевым для проекта, но он очень простой и не представляет собой большого труда.```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.
Это полностью личный проект, и есть несколько моментов, которые стоит упомянуть:
Если вам понравился проект, пожалуйста, оставьте звёздочку (GitHub).
Если вы обнаружили ошибку, пожалуйста, сообщите об этом или оставьте Issue (Issues).
Любое использование или распространение должно сопровождаться ссылкой на источник.
Если у вас есть идеи по улучшению, пожалуйста, сообщите об этом, проект находится в разработке.# Если вам понравилось приложение, пожалуйста, поддержите меня, купив мне кофе!
![]() |
---|
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )