Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 1145|回复: 0

[实例教程]Android的GridView和Gallery结合Demo

[复制链接]

该用户从未签到

发表于 2011-10-22 14:23:21 | 显示全部楼层 |阅读模式
Demo介绍:首页是一个GridView加载图片,竖屏时显示3列图片,横屏时显示4列图片;并且对图片进行大小限制和加灰色边框处理。
点击某一张图片,会链接到Gallery页面,由于Android自带的Gallery控件滑动效果很不好(滑动一次会加载好多张图片),这里对Gallery进行了扩展,滑动一次只加载一张图片。
Demo效果如下:


1、首页Activity页面,GridViewActivity.java介绍:
  1. public class GridViewActivity extends Activity {
  2.         private DisplayMetrics dm;
  3.         private GridImageAdapter ia;
  4.         private GridView g;
  5.         private int imageCol = 3;
  6.         @Override
  7.         protected void onCreate(Bundle savedInstanceState) {
  8.                 // TODO Auto-generated method stub
  9.                 super.onCreate(savedInstanceState);
  10.                 // requestWindowFeature(Window.FEATURE_NO_TITLE);
  11.                 ia = new GridImageAdapter(this);
  12.                 setContentView(R.layout.mygridview);
  13.                 g = (GridView) findViewById(R.id.myGrid);
  14.                 g.setAdapter(ia);
  15.                 g.setOnItemClickListener(new OnItemClick(this));
  16.                 // 得到屏幕的大小
  17.                 dm = new DisplayMetrics();
  18.                 getWindowManager().getDefaultDisplay().getMetrics(dm);
  19.         }
  20.         /**
  21.          * 屏幕切换时进行处理 如果屏幕是竖屏,则显示3列,如果是横屏,则显示4列
  22.          */
  23.         @Override
  24.         public void onConfigurationChanged(Configuration newConfig) {
  25.                 try {
  26.                         super.onConfigurationChanged(newConfig);
  27.                         // 如果屏幕是竖屏,则显示3列,如果是横屏,则显示4列
  28.                         if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
  29.                                 imageCol = 4;
  30.                         } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
  31.                                 imageCol = 3;
  32.                         }
  33.                         g.setNumColumns(imageCol);
  34.                         g.setAdapter(new ImageAdapter(this));
  35.                         // ia.notifyDataSetChanged();
  36.                 } catch (Exception ex) {
  37.                         ex.printStackTrace();
  38.                 }
  39.         }
  40.         /**
  41.          *
  42.          * @author 空山不空 点击具体的小图片时,会链接到GridViewActivity页面,进行加载和展示
  43.          */
  44.         public class OnItemClick implements OnItemClickListener {
  45.                 public OnItemClick(Context c) {
  46.                         mContext = c;
  47.                 }
  48.                 @Override
  49.                 public void onItemClick(AdapterView aview, View view, int position,
  50.                                 long arg3) {
  51.                         Intent intent = new Intent();
  52.                         intent.setClass(GridViewActivity.this, GalleryActivity.class);
  53.                         intent.putExtra("position", position);
  54.                         GridViewActivity.this.startActivity(intent);
  55.                 }
  56.                 private Context mContext;
  57.         }
  58.         /**
  59.          *
  60.          * @author 空山不空 设置GridView的图片适配器
  61.          */
  62.         public class GridImageAdapter extends BaseAdapter {
  63.                 Drawable btnDrawable;
  64.                 public GridImageAdapter(Context c) {
  65.                         mContext = c;
  66.                         Resources resources = c.getResources();
  67.                         btnDrawable = resources.getDrawable(R.drawable.bg);
  68.                 }
  69.                 public int getCount() {
  70.                         return ImageSource.mThumbIds.length;
  71.                 }
  72.                 public Object getItem(int position) {
  73.                         return position;
  74.                 }
  75.                 public long getItemId(int position) {
  76.                         return position;
  77.                 }
  78.                 public View getView(int position, View convertView, ViewGroup parent) {
  79.                         ImageViewExt imageView;
  80.                         if (convertView == null) {
  81.                                 imageView = new ImageViewExt(mContext);
  82.                                 // 如果是横屏,GridView会展示4列图片,需要设置图片的大小
  83.                                 if (imageCol == 4) {
  84.                                         imageView.setLayoutParams(new GridView.LayoutParams(
  85.                                                         dm.heightPixels / imageCol - 6, dm.heightPixels
  86.                                                                         / imageCol - 6));
  87.                                 } else {// 如果是竖屏,GridView会展示3列图片,需要设置图片的大小
  88.                                         imageView.setLayoutParams(new GridView.LayoutParams(
  89.                                                         dm.widthPixels / imageCol - 6, dm.widthPixels
  90.                                                                         / imageCol - 6));
  91.                                 }
  92.                                 imageView.setAdjustViewBounds(true);
  93.                                 imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
  94.                         } else {
  95.                                 imageView = (ImageViewExt) convertView;
  96.                         }
  97.                         imageView.setImageResource(ImageSource.mThumbIds[position]);
  98.                         return imageView;
  99.                 }
  100.                 private Context mContext;
  101.         }
  102. }
复制代码

加载GridView页面,如果屏幕是竖屏,则显示3列,如果是横屏,则显示4列;并且显示的图片加上灰色边框,这里在适配器GridImageAdapter的getView方法里引用了ImageViewExt类来对图片进行处理,这个类扩展自ImageView;点击其中的某一张图片,会跳转到GalleryActivity页面。
2、ImageViewExt.java文件

/**

*

* @author 空山不空

* 扩展ImageView类,将图片加上边框,并且设置边框为灰色

*/

public class ImageViewExt extends ImageView {

//将图片加灰色的边框

    private int color;



    public ImageViewExt(Context context) {

        super(context);

       // TODO Auto-generated constructor stub

        color=Color.GRAY;

  }

     

   public ImageViewExt(Context context, AttributeSet attrs) {

         super(context, attrs);

        // TODO Auto-generated constructor stub

         color=Color.GRAY;

   }



     

    @Override

     protected void onDraw(Canvas canvas) {

         // TODO Auto-generated method stub     

      

        super.onDraw(canvas);     

        //画边框

         Rect rec=canvas.getClipBounds();

        rec.bottom--;

        rec.right--;

        Paint paint=new Paint();

        paint.setColor(color);

        paint.setStrokeWidth(5);

        paint.setStyle(Paint.Style.STROKE);

        canvas.drawRect(rec, paint);

    }

}


通过重载onDraw方法来画边框和设置边框颜色
3、相册GalleryActivity.java

/**

*

* @author 空山不空

* Gallery图片页面,通过Intent得到GridView传过来的图片位置,加载图片,再设置适配器

*/

public class GalleryActivity extends Activity {

        public int i_position = 0;

        private DisplayMetrics dm;



        @Override

        public void onCreate(Bundle savedInstanceState) {

                super.onCreate(savedInstanceState);

                requestWindowFeature(Window.FEATURE_NO_TITLE);

                setContentView(R.layout.mygallery);         

                dm = new DisplayMetrics();

                getWindowManager().getDefaultDisplay().getMetrics(dm);

                // 获得Gallery对象         

                GalleryExt  g = (GalleryExt) findViewById(R.id.ga);

                //通过Intent得到GridView传过来的图片位置

                Intent intent = getIntent();

                i_position = intent.getIntExtra("position", 0);         

                // 添加ImageAdapter给Gallery对象

                ImageAdapter ia=new ImageAdapter(this);                 

                g.setAdapter(ia);

                 g.setSelection(i_position);         

                 

                 //加载动画

                 Animation an= AnimationUtils.loadAnimation(this,R.anim.scale );

        g.setAnimation(an);



        }

}


这里有三点:
(1)、扩展Gallery组件,即GalleryExt控件,设置滑动一次只加载一张图片,并且, 如果是第一张图片时,向左滑动会提示“已到第一页”,如果是最后一张图片时,向右滑动会提示“已到第后页”
(2)、接收GridViewActivity页面传过来的参数position,通过这个参数找到具体的图片,通过ImageAdapter适配器加载
(3)、ImageAdapter图片适配器,用来加载图片
4、GalleryExt.java文件
  1. /**
  2. *
  3. * @author 空山不空
  4. * 扩展Gallery组件,设置滑动一次只加载一张图片,并且,
  5. * 如果是第一张图片时,向左滑动会提示“已到第一页”
  6. * 如果是最后一张图片时,向右滑动会提示“已到第后页”
  7. */
  8. public class GalleryExt extends Gallery {
  9.     boolean is_first=false;
  10.     boolean is_last=false;
  11.         public GalleryExt(Context context) {
  12.                 super(context);
  13.                 // TODO Auto-generated constructor stub
  14.         }
  15.          
  16.         public GalleryExt(Context context,AttributeSet paramAttributeSet)
  17.          {
  18.                super(context,paramAttributeSet);
  19.          }
  20.         private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2)
  21.            {   
  22.             return e2.getX() > e1.getX();
  23.            }
  24.          @Override
  25.     public boolean onFling(MotionEvent e1, MotionEvent e2, float distanceX,
  26.                     float distanceY) {
  27. //通过重构onFling方法,使Gallery控件滑动一次只加载一张图片
  28.                  //获取适配器
  29.                  ImageAdapter ia=(ImageAdapter)this.getAdapter();
  30.                 //得到当前图片在图片资源中的位置
  31.                  int p=ia.getOwnposition();
  32.                  //图片的总数量
  33.                  int count=ia.getCount();
  34.                  int kEvent;   
  35.                   if(isScrollingLeft(e1, e2)){
  36.                    //Check if scrolling left   
  37.                           if(p==0&&is_first){
  38.                                   //在第一页并且再往左移动的时候,提示
  39.                                   Toast.makeText(this.getContext(), "已到第一页", Toast.LENGTH_SHORT).show();
  40.                           }else if(p==0){
  41.                                   //到达第一页时,把is_first设置为true
  42.                                   is_first=true;
  43.                           }else{
  44.                                   is_last=false;
  45.                           }
  46.                            
  47.                    kEvent = KeyEvent.KEYCODE_DPAD_LEFT;   
  48.                    }  else{
  49.                     //Otherwise scrolling right     
  50.                            if(p==count-1&&is_last){
  51.                                           Toast.makeText(this.getContext(), "已到最后一页", Toast.LENGTH_SHORT).show();
  52.                                   }else if( p==count-1){
  53.                                           is_last=true;
  54.                                   }else{
  55.                                           is_first=false;
  56.                                   }
  57.                                    
  58.                     kEvent = KeyEvent.KEYCODE_DPAD_RIGHT;   
  59.                     }   
  60.                   onKeyDown(kEvent, null);   
  61.                   return true;   
  62.     }
复制代码


5、ImageAdapter.java文件
  1. /**
  2. *
  3. * @author 空山不空
  4. *  图片适配器,用来加载图片
  5. */
  6. public class ImageAdapter extends BaseAdapter {
  7. //图片适配器
  8.         // 定义Context
  9.         private int ownposition;
  10.          
  11.         public int getOwnposition() {
  12.                 return ownposition;
  13.         }
  14.         public void setOwnposition(int ownposition) {
  15.                 this.ownposition = ownposition;
  16.         }
  17.         private Context mContext;
  18.         // 定义整型数组 即图片源
  19.         // 声明 ImageAdapter
  20.         public ImageAdapter(Context c) {
  21.                 mContext = c;
  22.         }
  23.         // 获取图片的个数
  24.         public int getCount() {
  25.                 return ImageSource.mThumbIds.length;
  26.         }
  27.         // 获取图片在库中的位置
  28.         public Object getItem(int position) {
  29.                 ownposition=position;
  30.                 return position;
  31.         }
  32.         // 获取图片ID
  33.         public long getItemId(int position) {
  34.                 ownposition=position;
  35.                 return position;
  36.         }
  37.         public View getView(int position, View convertView, ViewGroup parent) {
  38.                  
  39.                 ownposition=position;
  40.                 ImageView imageview = new ImageView(mContext);
  41.                 imageview.setBackgroundColor(0xFF000000);
  42.                 imageview.setScaleType(ImageView.ScaleType.FIT_CENTER);
  43.                 imageview.setLayoutParams(new GalleryExt.LayoutParams(
  44.                                 LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
  45.                 imageview.setImageResource(ImageSource.mThumbIds[position]);
  46.                 // imageview.setAdjustViewBounds(true);
  47.                 // imageview.setLayoutParams(new GridView.LayoutParams(320, 480));
  48.                 // imageview.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
  49.                 return imageview;
  50.         }
  51. }
复制代码


6、配置文件
(1)AndroidManifest.xml :
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3.       package="com.ajie"
  4.       android:versionCode="1"
  5.       android:versionName="1.0">
  6.     <application android:icon="@drawable/icon"  android:label="@string/app_name">
  7.          <activity android:name=".GalleryActivity"  android:label="@string/title"  />   
  8.         <activity android:name=".GridViewActivity"  android:label="@string/app_name"   android:configChanges="orientation|keyboardHidden" >      
  9.           <intent-filter>
  10.                 <action android:name="android.intent.action.MAIN" />
  11.                 <category android:name="android.intent.category.LAUNCHER" />
  12.             </intent-filter>   
  13.     </activity>   
  14.     </application>
  15. </manifest>
复制代码


(2)mygridview.xml,即GridView页面
<?xml version="1.0" encoding="utf-8"?>





<GridView xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/myGrid"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"

    android:verticalSpacing="6dp"   

    android:numColumns="3"     

    android:paddingTop="5dp"

    android:stretchMode="columnWidth"   

    android:gravity="fill_vertical|fill_horizontal"

    />
(3)mygallery.xml,加载图片页面
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <GridView xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:id="@+id/myGrid"
  4.         android:layout_width="fill_parent"
  5.         android:layout_height="fill_parent"
  6.     android:verticalSpacing="6dp"   
  7.     android:numColumns="3"     
  8.     android:paddingTop="5dp"
  9.     android:stretchMode="columnWidth"   
  10.     android:gravity="fill_vertical|fill_horizontal"
  11.     />
复制代码



源码下载:
gridGalleryDemo.zip (2.09 MB)

115网盘下载地址:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

该用户从未签到

发表于 2011-10-22 14:23:28 | 显示全部楼层
正需要,回复下载
谢谢lz
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-25 08:54:21 | 显示全部楼层
很好的例子啊。
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2012-3-13 14:24:05 | 显示全部楼层
不错
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 22:39 , Processed in 0.417443 second(s), 47 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表