如何在Android中创建垂直图库?

时间:2011-01-09 15:26:10

标签: android scroll gallery

我想创建一个与图库窗口小部件类似的窗口小部件,但是垂直滚动而不是水平滚动。那就是画廊中的图像应垂直放置在屏幕上,并且可以垂直滚动。有人帮我吗?

3 个答案:

答案 0 :(得分:2)

假设您想拥有一列图像并想要垂直滚动。请查看以下示例

   <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 :(得分:1)

我设法使用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);
                    }
                });
            }
          }
        });

答案 2 :(得分:0)

您必须扩展Gallery类,并在Draw过程中将画布旋转90度。然后只需要修改onTouch事件和其他一些内容。在此之后,布局会出现一些问题(因为它仍然希望在其参数中绘制布局)。所以我把它放在一个LinearLayout中并修改了布局大小。
所以最终的垂直画廊实际上是一个线性布局,里面有一个画廊。我已经实现了它,它运行得很好。您只需要将放入其中的所有内容旋转90度到另一个方向。权衡实际上是一点点,因此您可以扩展您想要放入其中的每个视图,并在绘制过程中将其旋转到另一个方向。