HorizontalScrollView со стрелками - PullRequest
       4

HorizontalScrollView со стрелками

5 голосов
/ 06 октября 2011

Я пытаюсь создать прокручиваемое горизонтальное меню с использованием HorizontalScrollView, используя макет, показанный ниже. Меню можно прокручивать с помощью кнопок со стрелками «предыдущий / следующий» или при переключении. Когда HorizontalScrollView достигает одного конца, я бы хотел, чтобы стрелка на том же конце была скрыта (на изображении, показанном ниже, я хотел бы, чтобы стрелка влево была скрыта).

Как я могу определить, что HorizontalScrollView достиг конца?

Спасибо

enter image description here

<RelativeLayout android:background="@drawable/bg_home_menu"
    android:layout_width="fill_parent" android:layout_height="45dp">
    <ImageView android:id="@+id/previous" android:src="@drawable/arrow_l"
        android:layout_height="14dp" android:layout_width="10dp"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true" />

    <ImageView android:id="@+id/next" android:src="@drawable/arrow_r"
        android:layout_height="14dp" android:layout_width="10dp"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true" />

    <HorizontalScrollView android:id="@+id/horizontalScroll"
        android:layout_width="fill_parent" android:layout_height="fill_parent"
        android:scrollbars="none" android:fadingEdgeLength="30dp" android:layout_toLeftOf="@id/next"
        android:layout_toRightOf="@id/previous" >

        <LinearLayout android:id="@+id/home_menu"
            android:orientation="horizontal" android:layout_width="wrap_content"
            android:layout_height="fill_parent" android:gravity="center_vertical">

            <Button android:id="@+id/btn_home" android:background="@drawable/btn_home_menu_on"
                android:layout_height="35dp" android:layout_width="wrap_content" android:focusable="true"
                android_clickable="false" android:text="@string/menu_home" android:textColor="#FFFFFF" android:tag="-1"/>

            <!-- More are added dynamically -->

        </LinearLayout>

    </HorizontalScrollView>
</RelativeLayout>

Ответы [ 2 ]

4 голосов
/ 06 октября 2011

Нет слушателя прокрутки для HorizontalScrollView. Что вы можете сделать, это добавить к нему OnTouchListener. Он будет срабатывать непрерывно, когда пользователь выполняет прокрутку, и каждый раз, когда вы можете использовать метод getScrollX, который возвращает int.

Теперь 0 означает самый левый край, чтобы найти самый правый (максимальный объем прокрутки), вам нужно найти ширину дочернего представления вида горизонтальной прокрутки. Это можно найти с помощью addOnGlobalLayoutListener, иначе ширина всегда будет 0 внутри метода onCreate

Поместите этот код в метод onCreate

final HorizontalScrollView hs = (HorizontalScrollView)findViewById(R.id.scroll);

ViewTreeObserver vto = hs.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
        hs.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
        maxScrollX = hs.getChildAt(0) 
                .getMeasuredWidth()-getWindowManager().getDefaultDisplay().getWidth();

    } 
});        

hs.setOnTouchListener(new OnTouchListener() {           
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Log.e("ScrollValue", Integer.toString(hs.getScrollX()));
  if(hs.getScrollX() == maxScrollX){
      Log.e("MaxRight", "MaxRight");    
  }
  return false;
    }
});
3 голосов
/ 06 октября 2011

Используйте getScrollX () из LinearLayout внутри скроллера, чтобы определить, какой крайний левый угол на экране.Если это 0, то стрелка влево должна быть отключена.

Для стрелки вправо получите ширину прямоугольника рисования , добавьте getScrollX () и сравните это с getMeasuredWidth (), если это то же самое, вы находитесь справа, вам не нужна стрелка вправо.

Так что ваш код будет выглядеть так:

if (homeMenu.getScrollX()==0) {
  hideLeftArrow();
} else {
  showLeftArrow();
}
if (homeMenu.getDrawingRect().right == homeMenu.getMeasuredWidth()) {
  hideRightArrow();
} else {
  showRightArrow();
}

Конечно, вы будетедолжен поместить это в слушателя события.Я могу думать только о том, чтобы использовать ваш собственный класс HorizontalScrollView с методом onScroll (), перезаписанным для выполнения указанных выше проверок, см. этот пост .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...