转:http://blog.csdn.net/tianjf0514/article/details/7521398

Gallery是画廊的意思,可以实现图片的浏览功能。

主要内容

  • Gallery控件的使用
  • 使用Gallery + ImageSwitcher完成图片浏览功能

一、Gallery控件的使用

要把图片显示到Gallery里面,要使用Gallery的setAdapter()方法,所以我们先写好一个adapter类

package com.tianjf;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.Gallery.LayoutParams;
import android.widget.ImageView; public class GalleryAdapter extends BaseAdapter { private Context mContext; // 所要显示的图片的数组
private int[] arrayImages = new int[] { R.drawable.pic01, R.drawable.pic02,
R.drawable.pic03, R.drawable.pic04, R.drawable.pic05, }; // 构造方法
public GalleryAdapter(Context mContext) {
super();
this.mContext = mContext;
} @Override
public int getCount() {
return arrayImages.length;
} @Override
public Object getItem(int position) {
return arrayImages[position];
} @Override
public long getItemId(int position) {
return position;
} /**
* 将资源图片设置到ImageView中
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView = new ImageView(mContext);
imageView.setBackgroundColor(0xFFFFFFFF);
// 将指定资源图片设置到ImageView中去
imageView.setImageResource(arrayImages[position]);
// 设置居中对齐
imageView.setScaleType(ImageView.ScaleType.CENTER);
imageView.setLayoutParams(new Gallery.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
return imageView;
}
}

接着我们把Gallery定义到布局文件中去

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <Gallery
android:id="@+id/gallery"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
&nbsp; android:spacing="5dip" /> </LinearLayout>

接着我们在Activity中将GalleryAdapter添加到Gallery上并设置Gallery的onItemClick事件

package com.tianjf;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Gallery; public class GalleryDemoActivity extends Activity implements
OnItemClickListener { private Gallery gallery; public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); gallery = (Gallery) findViewById(R.id.gallery);
gallery.setAdapter(new GalleryAdapter(this));
// 设置某张图片被点击的事件处理
gallery.setOnItemClickListener(this);
} /**
* 设置某张图片被点击的事件处理
*/
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Toast.makeText(this, String.valueOf(position), Toast.LENGTH_SHORT)
.show();
}
}

看一看效果:图片可以左右拖动,并且单击了某张图片出来一个Toast

另外,Gallery的实现和ListView是很类似的

除了使用BaseAdapter的方法,还可以直接使用SimpleAdapter的方法,更简单一点。

用SimpleAdapter,我们需要重新新建一个供SimpleAdapter用的布局文件(用来放一个一个的资源图片)

gallery_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" > <ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="center" /> </LinearLayout>

下面是修改后的GalleryDemoActivity.java

package com.tianjf;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.SimpleAdapter;
import android.widget.Gallery;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener; public class GalleryDemoActivity extends Activity implements
OnItemClickListener { private Gallery mGallery;
private SimpleAdapter mSimpleAdapter;
private List<Map<String, Integer>> mList = new ArrayList<Map<String, Integer>>(); public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); mGallery = (Gallery) findViewById(R.id.gallery);
initSimpleAdapter();
mGallery.setAdapter(mSimpleAdapter);
mGallery.setOnItemClickListener(this);
} private void initSimpleAdapter() {
// private int[] arrayImages = new int[] { R.drawable.pic01,
// R.drawable.pic02, R.drawable.pic03, R.drawable.pic04,
// R.drawable.pic05, };
// 以上的方法之适用显示比较少的图片,要是现在要显示1000张图片呢,不可能把1000张图片一个一个列出来
// 我们可以使用Java的反射机制来解决此问题,可以使用反射机制动态加载(最好图片的命名要有规律)
Field[] fields = R.drawable.class.getDeclaredFields(); // 取得drawable下的全部属性
// 循环取得的属性,以pic开头的都是要显示的图片,保存到list里面
for (Field field : fields) {
if (field.getName().startsWith("pic")) {
Map<String, Integer> map = new HashMap<String, Integer>();
try {
map.put("image", field.getInt(R.drawable.class));
} catch (Exception e) {
e.printStackTrace();
}
mList.add(map);
}
}
mSimpleAdapter = new SimpleAdapter(this, mList, R.layout.gallery_item,
new String[] { "image" }, new int[] { R.id.image });
} @Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Toast.makeText(this, String.valueOf(position), Toast.LENGTH_SHORT)
.show();
}
}

运行一下,看看效果是不是和BaseAdapter一样

二、使用Gallery + ImageSwitcher完成图片浏览功能

以上例子只是简单的实现了Gallery控件,能够拖动,但是怎么样使得触摸了其中一张图片,然后将这张图片显示在正中央放大显示呢?这才真正实现了图片浏览效果。

要实现以上效果,就要使用到ImageSwitcher类

首先,修改main.xml,把ImageSwitcher控件添加进去

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="bottom"
android:orientation="vertical" > <ImageSwitcher
android:id="@+id/imageSwitcher"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1" >
</ImageSwitcher> <Gallery
android:id="@+id/gallery"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:spacing="5dip" /> </LinearLayout>

修改GalleryDemoActivity.java,设置ImageSwitcher的mFactory属性,那么factory就会创造ImageView给ImageSwitcher

然后在onItemClick里面把资源图片添加到factory给ImageSwitcher创造出来的ImageView上

package com.tianjf;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageSwitcher;
import android.widget.ImageView;
import android.widget.SimpleAdapter;
import android.widget.Gallery;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Gallery.LayoutParams;
import android.widget.ViewSwitcher.ViewFactory; public class GalleryDemoActivity extends Activity implements
OnItemClickListener, ViewFactory { private Gallery mGallery;
private ImageSwitcher mImageSwitcher;
private SimpleAdapter mSimpleAdapter;
private List<Map<String, Integer>> mList = new ArrayList<Map<String, Integer>>(); public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); mGallery = (Gallery) findViewById(R.id.gallery);
mImageSwitcher = (ImageSwitcher) findViewById(R.id.imageSwitcher); initSimpleAdapter();
mGallery.setAdapter(mSimpleAdapter);
mGallery.setOnItemClickListener(this); // 设置工厂,实现ViewFactory的makeView方法生成ImageView给ImageSwitcher
mImageSwitcher.setFactory(this);
} private void initSimpleAdapter() {
// private int[] arrayImages = new int[] { R.drawable.pic01,
// R.drawable.pic02, R.drawable.pic03, R.drawable.pic04,
// R.drawable.pic05, };
// 以上的方法之适用显示比较少的图片,要是现在要显示1000张图片呢,不可能把1000张图片一个一个列出来
// 我们可以使用Java的反射机制来解决此问题,可以使用反射机制动态加载(最好图片的命名要有规律)
Field[] fields = R.drawable.class.getDeclaredFields(); // 取得drawable下的全部属性
// 循环取得的属性,以pic开头的都是要显示的图片,保存到list里面
for (Field field : fields) {
if (field.getName().startsWith("pic")) {
Map<String, Integer> map = new HashMap<String, Integer>();
try {
map.put("image", field.getInt(R.drawable.class));
} catch (Exception e) {
e.printStackTrace();
}
mList.add(map);
}
}
mSimpleAdapter = new SimpleAdapter(this, mList, R.layout.gallery_item,
new String[] { "image" }, new int[] { R.id.image });
} @Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
@SuppressWarnings("unchecked")
Map<String, Integer> map = (Map<String, Integer>) parent.getAdapter()
.getItem(position);
mImageSwitcher.setImageResource(map.get("image"));
} @Override
public View makeView() {
ImageView imageView = new ImageView(this);
imageView.setBackgroundColor(0xFFFFFFFF);
// 设置居中对齐
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.setLayoutParams(new ImageSwitcher.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
return imageView;
}
}

Android_Gallery(画廊)的更多相关文章

  1. Android ViewPager打造3D画廊

    本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台原创首发. 网上有很多关于使用Gallery来打造3D画廊的博客,但是在关于Gallery的官方说法中表明: This cl ...

  2. Carousel 旋转画廊特效的疑难杂症

    疑难杂症 该画廊特效的特点就是前后元素有层级关系. 我想很多人应该看过或者用过这个插件carousel.js,网上也有相关的教程.不知道这个插件的原型是哪个,有知道的朋友可以告诉我. 该插件相对完美, ...

  3. Sharepoint页面项目展示画廊纯前端实现,后端用list/library简单维护

    需求背景: Sharepoint页面项目展示画廊.图片+文字,要求图片与文字用Sharepoint Library维护,然后在sharepoint页面上被调用,生成项目展示画廊. 解决方案(纯前端), ...

  4. 25个最佳的 WordPress Gallery 画廊插件

    WordPress 画廊插件最适合用于作品展示网站,特别对于那些想以一个奇特的,现代的方式展示他们作品的摄影师.如果你想为你安装 WordPress Gallery 插件,那么下面的是你想要的. 本文 ...

  5. Android -- 使用ViewPager实现画廊效果

    1,今天在微信推送文章看到实现画廊效果,感觉挺不错的,就来写写试试,先来看一下效果图: 上面的效果基本上可以用两个功能点来包含:ViewPager的切换动画.ImageView的倒影的实现 嗯,先来将 ...

  6. baguetteBox.js响应式画廊插件(纯JS)

    baguetteBox.js baguetteBox.js 是一个简单和易于使用lightbox纯JavaScript脚本,拥有图像放大缩小并带有相应的CSS3过度,并能在触摸屏等设备上完美展示. D ...

  7. PS网页设计教程XXIX——如何在PS中设计一个画廊布局

    作为编码者,美工基础是偏弱的.我们可以参考一些成熟的网页PS教程,提高自身的设计能力.套用一句话,“熟读唐诗三百首,不会作诗也会吟”. 本系列的教程来源于网上的PS教程,都是国外的,全英文的.本人尝试 ...

  8. Gallery 图片画廊

    Gallery 图片画廊 学习网址http://amazeui.org/widgets/gallery?_ver=2.x

  9. Android 高级UI设计笔记15:HorizontalScrollView之 实现画廊式图片浏览器

    1. HorizontalScrollView 本来,画廊式的图片浏览器,使用Android中的Gallery就能轻松完成,但是Google说Gallery每次切换图片时都要新建视图,造成太多的资源浪 ...

随机推荐

  1. 在jquery中应该使用prop方法来获取和设置checked属性,不应该使用attr。

    在jquery中应该使用prop方法来获取和设置checked属性,不应该使用attr. $("#checkAll").prop("checked", true ...

  2. Shell test命令(Shell [])详解,附带所有选项及说明

    test 是 Shell 内置命令,用来检测某个条件是否成立.test 通常和 if 语句一起使用,并且大部分 if 语句都依赖 test. test 命令有很多选项,可以进行数值.字符串和文件三个方 ...

  3. SpringBoot中使用Scheduling执行定时任务

    SpringBoot自带的 Schedule,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多 以下任务都是在单线程下执行的 第一步 创建SpringBoot项目 第二步 外汇 ...

  4. thinkphp sql解析缓存

    除了查询缓存之外,ThinkPHP还支持SQL解析缓存,因为ThinkPHP的ORM机制,所有的SQL都是动态生成的,然后由数据库驱动执行. 直线电机厂家 所以如果你的应用有大量的SQL查询需求,那么 ...

  5. 在DELPHI中显示GIF动画

    想没想过在DELPHI中显示GIF动画?Delphi的用户是非常幸运的,因为有免费控件可以使用.最著名的控件是Anders Melander编写的TGifImage,并提供完整的源程序.它原来的主页是 ...

  6. Oracle sql判断一个字段是否全数字 或含有中文

    update (select length(t.name), t.* -- name,length(name) from g_enterprise_info t where nvl2(translat ...

  7. HashMap底层实现原理及面试问题

    ①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象.当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算h ...

  8. 随笔-ansible-1

    系统下所有的操作,从运维操作角度划分为两类: 1.文件传输 2.命令执行 系统下所有的操作,从自动化工作类型角度划分为: 1.应用部署 2.配置管理 3.任务流编排 使用root生成默认的秘钥对: # ...

  9. shell对比两个目录中有哪些文件不同

    参考:https://www.cnblogs.com/liyuchuan/p/10756066.html 目录结构: /data/dir1 subdir/ subfile /data/dir2 sub ...

  10. 生产环境Docker部署ELK跨区访问kafka不通问题的解决

    由于分布式系统的日志集中采集的需求非常强烈,我们组通过调研和实践搭建了一套基于Docker的日志收集系统Amethyst. 我们首先在测试环境搭建了一套基于Docker swarm集群的ELK分布式环 ...