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. 1. 搭建NDK集成开发环境

  2. CodeForce---Educational Codeforces Round 3 Load Balancing 正题

    看到这题是我的想法就是肯定跟平均值有关但是接下来就不知道怎么做了 看完大神的正解数之后,原来发现是这么简单,但是就是不知道为啥一定是平均值和平均值加1,而不是平均值和平均值减1: 好啦下面就贴出大神的 ...

  3. Canvas入门(1):绘制矩形、圆、直线、曲线等基本图形

    来源:http://www.ido321.com/968.html 一.Canvas的基础知识 Canvas是HTML 5中新增的元素,专门用于绘制图形.canvas元素就相当于一块“画布”,一块无色 ...

  4. document.body、document.documentElement和window获取视窗大小的区别

    来源:http://www.ido321.com/906.html 在w3school关于window对象的介绍中,介绍了获取浏览器窗口大小的三种方法(浏览器的视口,不包括工具栏和滚动条). 对于In ...

  5. 使用PHP绘制统计图

    使用PHP画统计图的方法 第一种方法 <?php //最后一次修改:2004-6-21 //一个生成矩形图,曲线图的图形分析类 //作者:tonera //说明: //任何人可在任何场合自由使用 ...

  6. java集合框架复习(一)

    数组类Array是java中最基本的一个存储结构,它用于存储 一组连续的对象或一组类型相同的基本类型的数据. Array特点:效率高,但容量固定且无法动态改变, 缺点:无法判断其中存有多少元素,len ...

  7. Linux中MySQL5.5解压版普通用户安装

    #查看本机mysql 安装路径 [hadoop@SY-0134 toolkit]$ rpm -qa|grep -i mysql [hadoop@SY-0134 toolkit]$ whereis my ...

  8. CDH5.5.1版HBase安装使用LZO压缩

    1.安装      RHEL/CentOS/Oracle 5 Navigate to this link and save the file in the /etc/yum.repos.d/ dire ...

  9. 一个考察for循环题 讨论一下

    一道Java程序题,主要是考察for循环如下所示: public class Test { static boolean fun(char c) { System.out.print(c); retu ...

  10. wine的中文字体显示

    从1.1.4开始wine的界面就已经支持中文了,但是对于软件中的中文支持并不太好,主要原因.还是字体...Let's go 首先,copy一下字体:把simsun.ttc (即宋体)复制到 ~/.wi ...