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

OSCHINA-MIRROR/chinasoft3_ohos-ChromeLikeTabSwitcher

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

ChromeLikeTabSwitcher

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

  • Название проекта: ChromeLikeTabSwitcher
  • Серия: адаптация и портирование сторонних компонентов для OpenHarmony
  • Функционал: ChromeLikeTabSwitcher — это библиотека, имитирующая переключение вкладок в браузере Chrome. Она предоставляет переключатель вкладок, аналогичный тому, который используется в браузере Chrome.
  • Состояние портирования: основные функции завершены
  • Различия при вызове: отсутствуют
  • Версия SDK: 6
  • Версия DevEco Studio: 2.2 beta1
  • Базовая версия: tag 0.4.6

Демо эффекта

  • Прокрутка главной страницы вверх и вниз

Пример

  • Функция UNDO

Пример

  • Добавление новой вкладки

Пример Пример

Инструкция по установке

  1. В файле build.gradle в корневой директории проекта:
allprojects {
    repositories {
        maven {
            url 'https://s01.oss.sonatype.org/content/repositories/releases/'
        }
    }
}
  1. В файле build.gradle модуля entry:
dependencies {
    implementation('com.gitee.chinasoft_ohos:ChromeLikeTabSwitcher:1.0.1')
    implementation('com.gitee.chinasoft_ohos:ChromeLikeTabSwitcher_ohos_util:1.0.0')
    implementation('com.gitee.chinasoft_ohos:ChromeLikeTabSwitcher_java_util:1.0.0')
    implementation('com.gitee.chinasoft_ohos:ChromeLikeTabSwitcher_materialviewlibrary:1.0.0')
    ...
}

Проект можно запустить непосредственно с SDK 6 и DevEco Studio 2.2 beta1. Если проект не запускается, удалите файлы .gradle, .idea, build, gradle, build.gradle, создайте новый проект в соответствии со своей версией и скопируйте соответствующие файлы нового проекта в корневую директорию.#### Инструкция по использованию

Переключатель вкладок библиотеки реализован как пользовательский вид TabSwitcher. Его можно объявить программно или добавить в активность или фрагмент через XML-ресурс. Ниже приведён пример XML-кода, показывающий, как добавить этот вид в XML-ресурс_layout. Обычно следует использовать атрибуты layout_width и layout_height для полноценного отображения переключателя вкладок match_parent. Кроме того, этот вид предоставляет различные пользовательские атрибуты для настройки его внешнего вида, что также видно на данном примере.

<?xml version="1.0" encoding="utf-8"?>
<de.mrapp.tabswitcher.colorUi.widget.ColorDirectionalLayout
    ohos:id="$+id:root"
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    xmlns:app="http://schemas.huawei.com/apk/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:orientation="vertical"
    ohos:theme_prefix="main">

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

TabSwitcher tabSwitcher = new TabSwitcher(context);
tabSwitcher.showAddTabButton(createAddTabButtonListener());
tabSwitcher.setToolbarNavigationIcon(ResourceTable.Media_ic_plus_white_24dp, createAddTabListener());
```Каждая вкладка, содержащаяся в TabSwitcher, представляет собой экземпляр класса Tab. Ниже приведён пример Java-кода, демонстрирующий создание новой вкладки и её добавление в TabSwitcher. Вкладка может иметь свои собственные настройки, такие как иконка, цвет фона и цвет шрифта. Метод setParameters позволяет связать Bundle с конкретной вкладкой, который может содержать дополнительную информацию о ней. Реализация интерфейса Tab.Callback и использование метода addCallback позволяют наблюдать за изменениями свойств вкладки.```java
Tab tab = new Tab("Заголовок");
Bundle parameters = new Bundle();
tab.setIcon(ResourceTable.Media_ic_file_outline_18dp);
...
tab.setParameters(parameters);

Для указания внешнего вида вкладок в TabSwitcher необходимо переопределить абстрактный класс TabSwitcherDecorator и применить его к TabSwitcher через метод setDecorator. Этот подход часто используется для заполнения развивающегося паттерна ListView, RecyclerView и других аналогичных компонентов.

Методы onInflateView и onShowTab должны быть переопределены для управления отображением вкладок. Первый метод используется для расширения представлений, используемых вкладками, второй — для настройки внешнего вида расширенных представлений в зависимости от текущего состояния. Метод findComponentById внутри декоратора может использоваться для ссылки на компоненты представления.

Если используются различные представления для разных вкладок, то также следует переопределить методы getViewTypeCount и getViewType. Первый метод возвращает общее количество различных типов представлений, которые могут быть расширены методом onInflateView, второй — должен вернуть уникальное целое число, которое определяет тип представления для конкретной вкладки. Пример реализации этого класса представлен ниже:

public class CustomTabSwitcherDecorator extends TabSwitcherDecorator {

    @Override
    public int onGetViewTypeCount() {
        return 2; // Например, два типа представлений
    }
}
``````java
@Override
public int onGetViewType(int position) {
    if (position % 2 == 0) {
        return 0;
    } else {
        return 1;
    }
}
class Decorator extends TabSwitcherDecorator {

    @NonNull
    @Override
    public View onInflateView(@NonNull LayoutInflater inflater,
                              @Nullable ViewGroup parent, int viewType) {
        Component view;
        if (viewType == 0) {
            LogUtil.loge("=== onInflateView 0");
            view = inflater.parse(ResourceTable.Layout_tab_text_view, parent, false);
        } else if (viewType == 1) {
            LogUtil.loge("=== onInflateView 1");
            view = inflater.parse(ResourceTable.Layout_tab_edit_text, parent, false);
        } else {
            LogUtil.loge("=== onInflateView 2");
            view = inflater.parse(ResourceTable.Layout_tab_list_view, parent, false);
        }

        Toolbar toolbar = (Toolbar) view.findComponentById(ResourceTable.Id_toolbar);
        toolbar.inflateMenu(ResourceTable.Layout_tab);
        toolbar.setOnMenuItemClickListener(tabSwitcher, createToolbarMenuListener());
        TabSwitcher.setupWithToolbar(tabSwitcher, toolbar, createTabSwitcherButtonListener());
        return view;
    }
}
``````java
@Override
public void onShowTab(@NonNull Context context, @NonNull TabSwitcher tabSwitcher, 
                      @NonNull View view, @NonNull Tab tab, int index, int viewType,
                      @Nullable Bundle savedInstanceState) {
    Text textView = findComponentById(ResourceTable.Id_title);
    textView.setText((String) tab.getTitle());
    Toolbar toolbar = findComponentById(ResourceTable.Id_toolbar);
    toolbar.addMenuClickListener();
    toolbar.setVisibility(tabSwitcher.isSwitcherShown() ? Component.HIDE : Component.VISIBLE);
    if (toolbar.getMenu() != null) {
        String theme_name = getThemeValue("theme_name");
        if ("dark".equals(theme_name)) {
            toolbar.getMenu().setImageSrc(de.mrapp.tabswitcher.ResourceTable.Media_more_menu_white);
            toolbar.setButtonColor(1, Color.WHITE);
        } else {
            toolbar.getMenu().setImageSrc(de.mrapp.tabswitcher.ResourceTable.Media_more_menu);
            toolbar.setButtonColor(0.5f, Color.DKGRAY);
        }
    }
    ColorUiUtil.changeTheme(view, getContext().getTheme());
    if (viewType == 1) {
        LogUtil.loge("=== onShowTab viewType -> 1");
        TextField editText = findComponentById(ResourceTable.Id_edit);
        if (savedInstanceState == null) {
            editText.setText("");
        }
    }
}
```            editText.requestFocus();
        } else if (viewType == 2 && state != null) {
            LogUtil.loge("=== onShowTab viewType -> 2");
            ListContainer listView = findComponentById(ResourceTable.Id_list);
            state.loadItems(listView);
        }
    }

    @Override
    public int getViewTypeCount() {
        return 3;
    }

    @Override
    public int getViewType(@NonNull Tab tab, int index) {
        Bundle parameters = tab.getParameters();
        return parameters != null ? parameters.getInt("view_type") : 0;
    }
    
    @Override
    public void onSaveInstanceState(@NonNull View view, @NonNull Tab tab, int index,
                                    int viewType, @NonNull Bundle outState) {
        // Сохраняет текущее состояние вкладки в Bundle outState при необходимости
    }

}

Для применения декоратора к `TabSwitcher`, метод `setDecorator` следует использовать следующим образом. В случае отсутствия установленного декоратора, будет немедленно выброшено исключение `IllegalStateException`, когда виджет должен быть видимым.

```java
tabSwitcher.setDecorator(new Decorator());
```

Чтобы наблюдать за состоянием `TabSwitcher`, можно реализовать слушатель `TabSwitcherListener`. Этот интерфейс предоставляет методы, которые вызываются при добавлении или удалении вкладок из `TabSwitcher`, а также при скрытии или показе `TabSwitcher` (только при использовании макета для смартфонов). Экземпляры типа `TabSwitcherListener` могут быть добавлены с помощью метода `addListener`.

Для наблюдения за событиями закрытия вкладок, можно использовать метод `addTabCloseListener` для добавления экземпляров интерфейса `TabCloseListener`.

##### Использование анимацииКласс `TabSwitcher` предоставляет различные методы для добавления или удаления одной или нескольких вкладок. При наличии видимого `TabSwitcher` добавление или удаление вкладок происходит с анимацией. Для использования пользовательской анимации можно передать экземпляр класса `Animation` в метод.

##### Анимация прокрутки

При использовании макета с мобильными устройствами `SwipeAnimation` по умолчанию используется для добавления или удаления вкладок. Это приводит к горизонтальному свайпу вкладок (или вертикальному свайпу при горизонтальной ориентации устройства). Указание значения enum `SwipeAnimation.SwipeDirection` позволяет указать, следует ли двигаться слева направо или справа налево (соответственно сверху вниз или снизу вверх при горизонтальной ориентации).

Пример кода ниже показывает, как использовать конструктор `SwipeAnimation`, чтобы создать экземпляр класса:

```java
Animation animation = new SwipeAnimation.Builder().setDuration(2000)
        .setInterpolator(new LinearInterpolator()).setDirection(SwipeAnimation.SwipeDirection.LEFT)
        .create();
```

### Инструментальная панель и менюПредоставляемый библиотекой `TabSwitcher` вид позволяет отображать инструментальную панель. По умолчанию,
панель инструментов всегда скрыта. Чтобы показать её, следует воспользоваться методом `showToolbars`.
Используя макет смартфона, панель инструментов будет отображена при активной вкладке или когда вкладка
переключателя не содержит никаких вкладок. При использовании макета планшета две панели инструментов будут
всегда отображены  одна слева от вкладок, другая справа. Для обращения к панелям инструментов можно использовать
метод `getToolbars`. Он возвращает массив, содержащий панели инструментов текущего макета.
При использовании макета смартфона массив `Toolbar` содержит одну панель; при использовании макета планшета
левая панель находится в индексе 0, а правая  в индексе 1.Класс `TabSwitcher` предоставляет несколько методов для установки заголовков, навигационных значков и меню панели инструментов. Метод `setToolbarTitle` позволяет установить заголовок. При использовании макета планшета заголовок применяется к левой панели инструментов. Метод `setToolbarNavigationIcon` позволяет указать навигационный значок панели инструментов и слушатель события клика по этому значку. При использовании макета планшета значок применяется к левой панели инструментов. Чтобы добавить меню в панель инструментов `TabSwitcher`, можно использовать метод `inflateToolbarMenu`. В дополнение к ID ресурса меню, которое должно быть применено, он также позволяет указать слушатель, который будет уведомлен при нажатии на элементы меню.

Для предоставления кнопки, аналогичной кнопкам в браузере Chrome, которая отображает общее количество активных вкладок и позволяет переключать видимость переключателя вкладок, библиотека предлагает класс `TabSwitcherButton`. Он реализует пользовательскую кнопку `ImageButton`, которая реализует интерфейс `TabSwitcherListener`, чтобы поддерживать актуальное число отображаемых вкладок. Внешний вид этой кнопки определяется классом `TabSwitcherDrawable`. Если `TabSwitcherButton` должен использоваться как часть меню панели инструментов, то его следует включить в ресурсы меню. Пример использования приведён ниже:Пример использования TabSwitcherDrawable:
```java
private void initImage() {
    image = new Image(getContext());
}
```

```markdown
Ресурс res = конвертRes(контекст(), ResourceTable.Media_вкладка_переключатель_изображение_фон);
// Изображение, которое используется кнопкой с изображением.
drawable = new TabSwitcherDrawable(контекст(), res);
изображение.setИзображениеЭлемент(drawable);
StackLayout.LayoutConfig params = new LayoutConfig(StackLayout.LayoutConfig.MATCH_PARENT, StackLayout.LayoutConfig.MATCH_PARENT);
params.выравнивание = TextAlignment.CENTER;
addComponent(изображение, params);
}
```

Использование TabSwitcherButton:
```
TabSwitcherButton viewActions = new TabSwitcherButton(контекст());
DirectionalLayout.LayoutConfig params = new LayoutConfig();
int height = (int) PixelUtil.dp2px(DimensionUtil.parseDimension(контекст().getString(ResourceTable.String_вкладка_высота))));
params.height = height;
params.width = height;
addComponent(viewActions, params);
```

Чтобы зарегистрировать меню как слушатель для `TabSwitcherButton`, можно использовать статический метод `setupWithMenu` класса `TabSwitcher`. Этот метод автоматически внедряет все элементы в меню `Menu` и регистрирует каждый элемент как слушатель `TabSwitcherButton` для конкретного экземпляра `TabSwitcher`. В случае необходимости можно указать слушатель нажатия кнопок через `OnClickListener`.

Пример использования данного метода с любым меню представлен ниже:
``````java
TabSwitcher.setupWithMenu(tabSwitcher, menu, new OnClickListener() { /* ... */ });
```

Если требуется настроить меню, являющееся частью самого `TabSwitcher`, можно воспользоваться следующим вызовом метода:

```java
TabSwitcher.setupWithMenu(tabSwitcher, new OnClickListener() { /* ... */ });
```

##### Использование тем

По умолчанию библиотека использует светлую тему для `TabSwitcher`. Однако, библиотека также предоставляет заранее определённую тему для `TabSwitcher` с темной палитрой. Ниже приведены скриншоты, демонстрирующие внешний вид темной темы.

![](images/theme.gif)

##### Отображение заполнителя при отсутствии данных

Класс `TabSwitcher` предоставляет метод `setEmptyView`, который позволяет указывать пользовательское представление, которое будет отображено, когда данные отсутствуют. Указываемое представление может быть показано или скрыто с помощью анимации плавного перехода. Можно указать продолжительность этих анимаций. Первый вариант использования метода `setEmptyView` заключается в указании экземпляра класса `ohos.agp.components.Component`:

```java
Component component = // ... inflate component
tabSwitcher.setEmptyView(component);
```

Или же метод `setEmptyView` может использоваться путём указания идентификатора ресурса для представления:

```java
tabSwitcher.setEmptyView(ResourceTable.Id_empty_view);
```

Пример заполнителя, который будет отображен при отсутствии данных, представлен на нижеприведенном скриншоте.![](images/empty.png)

##### Заполнение

Метод `setPadding` класса `TabSwitcher` переопределяется для применения заполнения ко всем вкладкам и их родительским представлениям. Основная цель такого поведения  применение оконного заполнения при использовании полупрозрачного состояния и/или навигационной панели, как это продемонстрировано в примерах приложений данной библиотеки. Пример использования метода `OnApplyWindowInsetsListener` для применения оконного заполнения к представлению `TabSwitcher` представлен ниже. Он должен использоваться в методе `onCreate` активности.

```java
tabSwitcher.getComponentTreeObserver().addWindowBoundListener(
    new ComponentTreeObserver.WindowBoundListener() {
        @Override
        public void onWindowBound() {
            int left = main_root.getLeft();
            int top = main_root.getTop();
            int right = main_root.getRight();
            int bottom = main_root.getBottom();
            float touchableAreaTop = top;
        }
    });
```

### Тестовая информация

Код проверен CodeCheck, ошибок нет.

Код проверен CloudTest, ошибок нет.

Проверка безопасности от вирусов пройдена успешно.

Функционал текущей версии демо совпадает с функционалом исходного компонента.

### Версионирование
- 1.0.2
-  Yöntem `setPadding` sınıfı `TabSwitcher` yeniden tanımlanır, tüm sekme ve onların üst düzey temsillerine doldurmayı uygulamak için. Bu davranışın temel amacı, yarı saydam durumunu ve/veya navigasyon panelini kullanırken pencere doldurmasını uygulamaktır, bu örneklerde gösterilmiştir. `TabSwitcher`'in pencere doldurmasını uygulamak için `OnApplyWindowInsetsListener` yöntemini kullanmanın bir örneği aşağıda verilmiştir. Bu kod, aktivitenizin `onCreate` metodunda kullanılmalıdır.
- 1.0.1
- 1.0.0
- 0.0.1-SNAPSHOT

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

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

Введение

ChromeLikeTabSwitcher — это библиотека, имитирующая переключение между вкладками в браузере Chrome. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

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

Участники

все

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

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