Android 实现ScrollView自定义翻页宽度(每次滑动一页) - 类似钉钉工作台

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chunho/article/details/55213332

【描述】:

每个属性都是一个item,每屏显示3个item,每次滑动,ScrollView滚动一个屏幕的宽度。

【效果】:

这里写图片描述

【代码】:

【一】添加item到ScrollView
if (!functionPage.getReportPanel().isEmpty()) {
                    for (ReportItem reportItem : functionPage.getReportPanel()) {
                        View view = mInflater.inflate(R.layout.item_main_center,
                                layoutScrollview, false);
                        //设置每个item的宽度为屏幕宽的1/3
                        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                                screenWidth / 3, ViewGroup.LayoutParams.WRAP_CONTENT);
                        view.setLayoutParams(params);
                        ((TextView) view.findViewById(R.id.top_tv_value)).setText(reportItem.getValue());
                        ((TextView) view.findViewById(R.id.top_tv_name)).setText(reportItem.getName());

                        layoutScrollview.addView(view);
                    }

                    //添加空白view,方便scrollview滚动操作
                    int blankNum = functionPage.getReportPanel().size() % 3 == 0 ?
                            0 : 3 - functionPage.getReportPanel().size() % 3;
                    for (int i = 0; i < blankNum; i++) {
                        View view = mInflater.inflate(R.layout.item_main_center,
                                layoutScrollview, false);
                        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                                screenWidth / 3, ViewGroup.LayoutParams.WRAP_CONTENT);
                        view.setLayoutParams(params);
                        ((TextView) view.findViewById(R.id.top_tv_value)).setText("");
                        ((TextView) view.findViewById(R.id.top_tv_name)).setText("");
                        layoutScrollview.addView(view);
                    }
                }

为了方便操作,如果需要显示的item数不是3的倍数,则用空白view填充,以便方便计算与滚动。

【二】控制ScrollView每次滚动的距离与相应操作
mScrollView.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {

                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        mOldScrollX = mScrollView.getScrollX();
                        break;
                    case MotionEvent.ACTION_UP:
                        mCurScrollX = mScrollView.getScrollX();
                        //每次手滑动距离大于200或者小于-200才可以触发ScrolView滚动一屏幕距离,否则恢复原位
                        if ((mCurScrollX - mOldScrollX) > 200) {
                            mScrollView.scrollTo(mOldScrollX + screenWidth, 0);
                        } else if ((mCurScrollX - mOldScrollX) < -200) {
                            mScrollView.scrollTo(mOldScrollX - screenWidth, 0);
                        } else {
                            mScrollView.scrollTo(mOldScrollX, 0);
                        }
                        break;
                }
                return false;

            }
        });
【三】控制ScrollView惯性滚动
    //为了阻止惯性滚动,自定义ScrollView并且重写fling方法,设置velocity / 1000这是关键。
    @Override
    public void fling(int velocity) {
        super.fling(velocity / 1000);
    }
阅读更多

没有更多推荐了,返回首页