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