HardBirch

Android入门第十二篇之Gallery

时间:10-10-24 栏目:安卓入门与提高 作者:张飞不张,文采横飞 评论:62 点击: 17,844 次

       Android的Gallery控件是个很不错的看图控件,大大减轻了开发者对于看图功能的开发,而且效果也比较美观。本文介绍Gallery的用法,用反射机制来动态读取资源中的图片。

       本文的效果图:

main.xml源码:









程序源码:

import java.lang.reflect.Field;
import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.AdapterView.OnItemClickListener;

public class testImageView extends Activity {
private Gallery mGallery;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

mGallery = (Gallery)findViewById(R.id.gallery);
try {
mGallery.setAdapter(new ImageAdapter(this));
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mGallery.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView parent, View v, int position, long id) {
testImageView.this.setTitle(String.valueOf(position));
}
});
}

/*
* class ImageAdapter is used to control gallery source and operation.
*/
private class ImageAdapter extends BaseAdapter{
private Context mContext;
private ArrayList<Integer> imgList=new ArrayList<Integer>();
private ArrayList<Object> imgSizes=new ArrayList<Object>();
public ImageAdapter(Context c) throws IllegalArgumentException, IllegalAccessException{
mContext = c;

//用反射机制来获取资源中的图片ID和尺寸
Field[] fields = R.drawable.class.getDeclaredFields();
for (Field field : fields)
{
if (!"icon".equals(field.getName()))//除了icon之外的图片
{
int index=field.getInt(R.drawable.class);
//保存图片ID
imgList.add(index);
//保存图片大小
int size[]=new int[2];
Bitmap bmImg=BitmapFactory.decodeResource(getResources(),index);
size[0]=bmImg.getWidth();size[1]=bmImg.getHeight();
imgSizes.add(size);
}
}
}
@Override
public int getCount() {
// TODO Auto-generated method stub

return imgList.size();
}

@Override
public Object getItem(int position) {
// TODO Auto-generated method stub

return position;
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub

return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub

ImageView i = new ImageView (mContext);
//从imgList取得图片ID
i.setImageResource(imgList.get(position).intValue());
i.setScaleType(ImageView.ScaleType.FIT_XY);
//从imgSizes取得图片大小
int size[]= new int[2];
size=(int[]) imgSizes.get(position);
i.setLayoutParams(new Gallery.LayoutParams(size[0], size[1]));
return i;
}

};
}

声明: 本文由( 张飞不张,文采横飞 )原创编译,转载请保留链接: Android入门第十二篇之Gallery

Android入门第十二篇之Gallery:目前有62 条留言

  1. 0楼
    badmanyu:

    受教了,感谢LZ,不错啊:)

    2010-10-25 09:00 [回复]
  2. 0楼
    hmc1985:

    在Android里面还可以用反射机制,在j2me里面不行,没通用性呀!不过hellogv的文章还是要支持的!

    2010-10-25 09:05 [回复]
  3. 0楼
    yangc_83:

    [e03]虫哥可以出书了!!

    2010-10-25 09:07 [回复]
  4. 0楼
    freemancy:

    文章写得不错…很是可以..[e01][e01][e01][e03][e03]

    2010-11-09 09:35 [回复]
  5. 0楼
    skyer_lei:

    为什么在Android2.2 layout中加入Gallery 出现错误?

    2010-11-16 00:36 [回复]
  6. 0楼
    hellogv:

    回复 skyer_lei:
    IDE的问题,不影响程序运行

    2010-11-16 06:44 [回复]
  7. 0楼
    imshhui:

    回复 hellogv:貌似不能运行,提示null point,eclipse有错误不让运行的

    2010-11-17 14:02 [回复]
  8. 0楼
    asdqqq12:

    能不能让图片循环显示呢?

    2010-11-26 17:40 [回复]
  9. 0楼
    gujinf2008:

    我把ImageAdapter 类写在了另一个文件中,不是内部类了,运行时报空指针异常,应该是 Bitmap bmImg=BitmapFactory.decodeResource(getResources(),index); 这句错,我改成 Bitmap bmImg=BitmapFactory.decodeResource(c.getResources(),index); 对吗?size[0]=bmImg.getWidth();size[1]=bmImg.getHeight(); 这行报错。

    2010-12-09 10:55 [回复]
  10. 0楼
    gujinf2008:

    刚看了,搞错了,因为我darwable文件夹下放了一个不是图片的文件,问题解决了,谢谢了。

    2010-12-09 11:08 [回复]
  11. [e01]

    2011-06-13 08:17 [回复]
  12. 0楼
    yxy1217:

    学习了。写的很好,很受益

    2011-07-05 08:12 [回复]
  13. 0楼
    hellogv:

    [reply]imshhui[/reply]
    null的话,就要判断一下了

    2011-07-06 10:04 [回复]
  14. 0楼
    sjlsym:

    在写baseadapter哪
    Bitmap bmImg=BitmapFactory.decodeResource(getResources(),index);
    getResoueces();方法是哪的?
    怎么报错啊?
    难道别人就没发现么

    2011-07-11 06:03 [回复]
  15. 0楼
    Elieend:

    请问Gallery里面可以放应用程序吗?像gridview一样,就是要左右滑动的效果

    2011-07-19 16:37 [回复]
  16. 0楼
    hellogv:

    [reply]Elieend[/reply]
    gallery里面放应用程序?

    2011-07-19 20:20 [回复]
  17. 0楼
    libuben007:

    我现在为gallery的item设了个selector,而item里面有个textview,我也为textview设了个selector,问题出现了,我按住item时,item跟textview同时出现点击效果,我想要的点item时,它的selector有效果,点textview时,它的selector有效果,说简单点就是他俩的selector不要同时出现效果,请教~~

    2011-07-20 21:40 [回复]
  18. 0楼
    yjy951753:

    [reply]sjlsym[/reply]
    遇到了同样的问题,但是我直接拷贝代码过去居然能执行。。。至今执迷不悟中

    2011-08-02 17:25 [回复]
  19. 0楼
    yjy951753:

    [reply]sjlsym[/reply]
    版本问题,2.3以上是肯定不行,我尝试了1.6可以

    2011-08-02 17:38 [回复]
  20. 0楼
    hellogv:

    [reply]libuben007[/reply]
    那就把textview从这个item分开

    2011-08-03 19:10 [回复]
  21. 0楼
    chbpst:

    是可以写书了

    2011-08-05 18:18 [回复]
  22. 0楼
    chbpst:

    怎么指定我要读的图片的路径

    2011-08-05 18:21 [回复]
  23. 这个效果挺好的!

    2011-08-15 16:35 [回复]
  24. testImageView.this.setTitle(String.valueOf(position));
    testImageView 在哪定义的阿!

    2011-08-23 11:15 [回复]
  25. 0楼
    hellogv:

    [reply]mengxiang026[/reply]
    class testImageView extends Activity。。。。。。哥,虽然代码都给出来了,但是也不能这么浮躁啊,要花点时间看的

    2011-08-24 18:39 [回复]
  26. 0楼
    y88uan11:

    你的效果图怎么看起来像是点击放大的效果,没看出那里有写啊,我写的也没有啊。。。。

    2011-08-31 15:50 [回复]
  27. 0楼
    hellogv:

    [reply]y88uan11[/reply]
    setScaleType(ImageView.ScaleType.FIT_XY)
    setLayoutParams(new Gallery.LayoutParams(size[0], size[1]))

    2011-09-01 08:57 [回复]
  28. 0楼
    y88uan11:

    [reply]hellogv[/reply]
    查了些资料,知道这2个函数的作用了,但是为什么再点击后就放大了,你能给我说说原理么

    2011-09-01 10:11 [回复]
  29. 0楼
    hellogv:

    [reply]y88uan11[/reply]
    兄弟,要成为高手,不能靠问,我初中自学编程的时候,身边没人可以教我,我都是自己把代码啃熟,做开发的既然知道问题的根源,就要自己动手去解决,别人告诉你,这还是别人的知识而已。

    2011-09-04 14:08 [回复]
  30. 0楼
    ywjschm:

    [reply]hellogv[/reply]
    刚学,不错啊,这个可以看

    2011-09-08 17:26 [回复]
  31. 非常有用,非常感谢楼主

    2011-09-13 14:50 [回复]
  32. 0楼
    ruiruiy:

    我也是这么做的,为什么我却做不出楼主的效果呢?我走的3张图片都在一块

    2011-09-19 22:59 [回复]
  33. 0楼
    ruiruiy:

    我怀疑是我图片像素的问题。请问一下你的程序中展示的这几张图图片像素是多少?

    2011-09-20 11:13 [回复]
  34. 0楼
    lwuit:

    [reply]y88uan11[/reply]
    在不,哥们?

    2011-09-20 11:38 [回复]
  35. 0楼
    hellogv:

    [reply]ruiruiy[/reply]
    试试就知道了

    2011-09-21 13:51 [回复]
  36. 在onclick中~
    if (view instanceof ImageView) { ImageView imgView = (ImageView) view;
    LayoutParams param = new LayoutParams(40, 40);//缩小,放大,自定义
    imgView.setLayoutParams(param); }

    2011-09-23 12:20 [回复]
  37. 楼主从初中就学编程了啊,难怪这么牛逼,原来是兴趣使然啊!

    2011-09-23 16:22 [回复]
  38. 0楼
    qinjuning:

    学习。

    2011-10-13 14:57 [回复]
  39. 0楼
    mozartsoul:

    郑重的鄙视一下!bitmap资源你如何释放???还高手?你个垃圾!!

    2011-10-18 19:58 [回复]
  40. 0楼
    hellogv:

    [reply]mozartsoul[/reply]
    谢谢你的鄙视,正因为有鄙视我的人,我才要不断努力!

    2011-10-18 21:52 [回复]
  41. 0楼
    kf156:

    [reply]mozartsoul[/reply]
    经常来看hellogv的博文,写得很不错,写文章的目的是分享经验,共同学习交流进步。若你觉得文章有不足或不对的地方,可以提出建议或意见,大伙一起讨论。恶意的辱骂只会让人看不起你,还请学会尊重别人,尊重自己。

    2011-10-19 09:17 [回复]
  42. 0楼
    elleniou:

    [reply]yjy951753[/reply]
    你们没把imageadapter设成内部类当然报错啦。。。

    2011-10-22 14:06 [回复]
  43. 0楼
    elleniou:

    [reply]sjlsym[/reply]
    同上

    2011-10-22 14:07 [回复]
  44. 0楼
    anzhu_111:

    请问下,为什么我的图片是重叠在一起的呢?

    2011-11-22 09:40 [回复]
  45. 0楼
    anzhu_111:

    [reply]anzhu_111[/reply]
    这个已经好了,但是楼主的效果图,好像也是有部分边缘叠加了,还有就是好像也没有点击之后有放大功能吧?

    2011-11-22 10:47 [回复]
  46. 0楼
    bearray123:

    你的文章太敷衍读者了,,,有些文章根本就是一个形式而已,几句代码,而且不是优化过的代码。。太坑爹了。。。你这样的文章还不如不发表

    2011-11-29 15:08 [回复]
  47. 0楼
    zhanwei_30:

    文章写得不错 学习学习

    2011-11-30 16:25 [回复]
  48. 0楼
    lcfeng99:

    请问ImageView i = new ImageView (mContext);每次new的ImageView系统会自动释放吗?会不会导致内存随着运行的时间越来越大?

    2011-12-20 17:51 [回复]
  49. 0楼
    liaomin251:

    [reply]mozartsoul[/reply]
    这个mozartsou你真尼玛把你自己当谁了啊,艹你妹了,尼玛的跑到这里骂人是吧,比骂人是吧,你开个YY,我上来陪你骂。马勒戈壁的,你是不是菊花痒了,欠干是吧,我看这里最垃圾的就是你,艹。不喜欢来这里,早点滚回你娘胎里去。

    2011-12-21 14:09 [回复]
  50. 0楼
    hellogv:

    [reply]lcfeng99[/reply]
    ImageView会自动释放的

    2011-12-21 17:54 [回复]
  51. 0楼
    kesenhoo:

    也许把try catch的部分写到onResume()里面会更好点,呵呵

    2011-12-22 09:50 [回复]
  52. ImageView image = null;
    if(convertView==null){
    image = new ImageView(this);
    }else{
    image= convertView;
    }

    2012-01-03 17:58 [回复]
  53. 0楼
    macjie:

    感谢分享 之前自己弄了半天才弄懂类似的demo

    2012-02-07 16:22 [回复]
  54. 0楼
    abica:

    [reply]y88uan11[/reply] 我也觉得你说的没错啊 “你的效果图怎么看起来像是点击放大的效果,没看出那里有写啊,我写的也没有啊。。。。”
    setScaleType(ImageView.ScaleType.FIT_XY)
    setLayoutParams(new Gallery.LayoutParams(size[0], size[1]))

    这两句只是给不同的图片设置不同的显示尺寸而已,并不是实现“点击放大”吧?

    2012-02-21 17:57 [回复]
  55. 0楼
    jianjue123:

    老兄,你这分享的精神值得学习,但是复制下载根本运行不了!

    2012-05-04 17:10 [回复]
  56. 图片重叠怎么解决啊

    2012-05-09 22:06 [回复]
  57. 代码重叠就是弄出来的呢

    2012-05-15 18:09 [回复]
  58. [reply]jimdingyiming[/reply] 你用的是不是像素比较小的图标 如果用像素比较大的图片就没有问题 至于解决方案 我也不知道 不过现象倒是碰到了 再研究研究

    2012-05-23 10:44 [回复]
  59. [reply]jimdingyiming[/reply]
    刚刚试了一下
    i.setLayoutParams(new Gallery.LayoutParams(
    size[0]>80?size[0]:size[0]*8, size[1]>80?size[1]:size[1]*8));
    把图片放大了浏览就不会重叠 不过貌似治标不治本

    2012-05-23 11:11 [回复]
  60. 运行的时候报错,说是空指针异常,请问这是怎么回事

    2012-07-04 15:18 [回复]
  61. 0楼
    lee576:

    [reply]mengxiang026[/reply]
    我倒,这问题是不是也太弱了?

    2012-07-10 13:59 [回复]
  62. 0楼
    trbbadboy:

    int size[]= new int[2]; // 这里的两个int可以不分配的吧
    size=(int[]) imgSizes.get(position);

    2012-09-10 13:26 [回复]

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐