ADD week 5
This commit is contained in:
142
02-Easy5/E5/sources/androidx/recyclerview/widget/SnapHelper.java
Normal file
142
02-Easy5/E5/sources/androidx/recyclerview/widget/SnapHelper.java
Normal file
@@ -0,0 +1,142 @@
|
||||
package androidx.recyclerview.widget;
|
||||
|
||||
import android.util.DisplayMetrics;
|
||||
import android.view.View;
|
||||
import android.view.animation.DecelerateInterpolator;
|
||||
import android.widget.Scroller;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public abstract class SnapHelper extends RecyclerView.OnFlingListener {
|
||||
static final float MILLISECONDS_PER_INCH = 100.0f;
|
||||
private Scroller mGravityScroller;
|
||||
RecyclerView mRecyclerView;
|
||||
private final RecyclerView.OnScrollListener mScrollListener = new RecyclerView.OnScrollListener() { // from class: androidx.recyclerview.widget.SnapHelper.1
|
||||
boolean mScrolled = false;
|
||||
|
||||
@Override // androidx.recyclerview.widget.RecyclerView.OnScrollListener
|
||||
public void onScrolled(RecyclerView recyclerView, int i, int i2) {
|
||||
if (i == 0 && i2 == 0) {
|
||||
return;
|
||||
}
|
||||
this.mScrolled = true;
|
||||
}
|
||||
|
||||
@Override // androidx.recyclerview.widget.RecyclerView.OnScrollListener
|
||||
public void onScrollStateChanged(RecyclerView recyclerView, int i) {
|
||||
super.onScrollStateChanged(recyclerView, i);
|
||||
if (i == 0 && this.mScrolled) {
|
||||
this.mScrolled = false;
|
||||
SnapHelper.this.snapToTargetExistingView();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public abstract int[] calculateDistanceToFinalSnap(RecyclerView.LayoutManager layoutManager, View view);
|
||||
|
||||
public abstract View findSnapView(RecyclerView.LayoutManager layoutManager);
|
||||
|
||||
public abstract int findTargetSnapPosition(RecyclerView.LayoutManager layoutManager, int i, int i2);
|
||||
|
||||
@Override // androidx.recyclerview.widget.RecyclerView.OnFlingListener
|
||||
public boolean onFling(int i, int i2) {
|
||||
RecyclerView.LayoutManager layoutManager = this.mRecyclerView.getLayoutManager();
|
||||
if (layoutManager == null || this.mRecyclerView.getAdapter() == null) {
|
||||
return false;
|
||||
}
|
||||
int minFlingVelocity = this.mRecyclerView.getMinFlingVelocity();
|
||||
return (Math.abs(i2) > minFlingVelocity || Math.abs(i) > minFlingVelocity) && snapFromFling(layoutManager, i, i2);
|
||||
}
|
||||
|
||||
public void attachToRecyclerView(RecyclerView recyclerView) throws IllegalStateException {
|
||||
RecyclerView recyclerView2 = this.mRecyclerView;
|
||||
if (recyclerView2 == recyclerView) {
|
||||
return;
|
||||
}
|
||||
if (recyclerView2 != null) {
|
||||
destroyCallbacks();
|
||||
}
|
||||
this.mRecyclerView = recyclerView;
|
||||
if (recyclerView != null) {
|
||||
setupCallbacks();
|
||||
this.mGravityScroller = new Scroller(this.mRecyclerView.getContext(), new DecelerateInterpolator());
|
||||
snapToTargetExistingView();
|
||||
}
|
||||
}
|
||||
|
||||
private void setupCallbacks() throws IllegalStateException {
|
||||
if (this.mRecyclerView.getOnFlingListener() != null) {
|
||||
throw new IllegalStateException("An instance of OnFlingListener already set.");
|
||||
}
|
||||
this.mRecyclerView.addOnScrollListener(this.mScrollListener);
|
||||
this.mRecyclerView.setOnFlingListener(this);
|
||||
}
|
||||
|
||||
private void destroyCallbacks() {
|
||||
this.mRecyclerView.removeOnScrollListener(this.mScrollListener);
|
||||
this.mRecyclerView.setOnFlingListener(null);
|
||||
}
|
||||
|
||||
public int[] calculateScrollDistance(int i, int i2) {
|
||||
this.mGravityScroller.fling(0, 0, i, i2, Integer.MIN_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE);
|
||||
return new int[]{this.mGravityScroller.getFinalX(), this.mGravityScroller.getFinalY()};
|
||||
}
|
||||
|
||||
private boolean snapFromFling(RecyclerView.LayoutManager layoutManager, int i, int i2) {
|
||||
RecyclerView.SmoothScroller createScroller;
|
||||
int findTargetSnapPosition;
|
||||
if (!(layoutManager instanceof RecyclerView.SmoothScroller.ScrollVectorProvider) || (createScroller = createScroller(layoutManager)) == null || (findTargetSnapPosition = findTargetSnapPosition(layoutManager, i, i2)) == -1) {
|
||||
return false;
|
||||
}
|
||||
createScroller.setTargetPosition(findTargetSnapPosition);
|
||||
layoutManager.startSmoothScroll(createScroller);
|
||||
return true;
|
||||
}
|
||||
|
||||
void snapToTargetExistingView() {
|
||||
RecyclerView.LayoutManager layoutManager;
|
||||
View findSnapView;
|
||||
RecyclerView recyclerView = this.mRecyclerView;
|
||||
if (recyclerView == null || (layoutManager = recyclerView.getLayoutManager()) == null || (findSnapView = findSnapView(layoutManager)) == null) {
|
||||
return;
|
||||
}
|
||||
int[] calculateDistanceToFinalSnap = calculateDistanceToFinalSnap(layoutManager, findSnapView);
|
||||
int i = calculateDistanceToFinalSnap[0];
|
||||
if (i == 0 && calculateDistanceToFinalSnap[1] == 0) {
|
||||
return;
|
||||
}
|
||||
this.mRecyclerView.smoothScrollBy(i, calculateDistanceToFinalSnap[1]);
|
||||
}
|
||||
|
||||
protected RecyclerView.SmoothScroller createScroller(RecyclerView.LayoutManager layoutManager) {
|
||||
return createSnapScroller(layoutManager);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
protected LinearSmoothScroller createSnapScroller(RecyclerView.LayoutManager layoutManager) {
|
||||
if (layoutManager instanceof RecyclerView.SmoothScroller.ScrollVectorProvider) {
|
||||
return new LinearSmoothScroller(this.mRecyclerView.getContext()) { // from class: androidx.recyclerview.widget.SnapHelper.2
|
||||
@Override // androidx.recyclerview.widget.LinearSmoothScroller, androidx.recyclerview.widget.RecyclerView.SmoothScroller
|
||||
protected void onTargetFound(View view, RecyclerView.State state, RecyclerView.SmoothScroller.Action action) {
|
||||
if (SnapHelper.this.mRecyclerView == null) {
|
||||
return;
|
||||
}
|
||||
SnapHelper snapHelper = SnapHelper.this;
|
||||
int[] calculateDistanceToFinalSnap = snapHelper.calculateDistanceToFinalSnap(snapHelper.mRecyclerView.getLayoutManager(), view);
|
||||
int i = calculateDistanceToFinalSnap[0];
|
||||
int i2 = calculateDistanceToFinalSnap[1];
|
||||
int calculateTimeForDeceleration = calculateTimeForDeceleration(Math.max(Math.abs(i), Math.abs(i2)));
|
||||
if (calculateTimeForDeceleration > 0) {
|
||||
action.update(i, i2, calculateTimeForDeceleration, this.mDecelerateInterpolator);
|
||||
}
|
||||
}
|
||||
|
||||
@Override // androidx.recyclerview.widget.LinearSmoothScroller
|
||||
protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
|
||||
return SnapHelper.MILLISECONDS_PER_INCH / displayMetrics.densityDpi;
|
||||
}
|
||||
};
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user