android galley实现画廊效果
Android之ImageSwitcher,Gallery用法
今天在做一个软件界面时用到了ImageSwitcher和Gallery控件,在看API时,感觉上面的例子讲的不是很具体,效率并不高。在这里我就以一个图片浏览功能来具体说明这两个控件的用法。
首先看运行效果:
在这里图片我用的是API中的图片。先说下这个图片浏览的功能吧,首先,它要实现图片的切换,当点击上面的小图时,下方会出现对象的大图,其次就是实现上图中最上面的样式,即一个图片和一个文本。下来我们还要实现起始位置居中,滑动小图的速率的控制,最上面小图的无限循环等功能。下面我就将具体实现代码附下,供大家参考。
main.xml:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <cn.yj3g.gallery.MyGallery android:id="@+id/gallery" android:background="#55000000" android:layout_width="match_parent" android:layout_height="80dp" android:gravity="center_vertical" android:spacing="2dp" /> <ImageSwitcher android:id="@+id/switcher" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" /> </LinearLayout>

在上面我是自定义视图,引用自己定义的一个Gallery,在这个Gallery中我重新设置的滑动的速率,让它滑动速度放慢,下面是我自定义的Gallery
代码:
MyGallery.java:
下面是在定义gallery布局文件的代码:
gallery_item.xml:
下面就是核心实现代码:
PictrueChangeActivity:

package cn.yj3g.PictrueChange; import java.util.HashMap; import android.app.Activity; import android.content.Context; import android.content.res.TypedArray; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.animation.AnimationUtils; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.Gallery; import android.widget.Gallery.LayoutParams; import android.widget.ImageSwitcher; import android.widget.ImageView; import android.widget.TextView; import android.widget.ViewSwitcher; public class PictrueChangeActivity extends Activity implements AdapterView.OnItemClickListener, ViewSwitcher.ViewFactory { //定义ImageSwitcher类对象 private ImageSwitcher mSwitcher; //文本资源 private String[] titles = {"标题1","标题2","标题3","标题4","标题5","标题6","标题7","标题8",}; //大图资源 private Integer[] mThumbIds = { R.drawable.sample_0, R.drawable.sample_1, R.drawable.sample_2, R.drawable.sample_3, R.drawable.sample_4, R.drawable.sample_5, R.drawable.sample_6, R.drawable.sample_7 }; //大图对应的小图资源 private Integer[] mImageIds = { R.drawable.sample_thumb_0, R.drawable.sample_thumb_1, R.drawable.sample_thumb_2, R.drawable.sample_thumb_3, R.drawable.sample_thumb_4, R.drawable.sample_thumb_5, R.drawable.sample_thumb_6, R.drawable.sample_thumb_7 }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //设置窗体无标题 requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); mSwitcher = (ImageSwitcher) findViewById(R.id.switcher); mSwitcher.setFactory(this); //设置图片的滑动效果 mSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in)); mSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out)); Gallery g = (Gallery) findViewById(R.id.gallery); //设置Gallery的适配器 g.setAdapter(new ImageAdapter(this, mThumbIds.length)); //Gallery中每个条目的点击事件监听 g.setOnItemClickListener(this); //设置默认其实位置为第二张图片 g.setSelection(1); } public void onItemSelected(AdapterView parent, View v, int position, long id) { mSwitcher.setImageResource(mThumbIds[position % mImageIds.length]); } public void onNothingSelected(AdapterView parent) { } @Override public View makeView() { ImageView i = new ImageView(this); i.setBackgroundColor(0xFF000000); i.setScaleType(ImageView.ScaleType.FIT_CENTER); i.setLayoutParams(new ImageSwitcher.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); return i; } //Gallery的适配器 public class ImageAdapter extends BaseAdapter { private int mGalleryItemBackground; //定义map存储划过的位置 private HashMap<Integer, View> mViewMaps; private int mCount; //定义布局加载器 private LayoutInflater mInflater; public ImageAdapter(Context c, int count) { this.mCount = count; mViewMaps = new HashMap<Integer, View>(count); mInflater = LayoutInflater.from(PictrueChangeActivity.this); //定义图片的背景样式 TypedArray a = obtainStyledAttributes(R.styleable.Gallery1); mGalleryItemBackground = a.getResourceId( R.styleable.Gallery1_android_galleryItemBackground, 0); //定义可以重复使用.可回收 a.recycle(); } public int getCount() { //设置循环的次数 return Integer.MAX_VALUE; } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { Log.v("TAG", "getView() position=" + position + " convertView=" + convertView); View viewGroup = mViewMaps.get(position%mCount); ImageView imageView = null; TextView textView = null; if(viewGroup==null) { viewGroup = mInflater.inflate(R.layout.gallery_item, null); imageView = (ImageView) viewGroup.findViewById(R.id.item_gallery_image); textView = (TextView) viewGroup.findViewById(R.id.item_gallery_text); imageView.setBackgroundResource(mGalleryItemBackground); mViewMaps.put(position%mCount, viewGroup); imageView.setImageResource(mImageIds[position % mImageIds.length]); textView.setText(titles[position % mImageIds.length]); } return viewGroup; } } //记录当前位置 private int curruntPos = -1; @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (curruntPos == position) { return; } else curruntPos = position; mSwitcher.setImageResource(mThumbIds[position % mThumbIds.length]); } }

这里要加载一个背景文件,放在values目录下,文件名为attrs.xml,代码如下:

<?xml version="1.0" encoding="utf-8"?> <resources> <!-- These are the attributes that we want to retrieve from the theme in view/Gallery1.java --> <declare-styleable name="Gallery1"> <attr name="android:galleryItemBackground" /> </declare-styleable> </resources>

这样显示的图片就有一个相框一样的边框。
在上面的代码中,和API中不同的是做了四点改进:
1.实现滑动可以无限滑动,就是在上面的getCount()中,返回的是一个Integer.MAX_VALUE,这样可以做到无限滑动。
2.提高在滑动时大图的显示效率。就是在上面,我自定义了一个Map,将滑动过的位置全部记录下来,等到下次滑到这个位置时,就不必再去加载图片了,类似于缓存。这样提高了效率。
3.在点击事件中,如果重复点击同一张图片,不会去加载图片。在这里我设置了一个标记位置,如果标记位置和当前位置一样,那就不去加载图片。
4.设置起始位置为第二位,这样初始界面比较美观,显示的图片两边都有图片。
android galley实现画廊效果的更多相关文章
- Android -- 使用ViewPager实现画廊效果
1,今天在微信推送文章看到实现画廊效果,感觉挺不错的,就来写写试试,先来看一下效果图: 上面的效果基本上可以用两个功能点来包含:ViewPager的切换动画.ImageView的倒影的实现 嗯,先来将 ...
- Android画廊效果
Android画廊效果 前言:Gallery是一个内部元素控件,可以水平滚动,并且可以把当前选择的子元素定位在它中心的布局组件:画廊Gallery一般用来显示可左右移动图片的列表(具体请看实例). 效 ...
- Android 画廊效果之ViewPager显示多个图片
首先来看下面的效果: 从上面的图片可以看到,当添加多张图片的时候,能够在下方形成一个画廊的效果,我们左右拉动图片来看我们添加进去的图片,效果是不是好了很多呢?下面来看看怎么实现吧! 上面的效果类似An ...
- 解决Android Graphical Layout 界面效果不显示
解决Android Graphical Layout 界面效果不显示 qq463431476
- android 的闪屏效果
android的闪屏效果,就是我们刚开始启动应用的时候弹出的界面或者动画,过2秒之后自动的跳转到主界面. 其实,实现这个效果很简单,使用Handler对象的postDelayed方法就可以实现.在这个 ...
- 兼容Android的水波纹效果
Android的水波纹效果只有高版本才有,我们希望自己的应用在低版本用低版本的阴影,高版本用水波纹,这怎么做呢?其实,只要分drawable和drawablev21两个文件夹就好了. 普通情况下的se ...
- 【转】(转)【Android】Paint的效果研究
转自:http://wpf814533631.iteye.com/blog/1847661 (转)[Android]Paint的效果研究 博客分类: android 在Paint中有很多的属性可以 ...
- Android仿IOS回弹效果 ScrollView回弹 总结
Android仿IOS回弹效果 ScrollView回弹 总结 应项目中的需求 须要仿IOS 下拉回弹的效果 , 我在网上搜了非常多 大多数都是拿scrollview 改吧改吧 试了一些 发现总 ...
- Android实现左右滑动效果
本示例演示在Android中实现图片左右滑动效果. 关于滑动效果,在Android中用得比较多,本示例实现的滑动效果是使用ViewFlipper来实现的,当然也可以使用其它的View来实现.接下来 ...
随机推荐
- mysql之连接查询小作业
#数据准备drop table if exists class;create table class( class_no int(2) unsigned zerofill primary key ...
- ES6(正则扩展)
ES6中正则的扩展 正则新增特性 一.构造函数的变化 1.ES5中new一个正则对象方法 (一行中2个参数,二行中1个参数) (第一行中的第一个参数必须是字符串) 2.ES6中新增一种方法(构造函数) ...
- Centos常用命令之:压缩与解压缩
在Linux中,压缩文件的扩展名主要是:[*.tar,*.tar.gz,*.tgz,*.gz,*.Z,*.bz2],虽然,我们知道,在LInux中,文件的扩展名没有什么作用,但是由于在Linux中支持 ...
- [USACO 03FEB]Farm Tour
Description When FJ's friends visit him on the farm, he likes to show them around. His farm comprise ...
- 51nod1295 XOR key(可持久化trie)
1295 XOR key题目来源: HackerRank基准时间限制:1.5 秒 空间限制:262144 KB 分值: 160 难度:6级算法题 给出一个长度为N的正整数数组A,再给出Q个查询,每个查 ...
- 「LibreOJ NOIP Round #1」旅游路线
Description T 城是一个旅游城市,具有 nnn 个景点和 mmm 条道路,所有景点编号为 1,2,...,n1,2,...,n1,2,...,n.每条道路连接这 nnn 个景区中的某两个景 ...
- ●BZOJ 1767 [Ceoi2009]harbingers
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1767 题解: 斜率优化DP,单调栈,二分 定义 DP[i] 表示从 i 节点出发,到达根所花 ...
- 习题 7-3 uva211
题意:给你28个多米勒牌,要求刚好铺满一个7x8的图,输出所有答 案.每个牌只能使用一次 思路: 对每个位置分别搜索其右边 和 下边. 但是在中途,细节上有点问题.最开始想的是搜到最后一个点输出答案, ...
- [NOI2011]
来自FallDream的博客,未经允许,请勿转载,谢谢. 省选完挂.但是善良的教练今天丢了一套NOI2011给我们训练 6道题233(虽然一道题做过了,一道题普及组的都会,就算是4道吧) 熬了一天,总 ...
- SparkSQL——用之惜之
SparkSql作为Spark的结构化数据处理模块,提供了非常强大的API,让分析人员用一次,就会为之倾倒,为之着迷,为之至死不渝.在内部,SparkSQL使用额外结构信息来执行额外的优化.在外部,可 ...