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

本示例通过GridView和Gallery两个控件,模仿实现一个完整的仿Gallery图像集的图片浏览效果。效果图如下:

1、GridView

首先,自定义一个GridImageAdapter图片适配器,用于填充GridView控件的图片

  1. public class GridImageAdapter extends BaseAdapter {
  2. private Context mContext;
  3. Drawable btnDrawable;
  4. public GridImageAdapter(Context context) {
  5. mContext = context;
  6. Resources resources = context.getResources();
  7. btnDrawable = resources.getDrawable(R.drawable.bg);
  8. }
  9. @Override
  10. public int getCount() {
  11. return ImageSource.mThumbIds.length;
  12. }
  13. @Override
  14. public Object getItem(int position) {
  15. return position;
  16. }
  17. @Override
  18. public long getItemId(int position) {
  19. return position;
  20. }
  21. @Override
  22. public View getView(int position, View convertView, ViewGroup parent) {
  23. ImageViewExt imageView;
  24. int space;
  25. if (convertView == null) {
  26. imageView = new ImageViewExt(mContext);
  27. if (imageCol == 5) {
  28. space = dm.heightPixels / imageCol - 6;
  29. imageView.setLayoutParams(new GridView.LayoutParams(space, space));
  30. } else {
  31. space = dm.widthPixels / imageCol - 6;
  32. imageView.setLayoutParams(new GridView.LayoutParams( space, space));
  33. }
  34. imageView.setAdjustViewBounds(true);
  35. imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);    // 缩放图片使其长和宽一样
  36. imageView.setPadding(3, 3, 3, 3);
  37. } else {
  38. imageView = (ImageViewExt) convertView;
  39. }
  40. imageView.setImageResource(ImageSource.mThumbIds[position]);
  41. return imageView;
  42. }
  43. }

然后,用GridImageAdapter填充GridView

  1. gridView = (GridView) findViewById(R.id.myGrid);
  2. gridImageAdapter = new GridImageAdapter(this);
  3. gridView.setAdapter(gridImageAdapter);
  4. gridView.setOnItemClickListener(listener); // 设置点击监听事件

最后,设置GridView控件的点击监听事件

  1. AdapterView.OnItemClickListener listener = new AdapterView.OnItemClickListener() {
  2. @Override
  3. public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) {
  4. Intent intent = new Intent();
  5. intent.setClass(GridViewActivity.this, GalleryActivity.class);
  6. intent.putExtra("position", position);
  7. startActivity(intent);
  8. }
  9. };

2、Gallery

完成了GridView的图片显示、监听事件后,现在点击图片,会启动一个Activity来显示当前点击的图片,此时显示图片的控件便是Gallery

首先,同GridView一样,自定义一个ImageAdapter图片适配器,用来填充Gallery

  1. public class ImageAdapter extends BaseAdapter {
  2. private Context mContext;
  3. private int mPos;
  4. public ImageAdapter(Context context) {
  5. mContext = context;
  6. }
  7. public void setOwnposition(int ownposition) {
  8. this.mPos = ownposition;
  9. }
  10. public int getOwnposition() {
  11. return mPos;
  12. }
  13. @Override
  14. public int getCount() {
  15. return ImageSource.mThumbIds.length;
  16. }
  17. @Override
  18. public Object getItem(int position) {
  19. mPos=position;
  20. return position;
  21. }
  22. @Override
  23. public long getItemId(int position) {
  24. mPos=position;
  25. return position;
  26. }
  27. @Override
  28. public View getView(int position, View convertView, ViewGroup parent) {
  29. mPos=position;
  30. ImageView imageview = new ImageView(mContext);
  31. imageview.setBackgroundColor(0xFF000000);
  32. imageview.setScaleType(ImageView.ScaleType.FIT_CENTER);
  33. imageview.setLayoutParams(new myGallery.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
  34. imageview.setImageResource(ImageSource.mThumbIds[position]);
  35. return imageview;
  36. }
  37. }

然后,用ImageAdapter填充Gallery

  1. myGallery  galllery = (myGallery) findViewById(R.id.mygallery);
  2. Intent intent = getIntent();
  3. position = intent.getIntExtra("position", 0);   // 获取GridViewActivity传来的图片位置position
  4. ImageAdapter imgAdapter=new ImageAdapter(this);
  5. galllery.setAdapter(imgAdapter);        // 设置图片ImageAdapter
  6. galllery.setSelection(position);        // 设置当前显示图片
  7. Animation an= AnimationUtils.loadAnimation(this,R.anim.scale );     // Gallery动画
  8. galllery.setAnimation(an);

此时,如果细心可以注意到,我们的Gallery也是自己定义的myGallery,具体定义如下:

  1. public class myGallery extends Gallery {
  2. boolean isFirst = false;
  3. boolean isLast = false;
  4. public myGallery(Context context) {
  5. super(context);
  6. }
  7. public myGallery(Context context, AttributeSet paramAttributeSet) {
  8. super(context, paramAttributeSet);
  9. }
  10. /** 是否向左滑动(true - 向左滑动; false - 向右滑动) */
  11. private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2) {
  12. return e2.getX() > e1.getX();
  13. }
  14. @Override
  15. public boolean onFling(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
  16. ImageAdapter ia = (ImageAdapter) this.getAdapter();
  17. int p = ia.getOwnposition();    // 获取当前图片的position
  18. int count = ia.getCount();      // 获取全部图片的总数count
  19. int kEvent;
  20. if (isScrollingLeft(e1, e2)) {
  21. if (p == 0 && isFirst) {
  22. Toast.makeText(this.getContext(), "已是第一页", Toast.LENGTH_SHORT).show();
  23. } else if (p == 0) {
  24. isFirst = true;
  25. } else {
  26. isLast = false;
  27. }
  28. kEvent = KeyEvent.KEYCODE_DPAD_LEFT;
  29. } else {
  30. if (p == count - 1 && isLast) {
  31. Toast.makeText(this.getContext(), "已到最后一页", Toast.LENGTH_SHORT).show();
  32. } else if (p == count - 1) {
  33. isLast = true;
  34. } else {
  35. isFirst = false;
  36. }
  37. kEvent = KeyEvent.KEYCODE_DPAD_RIGHT;
  38. }
  39. onKeyDown(kEvent, null);
  40. return true;
  41. }
  42. }

GalleryActivity的布局文件gallery.xml

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent"
    5. android:gravity="center"
    6. android:orientation="horizontal"
    7. android:padding="10dip" >
    8. <RelativeLayout
    9. android:layout_width="wrap_content"
    10. android:layout_height="wrap_content"
    11. android:background="#000000"
    12. android:padding="2dip" >
    13. <com.homer.gridgallery.myGallery
    14. android:id="@+id/mygallery"
    15. android:layout_width="fill_parent"
    16. android:layout_height="fill_parent"
    17. android:spacing="16dp" />
    18. </RelativeLayout>
    19. </LinearLayout>

Android 滑动效果基础篇(四)—— Gallery + GridView的更多相关文章

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

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

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

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

  3. Android 滑动效果入门篇(二)—— Gallery

    Gallery 是Android官方提供的一个View容器类,继承于AbsSpinner类,用于实现页面滑动效果. 从上面的继承关系可以看出,AbsSpinner类继承自AdapterView,因此我 ...

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

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

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

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

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

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

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

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

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

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

  9. Android 滑动效果汇总

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

随机推荐

  1. C#中常见的winform控件命名规范

    我们知道Button 常常简称为btn,那么Winform中的其它控件呢,这篇文章在C#的winform控件命名规范 的基础上对一些控件的名称的简称进行了整理. 1. 标准控件 NO. 控件类型简写 ...

  2. loadrunner 发送gzip压缩json格式(转)

    转:http://blog.csdn.net/gzh0222/article/details/7711281 使用java vuser实现,发送gzip压缩json格式. /* * LoadRunne ...

  3. 翻译【ElasticSearch Server】第一章:开始使用ElasticSearch集群(6)

    创建一个新文档(Creating a new document) 现在我们将尝试索引一些文档.对于我们的示例,让我们想象我们正在为我们的博客建立某种CMS.实体之一是博客的文章.使用JSON记法,在以 ...

  4. Android引用百度定位API第三方组件后导致其它.so文件无法正常加载的问题

    查看当前调试设备CPU架构的方法: adb.exe shell getprop ro.product.cpu.abi  (一般返回值为:armeabi-v7a) adb.exe shell getpr ...

  5. DOM笔记(三):Element接口和HTMLElement接口

    一.Element接口 Element接口表示一个元素,该接口扩展自Node接口,自然继承了Node接口的属性和方法,也有一套针对元素的属性和方法. Element接口常见的属性比较少,常用的就是一个 ...

  6. C#相关图书推荐

    C#入门经典(第6版) 作      者 [美] Karli Watson,Jacob Vibe Hammer,Jon D Reid 等 著: 出 版 社 清华大学出版社 出版时间 2014-01-0 ...

  7. 限制波尔兹曼机(Restricted Boltzmann Machines)

    能量模型的概念从统计力学中得来,它描述着整个系统的某种状态,系统越有序,系统能量波动越小,趋近于平衡状态,系统越无序,能量波动越大.例如:一个孤立的物体,其内部各处的温度不尽相同,那么热就从温度较高的 ...

  8. 分布式应用框架Akka快速入门

    转自:http://blog.csdn.net/jmppok/article/details/17264495 本文结合网上一些资料,对他们进行整理,摘选和翻译而成,对Akka进行简要的说明.引用资料 ...

  9. [转]sublime 使用技巧总结

    原文链接:http://www.cnblogs.com/yingzi/archive/2012/04/24/2469056.html 对于用惯了editplus的人来说,突然接触到sublime有点无 ...

  10. Java 编程要点之并发(Concurrency)详解

    计算机用户想当然地认为他们的系统在一个时间可以做多件事.他们认为,他们可以工作在一个字处理器,而其他应用程序在下载文件,管理打印队列和音频流.即使是单一的应用程序通常也是被期望在一个时间来做多件事.例 ...