【问题标题】:Get maximum HorizontalScrollView scroll amount获取最大 Horizo​​ntalScrollView 滚动量
【发布时间】:2011-10-03 23:31:06
【问题描述】:

我正在向我的HorizontalScrollView 添加浮动箭头,这将让用户知道当前视图之外还有更多项目。

我需要的是如何判断视图是否已滚动到最大值。你会认为getMaxScrollAmount() 方法会给你这个 - 它没有,在我的代码中它给了我视图的宽度。去弄清楚为什么。这是我的代码 - 又好又简单:

    final ImageView leftArrow = (ImageView) toReturn.findViewById(R.id.leftArrow);
    final ImageView rightArrow = (ImageView) toReturn.findViewById(R.id.rightArrow);

    final HorizontalScrollView scrollView = (HorizontalScrollView) toReturn.findViewById(R.id.actionBarHoriztonalScroll);


    final GestureDetector gd = new GestureDetector(new SimpleOnGestureListener() {
        @Override
        public boolean onScroll(MotionEvent e1, 
                                MotionEvent e2, 
                                float distanceX, 
                                float distanceY) {
            if(scrollView.getScrollX() == 0) {
                leftArrow.setVisibility(View.GONE);
            } else {
                leftArrow.setVisibility(View.VISIBLE);
            }
            if(scrollView.getScrollX() == scrollView.getMaxScrollAmount() ||
                scrollView.getMaxScrollAmount() == 0) {
                rightArrow.setVisibility(View.GONE);
            } else {
                rightArrow.setVisibility(View.VISIBLE);
            }

            Log.v(ClientDetailsFragment.class.getSimpleName(), "max: " + scrollView.getMaxScrollAmount() +
                                                            "current: " + scrollView.getScrollX());
            return super.onScroll(e1, e2, distanceX, distanceY);
        }
    });

    scrollView.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View arg0, MotionEvent ev) {
            gd.onTouchEvent(ev);
            return false;
        }
    });

上述调试的输出:

10-03 14:36:16.343: VERBOSE/(20508): max: 240 current: 126
10-03 14:36:16.363: VERBOSE/(20508): max: 240 current: 127
10-03 14:36:16.386: VERBOSE/(20508): max: 240 current: 132
10-03 14:36:16.398: VERBOSE/(20508): max: 240 current: 143
10-03 14:36:16.417: VERBOSE/(20508): max: 240 current: 149
10-03 14:36:16.433: VERBOSE/(20508): max: 240 current: 152
10-03 14:36:16.449: VERBOSE/(20508): max: 240 current: 152
10-03 14:36:16.468: VERBOSE/(20508): max: 240 current: 152

(在这种情况下,152 是最大值)

【问题讨论】:

    标签: android


    【解决方案1】:

    水平滚动视图的子视图应该有正确的宽度。试试这个

    Log.e("ScrollWidth",Integer.toString(horizontalScrollview.getChildAt(0).getMeasuredWidth()-
            getWindowManager().getDefaultDisplay().getWidth()));
    

    这应该是最大滚动量。

    将以下代码放入您的 onCreate 方法中

    ViewTreeObserver vto = scrollView.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            scrollView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            Log.e("ScrollWidth",Integer.toString(horizontalScrollview.getChildAt(0)
                    .getMeasuredWidth()-getWindowManager().getDefaultDisplay().getWidth()));
    
        }
    });
    

    【讨论】:

    • 在 xml 膨胀后,在 onCreateView 中的宽度为“0”。即使做一个findById 给出的宽度为0 - 绝对不知道为什么。好主意!
    • oncreate 在视图实际绘制在屏幕上之前被触发。您只能在绘制布局后获得正确的宽度。我更新了我的未答复。
    • 很好的答案、解释和在布局后获得视图实际宽度的方法!
    • @blessenm,你能帮我解决一下我的垂直滚动视图吗? stackoverflow.com/questions/13698725/…
    • 这假定您的滚动视图与您的屏幕宽度相同。尝试使用horizo​​ntalScrollview.getChildAt(0).getMeasuredWidth()-horizo​​ntalScrollView.getMeasuredWidth()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多