转: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. D2D

    layout category title permalink posts_by_category D2D 渲染相关 /post/D2D.html

  2. c++ const (转)

    在C++的类定义里面,可以看到类似下面的定义: class List { private: Node * p_head; int length; …… Public: int GetLength () ...

  3. 请问在一个固定div大小里面,图片右移动,超出div容器的图片给隐藏,怎么设定?

    如图,让图片移动,溢出的图片被隐藏,怎么设置? overflow: hidden;

  4. DOM——事件详解

    事件 事件:触发-响应机制 事件三要素 事件源:触发(被)事件的元素 事件名称: click 点击事件 事件处理程序:事件触发后要执行的代码(函数形式) 事件的基本使用  var box = docu ...

  5. 小程序生成海报:通过 json 配置方式轻松制作一张海报图

    背景 由于我们无法将小程序直接分享到朋友圈,但分享到朋友圈的需求又很多,业界目前的做法是利用小程序的 Canvas 功能生成一张带有二维码的图片,然后引导用户下载图片到本地后再分享到朋友圈.而小程序 ...

  6. Java设计模式简单总结

    1.单例模式:在应用程序整个生命周期中,单例类的实例只有一个,并且会自动实例化.单例类的构造方法必须为私有,并且提供一个全局访问点 public class Test { private Test() ...

  7. js 事件驱动原理

    还记得当初学JAVA-GUI编程时学习过事件监听机制,此时再学习JavaScript中的事件驱动机制,不免简单.当初学习时也是画过原理图,所以从原理图开始吧! js是采用事件驱动(event-driv ...

  8. Elasticsearch(Transport Client)常用操作

    这里描述操作elasticsearch采用TransportClient这种方式,官方明确表示在ES 7.0版本中将弃用TransportClient客户端,且在8.0版本中完全移除它. 记录一些常用 ...

  9. 通过Python SDK 获取tushare数据

    导入tushare import tushare as ts 这里注意, tushare版本需大于1.2.10 设置token ts.set_token('your token here') 以上方法 ...

  10. WinCE下的第二个窗口程序

    MFC写的,有些简陋,但是还是感觉不错,一个小小的计算器,各个方面的功能都完成了 但是唯独那个CEdit里面的文字不能右对齐.那个扩展风格用不了