如何找到Horizo​​ntalScrollView的滚动值结束

时间:2012-09-03 06:31:27

标签: android scrollbar horizontalscrollview

我需要实现以下方案,

这里我有两个horizo​​ntalScrollViews,上面的scrollView是一个主菜单,下面的scrollView是一个子菜单。

当我滚动主菜单时,位于中心箭头下方的菜单将在下方滚动视图中显示其子菜单,而从下方滚动视图中,位于中心箭头下方的子菜单显示该子菜单的屏幕。

这是我的要求:enter image description here

我已经使用Horizo​​ntalScrollViews和ViewFlipper实现了它并且它也可以工作,但只有当我慢慢滚动而不是滚动快速时它才会给出正确的结果。

我在onTouch()方法中使用了ACTION_UP事件,所以当我从屏幕释放手指时,它会在那时给我getScrollX()位置,但是在滚动完成/停止时我需要getScrollX()位置。 / p>

这是我的代码: -

  @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (v.getId()) {

            case R.id.mHorizontalScrollViewMain:
           if (event.getAction() == KeyEvent.ACTION_UP) {
            Log.d("test", " " + hsvUpperTab.getScrollX() + " , "+ mViewFlipper.getChildCount());
            getUpperTabScrolled(hsvUpperTab.getScrollX());
        }
        break;

        case R.id.mHorizontalScrollViewSub:
                if (event.getAction() == KeyEvent.ACTION_UP) {
            Log.d("test1", " " + hsvLowerTab.getScrollX());
            getLowerTabScrolled(hsvLowerTab.getScrollX());

            }

        default:
            break;

        }

        return false;
    }

3 个答案:

答案 0 :(得分:2)

这是我的答案:

public class ScrollViewCustom extends HorizontalScrollView {
    private Runnable scrollerTask;
    private int intitPosition;
    private int newCheck = 100;
    private static final String TAG = "ScrollView";

    public interface onScrollStopListner{
        void onScrollStoped();
    }

    private onScrollStopListner onScrollstopListner;

    public ScrollViewCustom(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
            scrollerTask = new Runnable() {
                @Override
                public void run() {
                // TODO Auto-generated method stub
                    int newPosition = getScrollX();
                        if ( intitPosition - newPosition == 0 ) {
                            if ( onScrollstopListner != null ) {
                            onScrollstopListner.onScrollStoped();
                            }
                            }else{
                            intitPosition = getScrollX();
                            ScrollViewCustom.this.postDelayed(scrollerTask, newCheck);
                        }
                    }
        };
    }

    public void setOnScrollStopListner( ScrollViewCustom.onScrollStopListner listner ){
        onScrollstopListner = listner;
    }

    public void startScrollerTask(){
        intitPosition = getScrollX();
        ScrollViewCustom.this.postDelayed(scrollerTask, newCheck);
    }

}

这是活动:

scroll.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
                        if ( event.getAction() == MotionEvent.ACTION_UP ) {
                            scroll.startScrollerTask();
                        }
                        return false;
            }
        });



        scroll.setOnScrollStopListner(new onScrollStopListner() {
                @Override
                public void onScrollStoped() {
                    // TODO Auto-generated method stub
                    Log.d(TAG," "+scroll.getScrollX());

                    }

        });

答案 1 :(得分:1)

在这里:Stackoverflow Answer

您所要做的就是用getScrollX()

替换getScrollY()

答案 2 :(得分:0)

我们使用以下方法: 创建一个自定义Horizo​​ntalScrollView并覆盖onScrollChanged(int l,int t,int oldl,int oldt)方法,你的代码就在那里。 为了更准确,我们也覆盖了draw方法。