package com.guadou.kt_demo.demo.demo8_recyclerview.scroll10;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.os.Build;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.animation.Interpolator;
import android.widget.AbsListView;
import android.widget.EdgeEffect;
import android.widget.OverScroller;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.view.NestedScrollingChild2;
import androidx.core.view.NestedScrollingChildHelper;
import androidx.core.view.NestedScrollingParent2;
import androidx.core.view.NestedScrollingParentHelper;
import androidx.core.view.ScrollingView;
import androidx.core.view.ViewCompat;
import androidx.core.widget.EdgeEffectCompat;
import androidx.recyclerview.widget.RecyclerView;
import com.guadou.kt_demo.R;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class ConsecutiveScrollerLayout extends ViewGroup implements ScrollingView, NestedScrollingParent2, NestedScrollingChild2 {
/**
* 记录布局垂直的偏移量,它是包括了自己的偏移量(mScrollY)和所有子View的偏移量的总和,
* 这个值不是真实的布局滑动偏移量,只是用于在滑动是记录和计算每次的滑动距离。
*/
private int mSecondScrollY;
/**
* 联动容器可滚动的范围
*/
int mScrollRange;
/**
* 联动容器滚动定位子view
*/
private OverScroller mScroller;
/**
* VelocityTracker
*/
private VelocityTracker mVelocityTracker;
private VelocityTracker mAdjustVelocityTracker;
private int mAdjustYVelocity;
/**
* MaximumVelocity
*/
private int mMaximumVelocity;
/**
* MinimumVelocity
*/
private int mMinimumVelocity;
private int mTouchSlop;
/**
* 手指触摸屏幕时的触摸点
*/
private int mTouchY;
private int mEventX;
private int mEventY;
private HashMap<Integer, Float> mFixedYMap = new HashMap<>();
/**
* 记录手指按下时的位置
*/
private final int[] mDownLocation = new int[2];
/**
* 是否处于状态
*/
private boolean mTouching = false;
private static final int SCROLL_NONE = 0;
private static final int SCROLL_VERTICAL = 1;
private static final int SCROLL_HORIZONTAL = 2;
private int SCROLL_ORIENTATION = SCROLL_NONE;
/**
* 滑动监听
*/
protected OnScrollChangeListener mOnScrollChangeListener;
private int mActivePointerId = -1;
private NestedScrollingParentHelper mParentHelper;
private NestedScrollingChildHelper mChildHelper;
private final int[] mScrollOffset = new int[2];
private final int[] mScrollConsumed = new int[2];
private View mScrollToTopView;
private int mAdjust;
/**
* 滑动到指定view,目标view的index
*/
private int mScrollToIndex = -1;
/**
* 滑动到指定view,平滑滑动时,每次滑动的距离
*/
private int mSmoothScrollOffset = 0;
private int mScrollToIndexWithOffset = 0;
// 滑动到指定view时,为了防止滑动时间长或者死循环,限制最大循环次数
private int mCycleCount = 0;
private static final int MAX_CYCLE_COUNT = 1000;
/**
* 上边界阴影
*/
private EdgeEffect mEdgeGlowTop;
/**
* 下边界阴影
*/
private EdgeEffect mEdgeGlowBottom;
/**
* fling时,保存最后的滑动位置,在下一帧时通过对比新的滑动位置,判断滑动的方向。
*/
private int mLastScrollerY;
/**
* 吸顶view是否常驻,不被推出屏幕
*/
private boolean isPermanent;
/**
* 禁用子view的水平滑动,如果ConsecutiveScrollerLayout下没有水平滑动的下级view,应该把它设置为true
* 为true时,将不会分发滑动事件给子view,而是由ConsecutiveScrollerLayout处理,可以优化ConsecutiveScrollerLayout的滑动
*/
private boolean disableChildHorizontalScroll;
/**
* 自动调整底部view的高度,使它不被吸顶布局覆盖。
* 为true时,底部view的最大高度不大于 (父布局高度 - (当前吸顶view高度总高度 + mAdjustHeightOffset))
*/
private boolean mAutoAdjustHeightAtBottomView;
/**
* 自动调整底部view的高度时,额外的偏移量
* 底部view需要调整高度 = 当前吸顶view高度总高度 + mAdjustHeightOffset
*/
private int mAdjustHeightOffset = 0;
/**
* 吸顶view到顶部的偏移量
*/
private int mStickyOffset = 0;
/**
* 保存当前吸顶的view(普通吸顶模式中,正在吸顶的view只有一个)
*/
private View mCurrentStickyView;
/**
* 保存当前吸顶的view(常驻吸顶模式中,正在吸顶的view可能有多个)
*/
private final List<View> mCurrentStickyViews = new ArrayList<>();
// 临时保存吸顶的view,用于判断吸顶view是否改变了
private final List<View> mTempStickyViews = new ArrayList<>();
private int mOldScrollY = 0;
private final List<View> mViews = new ArrayList<>();
private int mNestedYOffset = 0;
/**
* 普通吸顶模式,监听吸顶变化
*/
private OnStickyChangeListener mOnStickyChangeListener;
/**
* 常驻吸顶模式,监听吸顶变化
*/
private OnPermanentStickyChangeListener mOnPermanentStickyChangeListener;
/**
* The RecyclerView is not currently scrolling.
*
* @see #getScrollState()
*/
public static final int SCROLL_STATE_IDLE = 0;
/**
* The RecyclerView is currently being dragged by outside input such as user touch input.
*
* @see #getScrollState()
*/
public static final int SCROLL_STATE_DRAGGING = 1;
/**
* The RecyclerView is currently animating to a final position while not under
* outside control.
*
* @see #getScrollState()
*/
public static final int SCROLL_STATE_SETTLING = 2;
private int mScrollState = SCROLL_STATE_IDLE;
// 这是RecyclerView的代码,让ConsecutiveScrollerLayout的fling效果更接近于RecyclerView。
static final Interpolator sQuinticInterpolator = new Interpolator() {
@Override
public float getInterpolation(float t) {
t -= 1.0f;
return t * t * t * t * t + 1.0f;
}
};
/**
* 是否触摸吸顶view并且不能触发布局滑动
* 注意:它不仅会判断自己的吸顶view,也会判断下级ConsecutiveScrollerLayout的吸顶view
*/
private boolean isTouchNotTriggerScrollStick = false;
/**
* 在快速滑动的过程中,触摸停止滑动
*/
private boolean isBrake = false;
public ConsecutiveScrollerLayout(Context context) {
this(context, null);
}
public ConsecutiveScrollerLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ConsecutiveScrollerLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray a = null;
try {
a = context.obtainStyledAttributes(attrs, R.styleable.ConsecutiveScrollerLayout);
isPermanent = a.getBoolean(R.styleable.ConsecutiveScrollerLayout_isPermanent, false);
disableChildHorizontalScroll = a.getBoolean(R.styleable.ConsecutiveScrollerLayout_disableChildHorizontalScroll, false);
mStickyOffset = a.getDimensionPixelOffset(R.styleable.ConsecutiveScrollerLayout_stickyOffset, 0);
mAutoAdjustHeightAtBottomView = a.getBoolean(R.styleable.ConsecutiveScrollerLayout_autoAdjustHeightAtBottomView, false);
没有合适的资源?快使用搜索试试~ 我知道了~
基于Kotlin的框架-协程 扩展 AndroidX Api29.zip
共1447个文件
kt:513个
xml:272个
java:270个
需积分: 5 0 下载量 13 浏览量
2024-02-06
09:50:06
上传
评论
收藏 15.16MB ZIP 举报
温馨提示
基于Kotlin的框架-协程 扩展 AndroidX Api29.zip
资源推荐
资源详情
资源评论
收起资源包目录
基于Kotlin的框架-协程 扩展 AndroidX Api29.zip (1447个子文件)
IMyService2Interface.aidl 295B
IMyCallbackInterface.aidl 124B
gradlew.bat 2KB
timer.c 181B
fdkcodec.cpp 8KB
yuvutils.cpp 7KB
VideoEncoder.cpp 3KB
openh264util.cpp 1KB
材料清单DOC.docx 1.08MB
white_blance_frag.fsh 1KB
camera_frag.fsh 1KB
camera_no_filter.fsh 301B
.gitignore 103B
.gitignore 7B
.gitignore 7B
.gitignore 7B
.gitignore 7B
.gitignore 7B
.gitignore 7B
.gitignore 6B
.gitignore 6B
.gitignore 6B
.gitignore 6B
.gitignore 6B
.gitignore 6B
beauty2.glsl 6KB
sweets.glsl 5KB
sweets.glsl 5KB
freud.glsl 5KB
freud.glsl 5KB
default_fragment.glsl 4KB
default_fragment.glsl 4KB
brooklyn.glsl 4KB
brooklyn.glsl 4KB
beauty.glsl 4KB
beauty.glsl 4KB
nostalgia.glsl 4KB
nostalgia.glsl 4KB
sunrise.glsl 4KB
sunrise.glsl 4KB
latte.glsl 4KB
latte.glsl 4KB
pixar.glsl 4KB
pixar.glsl 4KB
healthy.glsl 3KB
healthy.glsl 3KB
sunset.glsl 3KB
sunset.glsl 3KB
earlybird.glsl 3KB
earlybird.glsl 3KB
fragment.glsl 3KB
skinwhiten.glsl 3KB
skinwhiten.glsl 3KB
whitecat.glsl 3KB
whitecat.glsl 3KB
emerald.glsl 3KB
emerald.glsl 3KB
blackcat.glsl 3KB
blackcat.glsl 3KB
calm.glsl 2KB
calm.glsl 2KB
tender.glsl 2KB
tender.glsl 2KB
brannan.glsl 2KB
brannan.glsl 2KB
evergreen.glsl 2KB
evergreen.glsl 2KB
toaster2_filter_shader.glsl 2KB
toaster2_filter_shader.glsl 2KB
sakura.glsl 2KB
sakura.glsl 2KB
warm.glsl 2KB
warm.glsl 2KB
antique.glsl 2KB
antique.glsl 2KB
hefe.glsl 2KB
hefe.glsl 2KB
sutro.glsl 2KB
sutro.glsl 2KB
cool.glsl 2KB
cool.glsl 2KB
suger_tablets.glsl 1KB
romance.glsl 1KB
romance.glsl 1KB
valencia.glsl 1KB
valencia.glsl 1KB
suger_tablets.glsl 1KB
crayon.glsl 1KB
crayon.glsl 1KB
xproii_filter_shader.glsl 1KB
xproii_filter_shader.glsl 1KB
hudson.glsl 1KB
hudson.glsl 1KB
rise.glsl 1KB
sierra.glsl 1KB
rise.glsl 1KB
sierra.glsl 1KB
amaro.glsl 1KB
amaro.glsl 1KB
walden.glsl 1KB
共 1447 条
- 1
- 2
- 3
- 4
- 5
- 6
- 15
资源评论
YOLO数据集工作室
- 粉丝: 482
- 资源: 1568
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功