转: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. JFinal教程

    自学JFinal总结 前言:每次搭建ssm框架时,就像搬家一样,非常繁杂,并且还容易出错.正好了解到JFinal极简,无需配置即可使用,在这里记录下学习的过程. 感谢:非常感谢此网站发布的教程,非常详 ...

  2. MySQL高可用配置(主从复制)

    主从复制包含两个步骤: 在 master 主服务器(组)上的设置,以及在 slave 从属服务器(组)上的设置. 环境: MASTER: 192.168.155.101SLAVE: 192.168.1 ...

  3. JRebel安装部署,激活

    1.安装部署 2.激活 去官网获得激活码,首先进行注册,之后获得激活码 官网:https://jrebel.com/software/jrebel/trial/getkey/ 查看是否激活

  4. TTreeView、TTreeNodes和TTreeNode

    TreeView是Delphi中使用频率比较高的一个控件,虽然使用次数很多,但总结不够.借着这次做GDW原型的机会总结一下,写的过程中也会参考网上的博文. TTreeView.TTreeNodes和T ...

  5. 27 和为S的两个数字

    0 引言 题目描述:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 1 抽象问题具体化 举例: 序列为{1,2,3,4 ...

  6. cdq分治·三维偏序问题

    转载自FlashHu大佬的博客CDQ分治总结(CDQ,树状数组,归并排序),在讲述部分有部分删改,用了自己的代码 CDQ分治的思想 CDQ分治是基于时间的离线分治算法.这一类分治有一个重要的思想——用 ...

  7. NX二次开发-uc1600字符串对话框

    NX9+VS2012 #include <uf.h> #include <uf_ui.h> UF_initialize(); char* cue = "输入框&quo ...

  8. 6.RabbitMQ Linux安装

    RabbitMQ在Linux上安装,需要很多依赖库,如何不能解决依赖库德版本问题,可能会比较麻烦,最好结合Yum进行安装,我这里使用的Linux环境是64位CentOS6.2 ,使用Yum源是阿里云的 ...

  9. xslt数值的函数与xslt字符串函数

    以下是xslt数值的函数与xslt字符串函数的说明与参考示例. 1.xslt数值的函数:(1)fn:number(arg) 返回参数的数值.参数可以是布尔值.字符串或节点集. 示例:<xsl:v ...

  10. 配置Dubbo Demo遇到的坑之一---找不到dubbo.xsd文件

    原文地址:https://blog.csdn.net/qq_36654870/article/details/80603302 1.dubbo.xsd文件不能读取 因为阿里http://code.al ...