Как я могу создать вертикальную галерею в Android? - PullRequest
2 голосов
/ 09 января 2011

Я хочу создать виджет, который ведет себя аналогично виджету галереи, но прокручивает вертикально, а не горизонтально. То есть изображения в галерее должны располагаться вертикально на экране и их можно прокручивать вертикально. Кто-нибудь может мне помочь, пожалуйста?

Ответы [ 3 ]

2 голосов
/ 04 декабря 2011

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

   <GridView android:id="@+id/gridView1" 
    android:layout_width="70dp"  android:layout_height="fill_parent"
    android:verticalSpacing="2dp"   android:numColumns="1" 
    android:stretchMode="columnWidth" android:layout_marginLeft="1dp"
    android:layout_alignParentTop="true"  android:scrollingCache="true"
    android:scrollbars="vertical" android:fadeScrollbars="false"
    android:scrollbarAlwaysDrawVerticalTrack="true">
</GridView>
1 голос
/ 12 марта 2013

Мне удалось создать простое решение, используя ListView, и прокрутить его до ближайшего положения, когда прокрутка остановлена. Просто создайте ListView и добавьте OnScrollListener:

РЕДАКТИРОВАТЬ: Я обновил код для лучшей реализации

lv.setOnScrollListener(new OnScrollListener(){

        private boolean handleScrollChange = true;

        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
          }

       public void onScrollStateChanged(final AbsListView view, int scrollState) {
            if (!handleScrollChange)
                return;
            if(scrollState == OnScrollListener.SCROLL_STATE_IDLE){
                View centerView;
                if (view.getLastVisiblePosition() - view.getFirstVisiblePosition() > 1) { //if shows more than 2 items, display the middle one
                    centerView = view.getChildAt( Math.round((view.getChildCount())/2));
                }
                else { //shows 2 items, check which one is closer to the middle
                    View bottomview = view.getChildAt(view.getChildCount()-1); 
                    if (bottomview.getTop() < bottomview.getHeight() / 2) {
                        centerView = bottomview;
                    }
                    else {
                        centerView = view.getChildAt(0);
                    }
                }

                int wantedOffset = (view.getHeight() - centerView.getHeight()) / 2 ;
                final int scrollby = (int) centerView.getY() - wantedOffset;
                //we want to prevent the smoothScroll from calling this function again
                handleScrollChange = false;

                view.post(new Runnable() {
                    @Override
                    public void run() {
                        view.smoothScrollBy(scrollby,300);
                        view.postDelayed(new Runnable() {

                            @Override
                            public void run() {
                                handleScrollChange = true;
                            }
                        }, 1000);
                    }
                });
            }
          }
        });
0 голосов
/ 04 ноября 2011

Вы должны расширить класс Gallery и в процедуре Draw повернуть холст на 90 градусов.Затем требуется всего несколько изменений, таких как изменение события onTouch, и еще несколько.После этого будет несколько проблем с макетом (так как он все еще хочет нарисовать макет в его параметрах).Поэтому я поместил его в LinearLayout и установил размер макета в этом.
Таким образом, окончательная вертикальная галерея на самом деле представляет собой линейный макет, в который вставлена ​​галерея.Я реализовал это, и это работает довольно хорошо.Вам нужно будет только повернуть все, что вы положили в него, на 90 градусов в другом направлении.Компромисс действительно немного, поэтому вы можете расширить каждый вид, который вы хотите поместить в него, и просто повернуть его в другом направлении в процедуре рисования.

...