Android - отключить горизонтальную прокрутку горизонтального просмотра прокрутки, который имеет прокрутку в виде детей - PullRequest
1 голос
/ 15 ноября 2011

Сейчас я работаю над тем, чтобы отключить горизонтальную прокрутку horizontalscrollview (id: ordermenu), у которого есть scrollview (я имею в виду вертикальный scrollview. Id дочернего элемента scrollview относительнойlayout: category01layout, category02layout, ...) как дочерних.

Вот как это выглядит в XML:

HorizontalScrollView (ordermenu)
- LinearLayout
- ScrollView
- RelativeLayout (категория01layout)
- ScrollView
- RelativeLayout (категория02layout)
...
- ScrollView
- RelativeLayout (категория08layout)

На экране отображается один макет категории за раз, и когда я нажимаю кнопку «предыдущий / следующий», он устанавливает horizontalscrollview.smoothScrollTo () для изменения макета категории.

Поэтому, когда я запускаю приложение и выполняю прокрутку, мой палец прокручивает и HorizontalScrollView и ScrollView. Но я не хочу, чтобы мой палец слушал оба onScrollChanged. Я только хочу, чтобы ScrollView слушал мой палец, чтобы «только прокручивать вертикально». Поскольку я не знаю, как это сделать, ScrollView плавно прокручивает по вертикали, только если я прокручиваю в точном вертикальном направлении. В противном случае мой палец также прокручивает HorizontalScrollView, чего я не ожидал.

Так есть ли способ отключить горизонтальную прокрутку и включить только вертикальную прокрутку?

Ранее я использовал этот метод (создайте класс, расширяющий HorizontalScrollView)

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

}
return;
}

Но это только вызвало большую нагрузку на пользовательский интерфейс, делая вертикальную прокрутку ScrollView слишком жесткой и медленной. Поэтому, пожалуйста, дайте мне другой способ, чем этот.

Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 16 апреля 2016

Попробуйте использовать переключатель видов, в котором нет необходимости прокручивать представления внутри других представлений прокрутки и представления списков внутри представлений прокрутки.

Желаю вам решить вашу проблему очень скоро.

0 голосов
/ 15 ноября 2011

Я думаю, что вы действительно хотите здесь ViewPager .Кстати, разработчики Google Android часто упоминают следующие правила:

  1. Вы не помещаете представления прокрутки в другие представления прокрутки.
  2. Вы не помещаете представления списка в представления прокрутки.
0 голосов
/ 15 ноября 2011

Помимо этой проблемы, я предлагаю вам взять View Flipper.

Затем возьмите в нем макеты (те макеты, которые будут изменены после нажатия кнопки «Далее / Предыдущая»).

Теперь, когда будет нажата следующая кнопка, сделайте viewFlipper.showNext () / viewFlipper.showPrevious () с анимацией (например, справа / слева).

Таким образом, вы можете показывать плавный рывок по макетам.Попытайся.Я делаю это таким образом.Это должно работать.

0 голосов
/ 15 ноября 2011

У меня есть следующий метод в моем подклассе HorizontalScrollView, который позволяет мне прокручивать как вертикально, так и горизонтально. В основном, если он обнаруживает вертикальную прокрутку, он отказывается от прикосновений. Играйте с минимальным расстоянием в зависимости от того, насколько он чувствителен к вам.

 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;
    }
...