6

次のシナリオを実装する必要があります。

ここでは、2 つの 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

ここに行きます:スタックオーバーフローの回答

getScrollY() を getScrollX() に置き換えるだけです。

于 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 に答える