RecyclerView自定义对齐方式,横向滑动

更新时间:2023-07-13 20:16:32 阅读: 评论:0

RecyclerView⾃定义对齐⽅式,横向滑动
RecyclerView ⾃定义对齐⽅式,本⽂讲的是横向滑动,依靠左边对齐。
滑动后,⼿指松开。不管向左还是向右,滑动⼀点,不超过itemView宽的⼀半,就反弹回去。如果超过了⼀半,加速滑动到整个itemView的宽。new LeftSnapHelper().attachToRecyclerView(recyclerView)。
aphics.PointF;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
lerview.widget.LinearSmoothScroller;
lerview.widget.OrientationHelper;
lerview.widget.RecyclerView;
lerview.widget.SnapHelper;
public class LeftSnapHelperextends SnapHelper {
静电贴怎么用private static final float INVALID_DISTANCE =1f;
//数值越⼩,速度越慢
private static final float MILLISECONDS_PER_INCH =40f;
private OrientationHelper mHorizontalHelper;
private RecyclerView mRecyclerView;
@Override
public void attachToRecyclerView(@Nullable RecyclerView recyclerView)throws IllegalStateException {
super.attachToRecyclerView(recyclerView);
//如果SnapHelper之前已经附着到此RecyclerView上,不⽤进⾏任何操作
if (mRecyclerView == recyclerView) {
return;
}
//更新RecyclerView对象引⽤
mRecyclerView = recyclerView;
//如果SnapHelper之前附着的RecyclerView和现在的不⼀致,清理掉之前RecyclerView的回调
if(mRecyclerView !=null){
//设置当前RecyclerView对象的回调
//            tupCallbacks();
mRecyclerView.tOnFlingListener(this);
/
/调⽤snapToTargetExistingView()⽅法以实现对SnapView的对齐滚动处理
snapToTargetExistingView();
}
}
@Nullable
@Override
protected LinearSmoothScroller createSnapScroller(RecyclerView.LayoutManager layoutManager) { if (!(layoutManagerinstanceof RecyclerView.SmoothScroller.ScrollVectorProvider)) {
return null;
}
LinearSmoothScroller smoothScroller =new Context()){
@Override
protected void onTargetFound(View targetView, RecyclerView.State state, Action action) {
int[] snapDistances = LayoutManager(), targetView);                final int dx = snapDistances[0];
final int dy = snapDistances[1];
马车简笔画final int time = calculateTimeForDeceleration(Math.max(Math.abs(dx), Math.abs(dy)));
if (time >0) {
action.update(dx, dy, time, mDecelerateInterpolator);
}
}
@Override
protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
return MILLISECONDS_PER_INCH / displayMetrics.densityDpi;
}
};
return smoothScroller;
}
private void snapToTargetExistingView() {
if (mRecyclerView ==null) {
简单的手工作品return;
}
RecyclerView.LayoutManager layoutManager = LayoutManager();        if (layoutManager ==null) {
return;
}
//找出SnapView
练字文章
View snapView = findSnapView(layoutManager);
if (snapView ==null) {
return;
}
//计算出SnapView需要滚动的距离
int[] snapDistance = calculateDistanceToFinalSnap(layoutManager, snapView);
//如果需要滚动的距离不是为0,就调⽤smoothScrollBy()使RecyclerView滚动相应的距离
if (snapDistance[0] !=0 || snapDistance[1] !=0) {
mRecyclerView.smoothScrollBy(snapDistance[0], snapDistance[1]);
}
}
@Override
public int[] calculateDistanceToFinalSnap(@NonNull RecyclerView.LayoutManager layoutManager,
@NonNull View targetView) {
int[] out =new int[2];
if (layoutManager.canScrollHorizontally()) {
高冷男头像动漫out[0] = distanceToStart(targetView, getHorizontalHelper(layoutManager));
}el {
out[0] =0;
}
return out;
}
@Override
public int findTargetSnapPosition(RecyclerView.LayoutManager layoutManager, int velocityX, int velocityY) {
//判断layoutManager是否实现了RecyclerView.SmoothScroller.ScrollVectorProvider这个接⼝
if (!(layoutManagerinstanceof RecyclerView.SmoothScroller.ScrollVectorProvider)) {
return RecyclerView.NO_POSITION;
}
final int itemCount = ItemCount();
if (itemCount ==0) {
return RecyclerView.NO_POSITION;
}
//找到snapView
final View currentView = findSnapView(layoutManager);
if (currentView ==null) {
return RecyclerView.NO_POSITION;
}
final int currentPosition = Position(currentView);
if (currentPosition == RecyclerView.NO_POSITION) {
return RecyclerView.NO_POSITION;
}
RecyclerView.SmoothScroller.ScrollVectorProvider vectorProvider =
(RecyclerView.SmoothScroller.ScrollVectorProvider) layoutManager;
/
/ 通过ScrollVectorProvider接⼝中的computeScrollVectorForPosition()⽅法
// 来确定layoutManager的布局⽅向
PointF vectorForEnd = puteScrollVectorForPosition(itemCount -1);        if (vectorForEnd ==null) {
return RecyclerView.NO_POSITION;
}
蚂蚁搬家蛇过道int vDeltaJump=0, hDeltaJump;
//横向有关江南的诗句
if (layoutManager.canScrollHorizontally()) {
秦朝服饰
//layoutManager是横向布局,并且内容超出⼀屏,canScrollHorizontally()才返回true
//估算fling结束时相对于当前snapView位置的横向位置偏移量
hDeltaJump = estimateNextPositionDiffForFling(layoutManager,
getHorizontalHelper(layoutManager), velocityX, 0);
//vectorForEnd.x < 0代表layoutManager是反向布局的,就把偏移量取反
if (vectorForEnd.x <0) {
hDeltaJump = -hDeltaJump;

本文发布于:2023-07-13 20:16:32,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1080258.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:横向   布局   滚动
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图