2

私は現在、スクロールビュー(垂直スクロールビューを意味します。スクロールビューの子相対レイアウトのID:category01layout、category02layout、...)を子として持つHorizo​​ntalscrollview(ID:ordermenu)の水平スクロールを無効にするために取り組んでいます。

XML では次のようになります。

Horizo​​ntalScrollView(ordermenu)
- LinearLayout
  - ScrollView
    - RelativeLayout(category01layout)
  - ScrollView
    - RelativeLayout(category02layout)
...
  - ScrollView
    - RelativeLayout(category08layout)

画面には一度に 1 つのカテゴリ レイアウトが表示され、前/次ボタンを押すと、 horizo​​ntalscrollview.smoothScrollTo() を設定してカテゴリ レイアウトを変更します。

そのため、アプリを実行してスクロールすると、指は Horizo​​ntalScrollView と ScrollView の両方をスクロールします。しかし、指でこれら 2 つの両方が onScrollChanged をリッスンするようにしたくありません。私はScrollViewが私の指を聞いて「垂直方向にのみスクロールする」ようにしたいだけです。これを行う方法がわからないので、正確な垂直方向にスクロールする場合にのみ、ScrollView はスムーズに垂直方向にスクロールします。それ以外の場合、私の指は Horizo​​ntalScrollView もスクロールしますが、これは予想外でした。

では、水平スクロールを無効にして垂直スクロールのみを有効にする方法はありますか?

以前にこの方法を使用しました (Horizo​​ntalScrollView を拡張するクラスを作成します)

@Override
protected void onScrollChanged(int x, int y, intoldx, intoldy){
if(Math.abs(x - oldx) <= 50){
mScrollable = false;
}
else {
mScrollable = false;

}
return;
}

しかし、これは UI に多くの負担をもたらし、垂直スクロールの ScrollView が硬すぎて遅くなりすぎました。ですから、これ以外の方法を教えてください。

前もって感謝します。

4

4 に答える 4

0

私のサブクラスのHorizo​​ntalScrollViewには、垂直方向と水平方向の両方にスクロールできる次のメソッドがあります。基本的に、垂直スクロールを検出すると、タッチをあきらめます。それがあなたにどれだけ反応するかによって、最小距離で遊んでください。

 private float SWIPE_VERT_MIN_DISTANCE = 100;
 private float startlocation = 0;
    private float diffY = 0;
    private boolean vertScroll = false;

    public boolean onInterceptTouchEvent (MotionEvent ev){
        boolean ret = super.onInterceptTouchEvent(ev);



        switch(ev.getAction()){
            case MotionEvent.ACTION_DOWN:
                startlocation = ev.getY();
                vertScroll = false;
                break;
            case MotionEvent.ACTION_MOVE:
                diffY = Math.abs(startlocation - ev.getY());
                if(diffY > SWIPE_VERT_MIN_DISTANCE)
                    vertScroll = true;
                break;
            case MotionEvent.ACTION_UP:
                break;
        }

        if(ret){
            if(vertScroll)
                return false;
            else
                return true;
        }

        return ret;
    }
于 2011-11-15T03:45:09.207 に答える
0

この問題とは別に、View Flipper を使用することをお勧めします。

次に、レイアウト(次へ/前へのボタンをクリックした後に変更されるレイアウト)を取得します。

次のボタンがクリックされると、アニメーションで viewFlipper.showNext()/viewFlipper.showPrevious() を実行します(右イン/左アウトなど)。

したがって、レイアウト上で滑らかなスクロールを表示できます。それを試してみてください。私はこのようにしています。それはうまくいくはずです。

于 2011-11-15T06:20:29.207 に答える
0

ここで本当に欲しいのはViewPagerだと思います。ちなみに、Google の Android 開発者は、次のルールについてよく言及しています。

  1. スクロール ビューを他のスクロール ビュー内に配置しないでください。
  2. スクロール ビュー内にリスト ビューを配置しないでください。
于 2011-11-15T05:35:10.537 に答える