package com.trs.v7.home.view;
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
/**
* <pre>
* Created by zhuguohui
* Date: 2023/4/10
* Time: 11:09
* Desc:可以自定义滑动速度的RecycleView
* 在滚动以后,可以自动居中显示。
* 通过
* {@link #setFlingScale(double)}来设置速度因子
* 1.0表示原速度.
* </pre>
*/
public class CustomFlingSpeedRecyclerView extends RecyclerView {
private double scale; //抛掷速度的缩放因子
public CustomFlingSpeedRecyclerView(Context context) {
this(context,null);
}
public CustomFlingSpeedRecyclerView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public CustomFlingSpeedRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
addOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
if(newState== SCROLL_STATE_IDLE){
View child= getNeedShowChild(recyclerView);
if(child==null){
return;
}
int middleLeft=(recyclerView.getWidth()-child.getWidth())/2;
boolean isMiddle=child.getLeft()==middleLeft;
Rect rect=new Rect();
child.getGlobalVisibleRect(rect);
if(!recyclerView.canScrollHorizontally(-1)){//已经滑动到最左直接跳到最前端
recyclerView.smoothScrollToPosition(0);
return;
}
if(!isMiddle){
int mX = middleLeft - child.getLeft();
if(recyclerView.canScrollHorizontally(-mX)) {
recyclerView.smoothScrollBy(-mX, 0);
}
}
}
}
private View getNeedShowChild(RecyclerView recyclerView) {
//获取最大可见度的view。然后让其居中
View showChild=null;
float showRatio=0.0f;
int childCount = recyclerView.getChildCount();
for(int i=0;i<childCount;i++){
Rect rect=new Rect();
View childAt = recyclerView.getChildAt(i);
childAt.getGlobalVisibleRect(rect);
float ratio = rect.width()*1.0f / childAt.getWidth();
if(ratio>=showRatio){
showRatio=ratio;
showChild=childAt;
}
}
return showChild;
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
});
}
public void setFlingScale(double scale){
this.scale = scale;
}
@Override
public boolean fling(int velocityX, int velocityY) {
velocityX *= scale;
return super.fling(velocityX, velocityY);
}
}
可以自定义滑动速度,在滚动以后,可以自动居中显示的RecycleView
最新推荐文章于 2024-07-25 19:04:18 发布