左右滑动的分页View(模拟Launcher3的PagedView)

这个博客介绍了一个自定义的滑动页面切换组件XPagedView的实现,包括阻尼效果、自动切换、触屏事件处理等功能。组件内部使用Scroller进行平滑滚动,并通过计算滑动速度和方向来判断是否触发页面切换。
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) {
   
   
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值