public class XPagedView extends ViewGroup {
private static final String TAG = "XPagedView";
/**
* 阻尼系数,越小阻尼越大
*/
private static final float DAMPING_COEFFICIENT = 0.3f;
/**
* 页面自动切换延迟时间
*/
private static final int SCROLL_DURATION = 250;
private Context mContext;
private VelocityTracker mVelocityTracker;
/**
* 触发自动翻页的的最小速度
*/
private int mTriggerTrunPageVelocity;
/**
* 最大最小fling速度
*/
private int mMaxFlingVelocity, mMinFlingVelocity;
private int mLastDownX, mLastDownY;
/**
* 插入的间距
*/
private Rect mInsert = new Rect();
/**
* 当前是否处于左右拖拽滑动中
*/
private boolean mIsBeingDragging;
/**
* 是否允许阻尼效果
*/
private boolean mIsAllowDamping = true;
/**
* 上一次的方向 1表示向右 | -1表示向左
*/
private int mLastDirection = 0;
/**
* 代表了页数索引,[0, childCount), 暂时没用
*/
private int[] mPages;
/**
* 包含的子View集合
*/
private List<View> mChilds;
/**
* 当前页码
*/
private int mCurrentPage;
/**
* 第一次触摸的X坐标
*/
private int mStartX;
public XPagedView(Context context) {
super(context);
init(context);
}
public XPagedView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public XPagedView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
mContext = context;
mChilds = new ArrayList<>();
// 默认初始化的时候是第一页
mCurrentPage = 0;
// 设置边距
mInsert.set(0, 0, 0, 0);
mTriggerTrunPageVelocity = (int) context.getResources().getDisplayMetrics().density * 500;
ViewConfiguration configuration = ViewConfiguration.get(mContext);
mMaxFlingVelocity = configuration.getScaledMaximumFlingVelocity();
mMinFlingVelocity = configuration.getScaledMinimumFlingVelocity();
mScroller = new Scroller(mContext);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
左右滑动的分页View(模拟Launcher3的PagedView)
最新推荐文章于 2023-05-06 00:30:00 发布
这个博客介绍了一个自定义的滑动页面切换组件XPagedView的实现,包括阻尼效果、自动切换、触屏事件处理等功能。组件内部使用Scroller进行平滑滚动,并通过计算滑动速度和方向来判断是否触发页面切换。

最低0.47元/天 解锁文章
1084

被折叠的 条评论
为什么被折叠?



