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

OSCHINA-MIRROR/mosect-ViewUtils

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

ViewUtils

Описание

ViewUtils — это класс инструментов для работы с представлениями, который предоставляет три вспомогательных инструмента для представлений:

  • GestureHelper (вспомогательный инструмент для жестов);
  • InterceptTouchHelper (вспомогательный перехватывающий инструмент);
  • ScrollHelper (вспомогательный инструмент прокрутки).

Также предоставляется инструмент измерения MeasureUtils.

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

Для использования ViewUtils необходимо выполнить следующие шаги:

  1. Добавить зависимость в файл build.gradle проекта:
allprojects {
    repositories {
        maven { url 'https://jitpack.io' }
    }
}
  1. В файле build.gradle модуля приложения добавить зависимость:
implementation 'com.github.Mosect:ViewUtils:1.0.8'

GestureHelper

GestureHelper — это вспомогательный инструмент для определения жестов. Его можно использовать в методе View.onTouchEvent. Он предоставляет семь видов жестов:

  • GESTURE_PRESSED — жест нажатия;
  • GESTURE_CLICK — жест щелчка;
  • GESTURE_LONG_CLICK — жест длительного нажатия;
  • GESTURE_LEFT — жест скольжения влево;
  • GESTURE_UP — жест скольжения вверх;
  • GESTURE_RIGHT — жест скольжения вправо;
  • GESTURE_DOWN — жест скольжения вниз.

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

Пример использования:

public boolean onTouchEvent(MotionEvent event) { 
gestureHelper.onTouchEvent(event);
switch (gestureHelper.getGesture()) {
    case GestureHelper.GESTURE_XX: // 判断 жеста
        // todo Выполнить обработку жеста
        break;
    }
    return true;
}

InterceptTouchHelper

InterceptTouchHelper — это вспомогательный инструмент, используемый для перехвата событий прокрутки в ViewGroup. Его нужно использовать в методе ViewGroup.onInterceptTouchEvent:

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    boolean result = super.onInterceptTouchEvent(ev);
    boolean ext = interceptTouchHelper.onInterceptTouchEvent(ev);
    return result && ext;
}

Кроме того, вы можете наследовать этот класс и переопределить некоторые методы для достижения желаемых результатов.

Методы, которые можно переопределить:

  • canChildrenScrollVertically — определяет, может ли дочерний вид прокручиваться вертикально;
  • canChildScrollVertically — определяет, может ли конкретный дочерний элемент прокручиваться вертикально;
  • canChildrenScrollHorizontally — определяет, могут ли дочерние элементы прокручиваться горизонтально;
  • canChildScrollHorizontally — определяет, может ли конкретный дочерний элемент прокручиваться горизонтально;
  • canParentScrollHorizontally — определяет, может ли родительский вид прокручиваться горизонтально;
  • canParentScrollVertically — определяет, может ли родительский вид прокручиваться вертикально.

Этот вспомогательный инструмент сначала проверяет, требуется ли прокрутка дочернему виду. Если да, то он возвращает false.

ScrollHelper

ScrollHelper — это вспомогательный инструмент для прокрутки представлений. Его можно использовать с классом ViewScrollHelper, который реализует некоторые методы. Пример использования:

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) { // При нажатии необходимо выполнить некоторую обработку
        scroller.abortAnimation(); // Остановить анимацию
        performClick(); // Вызвать событие клика (рекомендуется), иначе будет выдано предупреждение (кроме того, необходимо переопределить performClick, чтобы полностью устранить предупреждение)
    }
    scrollHelper.onTouchEvent(event); // Непосредственно вызвать метод onTouchEvent вспомогательного инструмента
    return true;
}

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

scrollHelper = new ViewScrollHelper(this) {
    @Override
    protected int getViewHorizontallyScrollSize() {
        return computeHorizontalScrollRange() - computeHorizontalScrollExtent();
    }

    @Override
    protected int getViewVerticallyScrollSize() {
        return computeVerticalScrollRange() - computeVerticalScrollExtent();
    }

    @Override
    protected void viewFling(float xv, float yv) {
        // При отпускании касания необходимо выполнить операцию fling, обратите внимание, что значения xv и yv должны быть отрицательными.
        scroller.fling(getScrollX(), getScrollY(), (int) -xv, (int) -yv, 0,
                getViewHorizontallyScrollSize(), 0, getViewVerticallyScrollSize());
        invalidate();
    };
};

Методы getViewHorizontallyScrollSize и getViewVerticallyScrollSize определяют диапазон прокрутки представления, обычно это range-extent, но вы можете вернуть правильное значение в соответствии с реальной ситуацией. Внимание: в методе viewFling скорость должна быть взята с противоположным знаком, потому что параметр скорости в методе обозначает скорость скольжения касания, которая прямо противоположна направлению скольжения.

MeasureUtils

Измерительный инструмент, предоставляющий некоторые измерения и вычисления, связанные с макетом, обработкой внутренних (padding) и внешних (margin) отступов. Использование метода включает следующие шаги:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int horizontalPadding = getPaddingLeft() + getPaddingRight(); // горизонтальный внутренний отступ
    int verticalPadding = getPaddingTop() + getPaddingBottom(); // вертикальный внутренний отступ

    // Сначала создаём собственный измерительный стандарт, обрабатывая внутренние отступы
    int selfWidthMeasureSpec =
            MeasureUtils.makeSelfMeasureSpec(widthMeasureSpec, horizontalPadding);
    int selfHeightMeasureSpec =
            MeasureUtils.makeSelfMeasureSpec(heightMeasureSpec, verticalPadding);

    // Переустанавливаем некоторые значения переменных
    ...

    // Последовательно вычисляем размер дочерних представлений
    for (int i = 0; i < getChildCount(); i++) {
        View child = getChildAt(i);
        if (child.getVisibility() == GONE) continue; // невидимые представления не учитываются
        // Измеряем дочернее представление, передавая собственные измерительные стандарты
        MeasureUtils.measureChild(child, selfWidthMeasureSpec, selfHeightMeasureSpec);
        // Другие дополнительные операции и вычисления для себя
        ...
    }

    // Вычисляем размер представления, не забывая, что ширина представления должна включать внутренние отступы
    viewWidth += horizontalPadding;
    viewHeight += verticalPadding;

    // Вычисляем ширину и содержимое представления. Не следует напрямую устанавливать измеренную ширину и высоту, а использовать
    // MeasureUtils.getMeasuredDimension для получения безопасных размеров. В этот момент измерительный стандарт должен быть передан из метода onMeasure, так как размер представления будет ограничен родительским представлением.
    // MeasureUtils.getMeasuredDimension в основном вычисляет безопасный размер на основе ограничений родительского представления.
    int width = MeasureUtils.getMeasuredDimension(viewWidth, widthMeasureSpec);
    int height = MeasureUtils.getMeasuredDimension(viewHeight, heightMeasureSpec);
    setMeasuredDimension(width, height);
}

Кроме того, этот инструмент предоставляет три метода, связанных с макетом:

/**
 * Вычисление ширины, занимаемой представлением
 *
 * @param view представление
 * @return ширина, занимаемая представлением
 */
public static int getViewWidthSpace(View view) {...}

/**
 * Вычисление высоты, занимаемой представлением
 *
 * @param view представление
 * @return высота, занимаемая представлением
 */
public static int getViewHeightSpace(View view) {...}

/**
 * Вычисление необходимых значений макета
 *
 * @param view      представление
 * @param layoutX   позиция макета X
 * @param layoutY   позиция макета Y
 * @param layoutOut возврат позиции макета
 * @param spaceOut  возврат занимаемого пространства
 */
public static void computeLayout(View view, int layoutX, int layoutY, Rect layoutOut, Rect spaceOut) {...}

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

История изменений

1.0.6

Изменения:

  • Исправлена проблема с неправильным жестом при фиксированном положении представления.

1.0.4

Изменения

  • Удалены ненужные сообщения печати.

Проблемы

  • В случае нефиксированного положения представления, полученный жест был неправильным, исправлено в версии V1.0.6.

1.0.3

Исправления

  • Исправлено ScrollHelper, где метод canScroll работал некорректно, и добавлены правила по умолчанию.

1.0.2

Изменения

  • Предоставлен внешний помощник жестов, добавлен метод getGestureHelper.
  • Добавлен внутренний метод canScroll, который может возвращать, нужно ли скользить в зависимости от ситуации.

Проблемы

  • В ScrollHelper метод canScroll работает некорректно, исправлено в 1.0.3.

1.0.0

Проблемы

  • ScrollHelper не предоставляет помощника жестов, предоставлено в версии 1.0.2 (getGestureHelper).
  • ScrollHelper не предлагает метод определения необходимости скольжения в зависимости от реальной ситуации, предоставлено в 1.0.2 (canScroll).

1.0.1

Проблемы

  • Оптимизированы некоторые проблемы.

Контакты

Email:zhouliuyang1995@163.com

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

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

Введение

Описание недоступно Развернуть Свернуть
Отмена

Обновления

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

Участники

все

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

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