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. POJ 2386 Lake Counting

    Lake Counting Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 28966   Accepted: 14505 D ...

  2. java文件过滤器

    java中有一个FilenameFilter的接口,能够过滤得到指定类型的文件或者目录,其中必须重写accept(File file,String path)方法 public class DirFi ...

  3. Hadoop Configuration

    Configuration的主要是加载配置文件,并储存在properties中. 细节内容不重复了,主要参考Hadoop技术内幕,Hadoop源代码,以及: http://blog.csdn.net/ ...

  4. 在Ubuntu下卸载Apache

    卸载Apache 转自:http://blog.csdn.net/chmo2011/article/details/7026384 1. 删除apache 代码: $ sudo apt-get --p ...

  5. hdu 3336 count the string(KMP+dp)

    题意: 求给定字符串,包含的其前缀的数量. 分析: 就是求所有前缀在字符串出现的次数的和,可以用KMP的性质,以j结尾的串包含的串的数量,就是next[j]结尾串包含前缀的数量再加上自身是前缀,dp[ ...

  6. HDU5779 Tower Defence (BestCoder Round #85 D) 计数dp

    分析(官方题解): 一点感想:(这个题是看题解并不是特别会转移,当然写完之后看起来题解说得很清晰,主要是人太弱 这个题是参考faebdc神的代码写的,说句题外话,很荣幸高中和faebdc巨一个省,虽然 ...

  7. SSH超时断开(ClientAliveInterval和ClientAliveCountMax )的使用

    有 2个方法 1 配置服务器 打开 /etc/ssh/sshd_config 找到 ClientAliveInterval 参数,如果没有就自己加一行 数值是秒,比如你设置为300,就是5分钟. Cl ...

  8. ASP.NET将word文档转换成pdf的代码

    一.添加引用 using Microsoft.Office.Interop.Word; 二.转换方法 1.方法 C# 代码 /// <summary> /// 把Word文件转换成pdf文 ...

  9. support vector regression与 kernel ridge regression

    前一篇,我们将SVM与logistic regression联系起来,这一次我们将SVM与ridge regression(之前的linear regression)联系起来. (一)kernel r ...

  10. MFC最大化显示任务栏

    今天2016-07-23   13:26:24又来处理最大化时,窗口任务栏隐藏的bug. 前面已经用了 MINMAXINFO的结构体: typedef struct { POINT ptReserve ...