2016-10-30 1 views
2

Ich benutze einen LinearSnapHelper, um Artikel in meinem RecyclerView auf dem Bildschirm "einrasten" zu lassen (meine Karten nehmen den größten Teil des Bildschirms ein, also möchte ich, dass sie einrasten und den Bildschirm bei jedem Wischen/scrollen).Android LinearSnapHelper - Wie erhöht man die Geschwindigkeit beim Scrollen/"Fangen"?

Ich habe Probleme damit, wie man die Karten einrasten lässt schneller. Ich habe versucht, einen benutzerdefinierten LinearLayoutManager zu erstellen (und die calculateSpeedPerPixel-Methode in scrollToPosition oder smoothScrollToPosition zu bearbeiten) sowie einen benutzerdefinierten RecyclerView (und die Fling-Methode zu bearbeiten). Aber nichts beeinflusst die Geschwindigkeit, mit der Karten "einrasten".

Ich vermute das Problem ist, dass ich nicht wirklich verstehe, wie LinearSnapHelper die Karten in Position "scrollt". Es scheint nicht die Methoden scrollToPosition oder smoothScrollToPosition von LinearLayoutManager zu verwenden.

Irgendwelche Hilfe? Danke vielmals!

snapHelper = new LinearSnapHelper() { 
     @Override 
     public int findTargetSnapPosition(RecyclerView.LayoutManager layoutManager, int velocityX, int velocityY) { 
      View centerView = findSnapView(layoutManager); 
      if (centerView == null) { 
       return RecyclerView.NO_POSITION; 
      } 

      int position = layoutManager.getPosition(centerView); 
      int targetPosition = -1; 
      if (layoutManager.canScrollHorizontally()) { 
       if (velocityX < 0) { 
        targetPosition = position - 1; 
       } else { 
        targetPosition = position + 1; 
       } 
      } 

      if (layoutManager.canScrollVertically()) { 
       if (velocityY > 0) { 
        targetPosition = position + 1; 
       } else { 
        targetPosition = position - 1; 
       } 
      } 

      final int firstItem = 0; 
      final int lastItem = layoutManager.getItemCount() - 1; 
      targetPosition = Math.min(lastItem, Math.max(targetPosition, firstItem)); 
      return targetPosition; 
     } 
    }; 
    snapHelper.attachToRecyclerView(mRecyclerView); 

Antwort

0

Ich zog dies eine ScrollListener meiner RecycleView hinzufügen, indem Sie und dann eine benutzerdefinierten LinearLayoutManager und benutzerdefinierte smoothScrollToPosition Methode zu schaffen.

final CustomLinearLayoutManager mLayoutManager = new CustomLinearLayoutManager(getActivity()); 
    mRecyclerView.setLayoutManager(mLayoutManager); 

    mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
     private boolean scrollingUp; 

     @Override 
     public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
      scrollingUp = dy < 0; 
     } 

     @Override 
     public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
       int visiblePosition = scrollingUp ? mLayoutManager.findFirstVisibleItemPosition() : mLayoutManager.findLastVisibleItemPosition(); 
       int completelyVisiblePosition = scrollingUp ? mLayoutManager 
         .findFirstCompletelyVisibleItemPosition() : mLayoutManager 
         .findLastCompletelyVisibleItemPosition(); 
       if (visiblePosition != completelyVisiblePosition) { 
        recyclerView.smoothScrollToPosition(visiblePosition); 
        return; 
       } 
     } 
    }); 
+0

Warum ist Ihr lineares Layout benutzerdefiniert? Haben Sie es mit dem standardmäßigen horizontalen linearen Layout probiert? – 2cupsOfTech

2

Die Geschwindigkeit des Fangens wird durch "RecyclerView.smoothScrollBy()" beeinflusst.

Hier ist der Ausschnitt des Quellcodes. Picture

Überschreiben Sie diese Funktion, um die Geschwindigkeit des Einrastens zu erhöhen oder zu verringern.

1

Wie erwähnt, SnapHelper Aufruf RecyclerView.smoothScrollBy() -Methode. Und es verwendet Standard sQuinticInterpolator. Um Geschwindigkeit von Snap ändern Sie als nächstes tun können:

public class SlowdownRecyclerView extends RecyclerView { 

// Change pow to control speed. 
// Bigger = faster. RecyclerView default is 5. 
private static final int POW = 2; 

private Interpolator interpolator; 

public SlowdownRecyclerView(Context context) { 
    super(context); 
    createInterpolator(); 
} 

public SlowdownRecyclerView(Context context, @Nullable AttributeSet attrs) { 
    super(context, attrs); 
    createInterpolator(); 
} 

public SlowdownRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    createInterpolator(); 
} 

private void createInterpolator(){ 
    interpolator = new Interpolator() { 
     @Override 
     public float getInterpolation(float t) { 
      t = Math.abs(t - 1.0f); 
      return (float) (1.0f - Math.pow(t, POW)); 
     } 
    }; 
} 

@Override 
public void smoothScrollBy(int dx, int dy) { 
    super.smoothScrollBy(dx, dy, interpolator); 
} 

Oder Sie können Ihre eigenen Interpolator implementieren.

Verwandte Themen