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. Maximum Random Walk(概率dp)

    题意: 走n步,给出每步向左走概率l,向右走概率r,留在原地的概率 1-l-r,求能达到的最远右边距离的期望. 分析: 开始按期望逆求的方式分析,但让求的就是右边界没法退,懵了一会,既然逆着不能求,就 ...

  2. Educational Codeforces Round 15 套题

    这套题最后一题不会,然后先放一下,最后一题应该是大数据结构题 A:求连续最长严格递增的的串,O(n)简单dp #include <cstdio> #include <cstdlib& ...

  3. XTUOJ1247 Pair-Pair 预处理+暴力

    分析:开个1000*1000的数组,预处理矩阵和,然后分类讨论就好 时间复杂度:O(n) #include <cstdio> #include <iostream> #incl ...

  4. uC/OS - III 移植 IAR平台

    关于移植uC/OS-III 网上已经有很多教程了此处只是做个记录 首先下载源码然后解压得到下面的文件: 然后在模版工程里新建各种文件夹: 最后全部都添加进工程: OK了,编译一下,惊呆了,竟然 0错误 ...

  5. DataTable行转列

    /// <summary> /// DataTable行转列 /// </summary> /// <param name="dtable">需 ...

  6. 【windows核心编程】使用远程线程注入DLL

    前言 该技术是指通过在[目标进程]中创建一个[远程线程]来达到注入的目的. 创建的[远程线程]函数为LoadLibrary, 线程函数的参数为DLL名字, 想要做的工作在DLL中编写.  示意图如下: ...

  7. C++调用Matlab引擎及Eigen配置

    这个周开始要着手实现网格水印的代码了,虽然还什么都不会,但也只能一步步摸索着往前走了. 我要实现的论文题目是<<Watermarking 3D Polygonal Meshes in th ...

  8. res/raw和assets的 区别

    res/raw和assets的相同点: 两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制. res/raw和assets的不同点: 1.res/raw中的文件会被映射到R.ja ...

  9. Tkinter教程之Toplevel篇

    本文转载自:http://blog.csdn.net/jcodeer/article/details/1811341 '''Tkinter教程之Toplevel篇'''#TopLevel与Frame类 ...

  10. <Chapter 2>2-2-2.开发Python应用(Developing a Python App)

    对App Engine来讲最简单的Python应用是一个有两个文件的简单目录:一个称为app.yaml的配置文件,一个用于请求处理器的Python代码文件.包含app.yaml文件的这个目录就是这个应 ...