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. HDU 5881 Tea

    Tea Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  2. 二分+叉积判断方向 poj 2318 2398

    // 题意:问你每个区域有多少个点 // 思路:数据小可以直接暴力 // 也可以二分区间 #include <cstdio> #include <cstring> #inclu ...

  3. Codeforces Round #361 (Div. 2)

    A 脑筋急转弯 // #pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream&g ...

  4. 简易版CSS3 Tab菜单 实用的Tab切换

    今天我们要来分享一款非常简易而又实用的CSS3 Tab菜单,Tab菜单没有非常华丽的动画,但是代码非常简洁易懂,也可以在大部分场合使用,因此也非常实用,如果你需要加入动画效果,也可以自己方便地修改这款 ...

  5. 解决问题的步骤(第一篇)-- clwu

    现象: 之前打开IE 还是正常的,但前几天开始打开就不正常了,报错如下. 处理(别人的)问题的步骤: 百度一下  0xc0000018,没有什么有用信息. 看一下程序(IE)启动时做了些什么. 怎么看 ...

  6. mongodb 新建用户 -摘自网络

    随着版本的更新,对在使用mongodb的业务也进行了版本升级,但是在drop掉一个数据库时,问题来了,原来的用户随着删除库也被删除掉,但是再想通过原来的语法db.addUser()添加,一直报错,提示 ...

  7. nodejs + socket.io + redis 新手上路

    最近要更新网站架构了,决定转入 nodejs + socket.io + redis 方式. 战斗刚开始: 网上的文章太松散,我根据各个网友的分享进行整理 ,让大家可以方便上手. 进入node.js之 ...

  8. 编译arm64错误记录

    响应2月底appstore 64位APP的上线要求,开始编译IOS arm64版本引擎库.编译arm64遇到一些问题,在此记录. 1. 数据类型的错误 __int64 相关,提示error: expe ...

  9. JavaWeb应用中重定向与跳转的区别

    针对JSP与Servlet: 两种重要的跳转: 1.request.getRequestDispatcher("地址").forward(ServletRequest, Servl ...

  10. 【转】iOS可执行文件瘦身方法

    http://blog.cnbang.net/tech/2544/ 缩减iOS安装包大小是很多中大型APP都要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源.这些资源优化做完后,我 ...