143 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| 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;
 | |
|     }
 | |
| }
 |