`
liuweisir
  • 浏览: 43370 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

用GridView实现Gallery的效果

阅读更多

实现横向的类似Gallery的效果中做了实现Gallery的尝试,但是效果不好。使用的是TableLayout,出现了横向拖动图片的时候,因为有倾斜(轻微的竖向拖动),会整个列表竖向滚动。其实这个问题可以将TableRow中条目设置为clickable来解决。但是效果依然不好。

这次尝试通过GridView来解决问题,效果很好,见截图:

v1v3 v2

基本思路是:

 

  • 每个可选的图,包括文字部分,是GridView中的一个条目;
  • 一个GridView条目是相对布局(RelativeLayout),里面包含一个图片(ImageView)和一个文字(TextView);
  • 关键点是GridView如何保持横向,默认的情况下会折行的,首先要用一个HorizontalScrollView提供横向滚动容器,然后内部放置一个FrameLayout,如果不放置FrameLayout布局,直接放入下面的布局或者视图,GridView将会变成单列纵向滚动,在FrameLayout布局中加入横向的LinearLayout布局,要设置它的layout_width,要足够大,这样在其中加入GridView就能横向排列了。

首先看一下GridView中条目的布局:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:paddingBottom="10.0dip" android:layout_width="90.0dip" 
    android:layout_height="140.0dip"> 
    <ImageView android:id="@+id/ItemImage" android:layout_width="80.0dip" 
        android:layout_height="108.0dip" android:layout_marginLeft="10.0dip" 
        android:layout_centerHorizontal="true"> 
    </ImageView> 
    <TextView android:layout_below="@+id/ItemImage" android:id="@+id/ItemText" 
        android:ellipsize="end" android:layout_width="80.0dip" 
        android:layout_height="26.0dip" android:layout_marginTop="5.0dip" 
        android:singleLine="true" android:layout_centerHorizontal="true"> 
    </TextView> 
</RelativeLayout>

 

这里使用了相对布局的特性,android:layout_below,表示TextView在ImageView下面。这里的图都是用的res/drawable目录下的静态图形文件,正式情况下,应该是从网络获取,可参见用Java concurrent编写异步加载图片功能的原型实现,二者结合可用于正式生产环境。

ListView的Header使用了自定义视图,更简单的示例可参见为ListView增加Header。表头(ListView Header)的布局文件:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="fill_parent" 
    android:layout_height="200dp"> 
    <TextView android:layout_width="fill_parent" 
        android:layout_height="wrap_content" android:text="最近访问人物" /> 
    <HorizontalScrollView android:layout_width="fill_parent" 
        android:layout_height="160dp"> 
        <FrameLayout android:layout_width="fill_parent" 
            android:layout_height="match_parent"> 
            <LinearLayout android:layout_width="1100dp" 
                android:layout_height="match_parent" android:orientation="horizontal"> 
                <GridView android:id="@+id/grid" android:layout_width="fill_parent" 
                    android:gravity="center" android:layout_height="fill_parent" 
                    android:horizontalSpacing="1.0dip" android:verticalSpacing="1.0dip" 
                    android:stretchMode="spacingWidthUniform" android:numColumns="auto_fit" 
                    android:columnWidth="80dip"> 
                </GridView> 
            </LinearLayout> 
        </FrameLayout> 
    </HorizontalScrollView> 
</LinearLayout>

  

这是比较关键的布局文件,GridView能实现横向滚动主要靠它了。其中:

<LinearLayout android:layout_width="1100dp"

 

我是写死了1100dp,正式使用的时候,因为图片都可能是动态从服务器上获取的,可以根据数量以及图片的宽度,空白边动态计算这个长度。

GridView和ListView类似,都需要ViewAdapter来适配数据和视图。

见Activity的源代码:

package com.easymorse.grid.demo; 

import java.util.ArrayList; 
import java.util.HashMap; 

import android.app.ListActivity; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.GridView; 
import android.widget.ListView; 
import android.widget.SimpleAdapter; 

public class GridDemoActivity extends ListActivity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 

        LayoutInflater layoutInflater = (LayoutInflater) this 
                .getSystemService("layout_inflater"); 
        View headerView=layoutInflater.inflate(R.layout.list_header, null); 
        setGridView(headerView); 
        ListView listView=(ListView) this.findViewById(android.R.id.list); 
        listView.addHeaderView(headerView); 
        listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,new String[]{"隋","唐","宋","元","明","清"})); 
    } 

    private void setGridView(View view) { 
        GridView gridView = (GridView) view.findViewById(R.id.grid); 
        gridView.setNumColumns(10); 

        ArrayList<HashMap<String, Object>> items = new ArrayList<HashMap<String, Object>>(); 

        for (int i = 0; i < 10; i++) { 
            HashMap<String, Object> map = new HashMap<String, Object>(); 
            map.put("ItemImage", R.drawable.k); 
            map.put("ItemText", "清.康熙" + "(" + i + ")"); 
            items.add(map); 
        } 

        SimpleAdapter adapter = new SimpleAdapter(this, items, R.layout.item, 
                new String[] { "ItemImage", "ItemText" }, new int[] { 
                        R.id.ItemImage, R.id.ItemText }); 
        gridView.setAdapter(adapter); 
    } 
}

 

全部源代码:

http://easymorse.googlecode.com/svn/tags/grid.demo-0.1.0/

分享到:
评论

相关推荐

    GridView实现Gallery效果

    在某些情况下,Gallery的效果可能不尽如人意,这时开发者可能会选择使用GridView来模拟实现Gallery的效果。下面将详细解释如何使用GridView实现类似Gallery的功能,以及如何添加点击选中效果。 首先,我们需要理解...

    gridView 实现gallery滑动

    为了实现Gallery的横向滑动效果,我们可以通过自定义GridView的滚动行为来达成目标。这通常涉及到对GridView的滑动手势进行监听和处理。我们可以通过重写GridView的`onTouchEvent`方法,捕获用户的滑动事件。当用户...

    Android 滑动效果 Gallery + GridView

    6. **版本兼容性**:虽然Gallery在API 17被弃用,但依然可以在较低版本的设备上使用。如果需要在新版本中实现类似功能,可以考虑使用`RecyclerView`配合`LinearLayoutManager`或`GridLayoutManager`。 在提供的...

    android gridView实现自定义gallery

    要使用GridView实现自定义Gallery功能,我们首先需要创建一个自定义的Adapter。Adapter是连接数据源和UI组件的关键,它负责将数据转化为视图并填充到GridView中。这里我们需要一个继承自BaseAdapter的自定义Adapter...

    一个简单的相册GridView、Gallery的结合使用

    本项目“一个简单的相册GridView、Gallery的结合使用”恰好展示了如何整合这两个组件来实现这一功能。GridView和Gallery都是Android提供的布局控件,它们在显示数据集方面有各自的优势。 ** GridView详解:** ...

    Gallery+GridView使用的demo

    在早期的Android版本中,`Gallery`是实现轮播效果或者选择器的理想选择。然而,由于API 17(Android 4.2)中`Gallery`已被废弃,开发者通常转向其他替代方案,如`ViewPager`。尽管如此,理解`Gallery`的工作原理对于...

    ListView之+GridView+Gallery图片计时滚动

    在Android开发中,...总的来说,"ListView之+GridView+Gallery图片计时滚动"这个主题涵盖了Android UI开发中的基础组件和常见的滚动效果实现,对于Android开发者来说,掌握这些知识将有助于构建更丰富的用户界面。

    Android编程滑动效果之Gallery+GridView实现图片预览功能(附demo源码下载)

    本文实例讲述了Android编程滑动效果之Gallery+GridView实现图片预览功能。分享给大家供大家参考,具体如下: Android系统自带一个GridView和Gallery两个控件,GridView网格显示,Gallery单个浏览,两者结合起来可以...

    图片浏览(带水平滑动的GridView和带gallery的ViewPage)

    本教程主要探讨如何实现一个带有水平滑动的GridView以及一个具备Gallery功能的HorizontalScrollView,并且介绍如何在ViewPage中支持图片缩放和网络图片的显示。 首先,让我们来看看“带水平滚动的GridView”。传统...

    Gallery和GridView浅析

    以下是一个简单的Gallery使用示例,展示了如何在MainActivity中创建和配置Gallery,并添加监听器以处理点击事件: ```java public class MainActivity extends Activity { private Gallery gallery; @Override ...

    Gridview高级使用技巧

    例如,在数据更新或插入时,使用`android.widget.Gallery`的动画效果,或者自定义`Animator`来实现更个性化的动画。 7. **Header和Footer** 如果需要在GridView头部或尾部添加额外的信息或操作按钮,可以通过`...

    Android Gallery 3D效果

    在Android早期版本中,`Gallery`被广泛用来创建类似相册的3D效果,尽管在API 16之后,它被`GridView`和`RecyclerView`等更灵活的视图替代。然而,通过一些自定义实现,我们仍然可以创建出类似`Gallery 3D`的效果。 ...

    Android开发学习笔记 Gallery和GridView浅析

    Android开发中的`Gallery`和`GridView`都是用于展示数据的...不过需要注意的是,`Gallery`在API 21(Lollipop)之后已被弃用,开发者应考虑使用其他组件,如`RecyclerView`配合`HorizontalScrollView`来实现类似功能。

    android实现横向滑动解决Gallery从中间滑动的问题

    总结起来,通过使用GridView并进行适当的配置和定制,我们可以实现类似Gallery的横向滑动效果。这种方法不仅适用于图片浏览,还可以应用于其他需要横向滚动的场景。同时,这种做法也适应了Android对弃用组件的更新,...

    gallery实现类似水平滚轴效果

    4. **自定义适配器**:`Gallery`使用自定义的`Adapter`来填充数据,类似于`ListView`和`GridView`,开发者可以创建一个继承自`BaseAdapter`的类,重写其中的方法来提供数据和视图。 在实现“带时间轴的功能”时,`...

    android gallery 3D效果

    在Android平台上,`Gallery`组件曾经是实现3D滚动效果的一种流行方式,它允许用户以横向滑动的方式浏览图片或项目列表,同时提供了一种视觉上的立体感。然而,随着Android版本的更新,`Gallery`组件在API 16...

    安卓Gallery照片墙画廊图库相关-Android实现左右滑动查看图片效果.rar

    Gallery组件在早期版本的Android API中被广泛用于实现图片浏览,但在API 16之后被替换为GridView和RecyclerView等更灵活的视图。尽管如此,了解如何使用Gallery仍然是有价值的,因为有些开发者可能仍需支持较低版本...

    Gallery 3D效果的程序

    在早期的Android版本中,Gallery是一个受欢迎的选择,但在API 17之后被废弃,推荐使用RecyclerView或者GridView替代。 2. **3D效果实现**: 实现3D效果通常涉及对图片进行旋转和平移操作。在Android中,可以使用...

Global site tag (gtag.js) - Google Analytics