ViewUtils
Описание
ViewUtils — это класс инструментов для работы с представлениями, который предоставляет три вспомогательных инструмента для представлений:
Также предоставляется инструмент измерения MeasureUtils.
Использование
Для использования ViewUtils необходимо выполнить следующие шаги:
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
implementation 'com.github.Mosect:ViewUtils:1.0.8'
GestureHelper
GestureHelper — это вспомогательный инструмент для определения жестов. Его можно использовать в методе View.onTouchEvent. Он предоставляет семь видов жестов:
Важно отметить, что этот вспомогательный инструмент не работает по принципу обратного вызова. Необходимо активно получать жесты и выполнять соответствующие операции.
Пример использования:
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;
}
Кроме того, вы можете наследовать этот класс и переопределить некоторые методы для достижения желаемых результатов.
Методы, которые можно переопределить:
Этот вспомогательный инструмент сначала проверяет, требуется ли прокрутка дочернему виду. Если да, то он возвращает 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 скорость должна быть взята с противоположным знаком, потому что параметр скорости в методе обозначает скорость скольжения касания, которая прямо противоположна направлению скольжения.
Измерительный инструмент, предоставляющий некоторые измерения и вычисления, связанные с макетом, обработкой внутренних (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) {...}
Для более подробного использования можно обратиться к примерам.
Email:zhouliuyang1995@163.com
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )