Overscrollscale: просмотр списка остается растянутым
Библиотека Overscrollscale изменяет listview
Перекрутить и заставляет его подпрыгивать по краям. Список также масштабируется, когда пользователь перезаписывает его, и уменьшается до нормального размера после того, как пользователь отпускает касание.
Код для масштабирования listview
:
private static void setListScale(final ListViewExt listView, Canvas canvas, int offset, boolean isTween) {
if (offset == 0) {
canvas.scale(1, listView.getScaleY(), 0, listView.mLastPivotY);
listView.invalidate();
return;
}
double scaleRatio = Math.min(Math.max(0.0d, (Math.sqrt((double) Math.abs(offset)) * 3.0d) * 0.001d), 0.1d);
if (listView.mIsShortList && offset < 0) {
scaleRatio = -scaleRatio;
}
float scaleY = (float) (1 + scaleRatio);
if (offset > 0 || listView.mIsShortList) {
listView.mLastPivotY = 0.0f;
} else {
listView.mLastPivotY = (float) listView.getHeight();
}
listView.setPivotX(0);
listView.setPivotY(listView.mLastPivotY);
if (isTween) {
if (listView.getScaleY() != 1) {
canvas.scale(1, listView.getScaleY(), 0, listView.mLastPivotY);
listView.invalidate();
}
if (listView.mAnimatorSet != null) {
listView.mAnimatorSet.cancel();
}
listView.mAnimatorSet = new AnimatorSet();
ValueAnimator scaleBackAnimator = ValueAnimator.ofFloat(scaleY, 1);
scaleBackAnimator.setDuration(400);
scaleBackAnimator.setInterpolator(new BackEaseOutInterpolater());
scaleBackAnimator.addUpdateListener(new AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
listView.setScaleY((Float) animation.getAnimatedValue());
listView.invalidate();
}
});
if (listView.getScaleY() == 1) {
ValueAnimator scaleAnimator = ValueAnimator.ofFloat(1, scaleY);
scaleAnimator.setDuration(200);
scaleAnimator.setInterpolator(new CircEaseOutInterpolator());
scaleAnimator.addUpdateListener(new AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
listView.setScaleY((Float) animation.getAnimatedValue());
listView.invalidate();
}
});
listView.mAnimatorSet.play(scaleAnimator).before(scaleBackAnimator);
} else {
listView.mAnimatorSet.play(scaleBackAnimator);
}
listView.mAnimatorSet.start();
return;
}
canvas.scale(1, scaleY, 0, listView.mLastPivotY);
listView.setScaleY(scaleY);
listView.invalidate();
}
Код для onTouchEvent
в ListView
:
@Override
public boolean onTouchEvent(MotionEvent ev) {
int y = (int) ev.getY();
switch (ev.getActionMasked()) {
case MotionEvent.ACTION_DOWN://0
case MotionEvent.ACTION_POINTER_DOWN:
ListViewEnhance.onTouchDown(this, ev);
this.mDownMotionY = (y - (this.mLastY - this.mDownMotionY));
this.mLastY = y;
break;
case MotionEvent.ACTION_POINTER_UP:
case MotionEvent.ACTION_UP:
this.mLastY = y;
if (this.mIsTouching) {
this.mIsTouching = false;
}
break;
case MotionEvent.ACTION_CANCEL:
if (this.mIsTouching) {
this.mIsTouching = false;
ListViewEnhance.resetScale(this);
}
break;
case MotionEvent.ACTION_MOVE: {
int offset = (y - this.mDownMotionY);
if (!this.mIsTouching) {
ListViewEnhance.onTouchDown(this, ev);
}
this.mInertia = y - mDownMotionY;
if (ListViewEnhance.needListScale(this, offset)) {
this.mLastY = y;
return true;
} else {
if (y != this.mLastY) {
this.mLastY = y;
}
}
}
break;
}
return super.onTouchEvent(ev);
}
Вопрос:
Иногда список остается растянутым даже после отпускания касания. Что может быть причиной такого поведения?
Растянутый список после касания выпущен:
Извиняюсь за длину вопроса, но я подумал, что код может быть уместным. Любая помощь будет высоко ценится!