6

我需要实现以下场景,

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

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

这是我的要求:在此处输入图像描述

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

我已经使用了带有 ACTION_UP 事件的 onTouch() 方法,所以当我从屏幕上松开手指时,它会在该点给我 getScrollX() 位置,但是当滚动完成/停止时我需要 getScrollX() 位置。

这是我的代码:-

  @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;
    }
4

3 回答 3

3

这是我的答案:

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());

                    }

        });
于 2012-09-14T13:01:46.553 回答
1

给你:Stackoverflow 答案

您所要做的就是用 getScrollX() 替换 getScrollY()

于 2012-09-12T16:47:25.517 回答
0

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

于 2012-09-03T06:44:30.370 回答