Gallery 是Android官方提供的一个View容器类,继承于AbsSpinner类,用于实现页面滑动效果。

从上面的继承关系可以看出,AbsSpinner类继承自AdapterView,因此我们可以自定义实现Adapter,来填充Gallery容器的数据。

本示例通过自己实现一个Adapter,来填充Gallery容器的图片数据,首先看效果:

 

Activity

  1. import android.app.Activity;
  2. import android.os.Bundle;
  3. import android.view.View;
  4. import android.widget.AdapterView;
  5. import android.widget.Gallery;
  6. import android.widget.Toast;
  7. public class GalleryActivity extends Activity {
  8. @Override
  9. public void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.main);
  12. Gallery gallery = (Gallery) findViewById(R.id.gallery);
  13. gallery.setAdapter(new ImageAdapter(this));         // gallery添加ImageAdapter图片资源
  14. gallery.setOnItemClickListener(listener);           // gallery设置点击图片资源的事件
  15. }
  16. AdapterView.OnItemClickListener listener = new AdapterView.OnItemClickListener() {
  17. @Override
  18. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  19. Toast.makeText(GalleryActivity.this, "图片 " + (position + 1), Toast.LENGTH_SHORT).show();
  20. }
  21. };
  22. }

ImageAdapter.java

  1. import android.content.Context;
  2. import android.view.View;
  3. import android.view.ViewGroup;
  4. import android.widget.BaseAdapter;
  5. import android.widget.Gallery;
  6. import android.widget.ImageView;
  7. public class ImageAdapter extends BaseAdapter {
  8. private Context mContext;
  9. //  图片数组源
  10. private Integer[] imgs = { R.drawable.img1, R.drawable.img2,
  11. R.drawable.img3, R.drawable.img4, R.drawable.img5,
  12. R.drawable.img6, R.drawable.img7};
  13. public ImageAdapter(Context c) {
  14. mContext = c;
  15. }
  16. @Override
  17. public int getCount() {
  18. return imgs.length;
  19. }
  20. // 获取图片位置
  21. @Override
  22. public Object getItem(int position) {
  23. return imgs[position];
  24. }
  25. // 获取图片ID
  26. @Override
  27. public long getItemId(int position) {
  28. return position;
  29. }
  30. @Override
  31. public View getView(int position, View convertView, ViewGroup parent) {
  32. ImageView imageview = new ImageView(mContext);
  33. imageview.setImageResource(imgs[position]);
  34. imageview.setLayoutParams(new Gallery.LayoutParams(240, 120));      // 设置布局 图片120×120显示
  35. imageview.setScaleType(ImageView.ScaleType.CENTER);             // 设置显示比例类型(不缩放)
  36. return imageview;
  37. }
  38. }

main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="wrap_content"
  5. android:orientation="vertical">
  6. <!-- 文字居中显示  android:gravity -->
  7. <!-- 控件居中显示  android:layout_gravity -->
  8. <TextView
  9. android:id="@+id/tv"
  10. android:layout_width="fill_parent"
  11. android:layout_height="wrap_content"
  12. android:gravity="center"
  13. android:layout_gravity="center"
  14. android:layout_marginTop="50dip"
  15. android:textColor="#ffff0000"
  16. android:textSize="30sp"
  17. android:text="Gallery Test"/>
  18. <Gallery
  19. android:id="@+id/gallery"
  20. android:layout_width="fill_parent"
  21. android:layout_height="wrap_content"
  22. android:layout_marginTop="10dip"
  23. android:layout_below="@id/tv" />
  24. </RelativeLayout>

源码下载

示例分析:

1、ImageAdapter中,是继承BaseAdapter自定义实现的,重载了BaseAdapter的几个虚方法,其中重要的有两个

getCount(): 返回资源的大小(总长度)

getView(int position, View convertView, ViewGroup parent) : 返回当前显示的资源(获取焦点)

2、GalleryActivity中,通过gallery.setAdapter(imgAdapter); 设置资源,然后设置gallery的点击监听事件。

3、main.xml中,是布局文件,显示一个TextView和Gallery,RelativeLayout是相对布局

总体来说,Gallery 上述的示例很简单,结构比较清晰,能够满足基本的应用。

Gallery 高级应用

上面的示例,仅仅是最简单的Gallery应用,如果我们想做的更酷、更炫的效果:

1、Gallery 图片显示能够循环播放,即向右滑到左侧第一张图片后,需要接着显示最后一张图片;向左滑到最后一张图片后,需要接着显示第一张图片,往复不间断显示的循环效果。

2、选中图片高亮,未选中图片阴影,更加突出当前获取焦点的选中图片

3、区分“点击”与“选中”图片事件的区别和适用场景

效果1 —— 高亮显示

没有选中,在GalleryActivity中,设置gallery.setUnselectedAlpha(0.3f); 透明度为0.3


中,在ImageAdapter的getView(int position, View convertView, ViewGroup
parent)中,设置imageview.setBackgroundColor(Color.alpha(1)); 背景色为1

效果2 —— 循环播放

原理:Gallery循环播放的原理,跟循环链表的思想一样,首尾item连接都是通过“取余”实现

修改1、ImageAdapter中的getCount() 方法中,修改返回值为无穷大 return Integer.MAX_VALUE;


改2、ImageAdapter中的getView(int position, View convertView, ViewGroup
parent)方法中,设置imageview.setImageResource(imgs[position % imgs.length]);
取余

修改3、GalleryActivity中,设置gallery.setSelection(imgAdapter.imgs.length * 100); 使gallery显示图片的位置从中间开始显示(即imgAdapter.imgs.length * 100)

修改解释:

修改1,主要是为了是循环接近无限往复循环,使position无限大,循环在实践应用上不容易结束(理论上会结束,即2^31-1约20亿次循环后)

修改2,通过取余,使图片能够重复利用并显示

修改3,由于起始位置如果是0,则向右滑动左侧将无法循环(此时左侧将为-1,超出了imgs[]数组的下边界),因此开始应设置起始位置为imgAdapter.imgs.length的整数倍

效果3 —— “点击”和“选中”事件

1、点击事件OnItemClickListener,是需要用手点击才触发,滑动时不触发

2、选中事件OnItemSelectedListener,是当图片滑到屏幕正中,则视为自动选中,在滑动的过程中会触发

适用场景:

1、点击事件OnItemClickListener,是在确定要选中该项时,才点击进行逻辑处理

2、选中事件OnItemSelectedListener,可以用来提醒用户,当前获取焦点的项,如果确认为该项则需要点击OnItemClickListener后,进行下一步的逻辑处理

高级应用完整代码:

Activity

  1. import android.app.Activity;
  2. import android.os.Bundle;
  3. import android.view.Gravity;
  4. import android.view.View;
  5. import android.widget.AdapterView;
  6. import android.widget.Gallery;
  7. import android.widget.Toast;
  8. public class GalleryActivity extends Activity {
  9. private ImageAdapter imgAdapter = null;         // 声明图片资源对象
  10. private Gallery gallery = null;
  11. @Override
  12. public void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.main);
  15. gallery = (Gallery) findViewById(R.id.gallery);
  16. imgAdapter = new ImageAdapter(this);
  17. gallery.setAdapter(imgAdapter);                     // 设置图片资源
  18. gallery.setGravity(Gravity.CENTER_HORIZONTAL);      // 设置水平居中显示
  19. gallery.setSelection(imgAdapter.imgs.length * 100);     // 设置起始图片显示位置(可以用来制作gallery循环显示效果)
  20. gallery.setOnItemClickListener(clickListener);          // 设置点击图片的监听事件(需要用手点击才触发,滑动时不触发)
  21. gallery.setOnItemSelectedListener(selectedListener);        // 设置选中图片的监听事件(当图片滑到屏幕正中,则视为自动选中)
  22. gallery.setUnselectedAlpha(0.3f);                   // 设置未选中图片的透明度
  23. gallery.setSpacing(40);                         // 设置图片之间的间距
  24. }
  25. // 点击图片的监听事件
  26. AdapterView.OnItemClickListener clickListener = new AdapterView.OnItemClickListener() {
  27. @Override
  28. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  29. Toast.makeText(GalleryActivity.this, "点击图片 " + (position + 1), 100).show();
  30. }
  31. };
  32. // 选中图片的监听事件
  33. AdapterView.OnItemSelectedListener selectedListener = new AdapterView.OnItemSelectedListener() {
  34. @Override
  35. public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
  36. Toast.makeText(GalleryActivity.this, "选中图片 " + (position + 1), 20).show();
  37. }
  38. @Override
  39. public void onNothingSelected(AdapterView<?> arg0) {
  40. }
  41. };
  42. }

ImageAdapter.java

    1. import android.content.Context;
    2. import android.graphics.Color;
    3. import android.view.View;
    4. import android.view.ViewGroup;
    5. import android.widget.BaseAdapter;
    6. import android.widget.Gallery;
    7. import android.widget.ImageView;
    8. public class ImageAdapter extends BaseAdapter {
    9. private Context mContext;
    10. //  图片数组源
    11. public Integer[] imgs = { R.drawable.img1, R.drawable.img2,
    12. R.drawable.img3, R.drawable.img4, R.drawable.img5,
    13. R.drawable.img6, R.drawable.img7};
    14. public ImageAdapter(Context c) {
    15. mContext = c;
    16. }
    17. @Override
    18. public int getCount() {
    19. return Integer.MAX_VALUE;
    20. }
    21. // 获取图片位置
    22. @Override
    23. public Object getItem(int position) {
    24. return imgs[position];
    25. }
    26. // 获取图片ID
    27. @Override
    28. public long getItemId(int position) {
    29. return position;
    30. }
    31. @Override
    32. public View getView(int position, View convertView, ViewGroup parent) {
    33. ImageView imageview = new ImageView(mContext);
    34. imageview.setImageResource(imgs[position % imgs.length]);
    35. imageview.setLayoutParams(new Gallery.LayoutParams(200, 94));       // 设置布局 图片120×120显示
    36. imageview.setScaleType(ImageView.ScaleType.CENTER);             // 设置显示比例类型
    37. imageview.setBackgroundColor(Color.alpha(1));
    38. return imageview;
    39. }
    40. }

Android 滑动效果入门篇(二)—— Gallery的更多相关文章

  1. Android 滑动效果入门篇(一)—— ViewFlipper

    ViewFilpper 是Android官方提供的一个View容器类,继承于ViewAnimator类,用于实现页面切换,也可以设定时间间隔,让它自动播放.又ViewAnimator继承至于Frame ...

  2. Android 滑动效果进阶篇(六)—— 倒影效果

    上篇介绍了使用Animation实现3D动画旋转翻页效果,现在介绍图片倒影实现,先看效果图 本示例主要通过自定义Gallery和ImageAdapter(继承自BaseAdapter)实现 1.倒影绘 ...

  3. Android 滑动效果基础篇(四)—— Gallery + GridView

    Android系统自带一个GridView和Gallery两个控件,GridView网格显示,Gallery单个浏览,两者结合起来可以真正实现Gallery浏览图片效果. 本示例通过GridView和 ...

  4. Android 滑动效果基础篇(三)—— Gallery仿图像集浏览

    Android系统自带一个Gallery浏览图片的应用,通过手指拖动时能够非常流畅的显示图片,用户交互和体验都很好. 本示例就是通过Gallery和自定义的View,模仿实现一个仿Gallery图像集 ...

  5. Android 滑动效果高级篇(八)—— 自定义控件

    自定义控件,较常用View.ViewGroup.Scroller三个类,其继承关系如下: 本示例自定义控件,实现一个Gallery效果,并添加了一个显示View个数和位置的bar条,效果图: 自定义控 ...

  6. Android 滑动效果进阶篇(五)—— 3D旋转

    前面介绍了利用Android自带的控件,进行滑动翻页制作效果,现在我们通过代码实现一些滑动翻页的动画效果. Animation实现动画有两个方式:帧动画(frame-by-frame animatio ...

  7. Android 滑动效果高级篇(七)—— 华丽翻页效果

    By 何明桂(http://blog.csdn.net/hmg25) 转载请注明出处 之前看到像ipad上的ibook的模拟书籍翻页的特效感觉很炫,在android上也有像laputa和ireader ...

  8. 十六、Android 滑动效果汇总

    Android 滑动效果入门篇(一)—— ViewFlipper Android 滑动效果入门篇(二)—— Gallery Android 滑动效果基础篇(三)—— Gallery仿图像集浏览 And ...

  9. Android 滑动效果汇总

    Android 滑动效果入门篇(一)—— ViewFlipper Android 滑动效果入门篇(二)—— Gallery Android 滑动效果基础篇(三)—— Gallery仿图像集浏览 And ...

随机推荐

  1. [Everyday Mathematics]20150111

    设 $n$ 阶方阵 $A=(\al_1,\cdots,\al_n)$ 非奇异, $B=(0,\al_2,\cdots,\al_n)$. 试证: $BA^{-1}$, $A^{-1}B$ 的秩均为 $n ...

  2. (转载) 数组a[]={3,5,2,4,1,8},要求从a中找出所有“和”等于10的子集

    背包问题.     不过就这道题目本身而言,由于集合a中只要6个元素,而不是成千上万,所以可以使用更直观的办法:     只要你能通过程序给出数组a中元素所组成的集合的所有的子集合(幂集),那么只需在 ...

  3. Filezilla 多目录的访问设置

    [转:http://hi.baidu.com/yangjie312/blog/item/125a8405423d896d03088171.html] 设置好主目录之后,点击“Add”按钮可以把其余的目 ...

  4. HDU-4035 Maze

    http://acm.hdu.edu.cn/showproblem.php?pid=4035 树上的概率dp.   Maze Time Limit: 2000/1000 MS (Java/Others ...

  5. C++程序设计之结构体,共用体,枚举和typedef

    [1]结构体的基本功 注意结构体里面可以有很多东西,可以结构体里面包含结构体 #include<iostream> using namespace std; struct Date { i ...

  6. Min Edit Distance

    Min Edit Distance ----两字符串之间的最小距离 PPT原稿参见Stanford:http://www.stanford.edu/class/cs124/lec/med.pdf Ti ...

  7. fork之后发生了什么(基于3.16-rc4)

    在linux c编程中,我们可以使用fork,vfork,clone三个系统调用来创建子进程.下面我们先分析下fork系统调用的实现原理.代码如下(kernel/fork.c): #ifdef __A ...

  8. iOS本地数据存取

    应用沙盒 1)每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒 2)应用沙盒的文件系统目录,如下图所示(假设应用的名称 ...

  9. 判断滑动方向UITableView

    CGFloat lastContentOffset;  //ScoreView 滑动位置 -(void)scrollViewWillBeginDragging:(UIScrollView*)scrol ...

  10. 159. Longest Substring with At Most Two Distinct Characters

    最后更新 二刷 08-Jan-17 回头看了下一刷的,用的map,应该是int[256]的意思,后面没仔细看cuz whatever I was doing at that time.. wasnt ...