`
isiqi
  • 浏览: 16701841 次
  • 性别: 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);
}
}

GridView中的每个 item的背景的点击选中效果得通过动态加载Adapter实现

全部源代码:

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

分享到:
评论

相关推荐

    GridView实现Gallery效果

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

    android gridView实现自定义gallery

    为了模拟Gallery的左右滑动效果,我们可能需要处理触摸事件,监听滑动方向,并在用户滑动时手动改变GridView的焦点。这可以通过重写GridView的onTouchEvent()方法来实现,或者使用第三方库如ViewPagerIndicator来...

    Android Gallery 3D效果

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

    android gallery 3D效果

    尽管如此,我们仍可以通过一些技巧来模拟`Gallery`的3D效果。接下来,我们将详细介绍如何在Android中实现一个简单的`Gallery 3D`效果。 首先,我们需要创建一个自定义的`ViewGroup`,用于承载3D展示的图片。这个类...

    模拟立体翻转效果,非Gallery实现毕业设计—(包含完整源码可运行).zip

    然而,Gallery组件在API Level 16(Android 4.1, Jelly Bean)之后已被废弃,开发者逐渐转向使用GridView或RecyclerView等其他组件来替代。 那么,如何非Gallery实现立体翻转效果呢?这通常涉及以下几个关键知识点...

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

    4. **监听滑动事件**:为了模拟Gallery的滑动效果,我们可以监听GridView的滑动事件。使用`OnScrollListener`,并在`onScrollStateChanged()`方法中处理滑动逻辑,例如切换图片或更新指示器等。 5. **动画效果**:...

    Gallery 3D效果的程序

    Gallery 3D是一种在应用程序中展示图片集合的高级方式,它通过模拟三维空间中的图片浏览体验,为用户带来更加生动和交互式的视觉享受。在这个"Gallery 3D效果的程序"中,我们将深入探讨如何利用编程技术实现这种效果...

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

    通过`GridView`呈现多张小图,用户点击后可以通过`ViewPager`或类似的滑动控件来查看大图,从而模拟出类似于系统Gallery应用的体验。同时,适配器模式在这里起到了关键作用,它允许将数据与视图解耦,使得数据的更新...

    android 自定义 gallery

    3. 自定义滚动行为:为了模拟Gallery的平滑滚动效果,我们可能需要重写HorizontalScrollView的onTouchEvent()方法,以便处理用户的滑动操作。这包括计算滑动速度,实现平滑滚动动画等。 4. 添加触摸监听:通过设置...

    android运用gallery浏览图片并自动滑动

    然而,`Gallery`已经在API Level 16(Android 4.1, Jelly Bean)中被弃用,取而代之的是更现代的`GridView`和`RecyclerView`等组件。尽管如此,了解如何在旧版本的Android系统中使用`Gallery`仍然是有价值的,尤其是...

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

    此时,我们可以选择使用HorizontalScrollView替代,通过添加额外的触摸事件处理和动画效果,模拟出Gallery的交互体验。例如,我们可以监听滑动事件,实现项目的平滑切换,并且可以添加惯性滚动的效果,提高用户体验...

    安卓Android源码——Gallery3D.zip

    `Scroller`类通过模拟物理滚动效果,使用户在滑动图片时感受到平滑自然的动画过渡。 此外,源码还包含了多线程和异步任务的使用,例如`LoaderTask`用于在后台线程加载图片,避免阻塞主线程,保证应用的响应性。`...

    应用源码之Gallery2.zip

    - Gallery2展示了如何自定义View和Adapter,实现图像列表的展示,这包括对GridView、ListView等布局的使用和扩展。 - 对于图片的显示,可能采用了ImageView的多种模式,如CENTER_CROP、FIT_CENTER等,以适应不同...

    安卓Gallery照片墙画廊图库相关-1420683103168Android图片浏览器.zip

    在这个项目中,开发者可能使用了RecyclerView或者自定义的布局管理器来模拟Gallery的效果,以展示图片墙。 描述中提到“程序如果跑不起来需要自调”,这意味着源码可能包含了一些需要开发者自行调整的地方,例如...

    安卓Gallery照片墙画廊图库相关-点击查看大图支持左右滑动缩放.rar

    本项目可能包含了自定义实现的图库功能,以模拟旧版Gallery的行为,同时提供了查看大图、左右滑动和缩放等交互效果。 1. **自定义ViewGroup**: 项目可能使用了一个自定义的ViewGroup,比如继承自LinearLayout或...

    Android编程仿Iphone拖动相片特效Gallery的简单应用示例

    本文将介绍如何在Android平台上创建一个简单的应用,模拟iPhone的图片拖动效果。以下是对实现这一功能的关键步骤的详细解释: **Step 1: 准备图片素材** 首先,我们需要准备一些图片作为展示的内容。在这个例子中,...

    Android程序研发源码Android 仿UC,墨迹天气左右拖动多屏幕显示效果源码.rar

    这两个类可以帮助我们计算出滑动结束后的速度,进而模拟出物体在物理世界中的惯性效果。 4. **动画效果**:在滑动过程中,可以使用Android的ViewPropertyAnimator或Animation类来添加平滑的过渡动画。这不仅可以使...

    android相册

    在这个项目中,开发者可能已经实现了自定义的3D滚动效果,以模拟类似`Gallery`的行为,同时增添了立体感。 在Android中,访问和展示图片通常涉及到以下几个关键知识点: 1. **多媒体存储库(MediaStore)**:...

    android 一个图片浏览器的实现。

    然而,从Android 3.0(API级别11)开始,`Gallery`组件已被废弃,取而代之的是`GridView`或`HorizontalScrollView`等其他组件来实现类似功能。 二、自定义图片浏览器 "GalleryDemo"可能使用了`HorizontalScrollView...

    Android开发规范

    29. **GridView:gridView** 30. **ListView:listView** 31. **ExpandableList:epdList** 32. **MapView:mapView** **控件说明:** 1. **TextView** - 用于展示静态文本。 2. **Button** - 用户交互的按钮,通常...

Global site tag (gtag.js) - Google Analytics