• Android的GridView和Gallery结合Demo


    Android的GridView和Gallery结合Demo

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

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

    2、ImageViewExt.java文件

     1 /**
     2  *
     3  * @author 空山不空
     4  * 扩展ImageView类,将图片加上边框,并且设置边框为灰色
     5  */
     6 public class ImageViewExt extends ImageView {
     7  //将图片加灰色的边框
     8     private int color;
     9  
    10     public ImageViewExt(Context context) {
    11         super(context);
    12        // TODO Auto-generated constructor stub
    13         color=Color.GRAY;
    14   }
    15      
    16    public ImageViewExt(Context context, AttributeSet attrs) {
    17          super(context, attrs);
    18         // TODO Auto-generated constructor stub
    19          color=Color.GRAY;
    20    }
    21  
    22      
    23     @Override
    24      protected void onDraw(Canvas canvas) {
    25          // TODO Auto-generated method stub   
    26         
    27         super.onDraw(canvas);   
    28         //画边框
    29          Rect rec=canvas.getClipBounds();
    30         rec.bottom--;
    31         rec.right--;
    32         Paint paint=new Paint();
    33         paint.setColor(color);
    34         paint.setStrokeWidth(5);
    35         paint.setStyle(Paint.Style.STROKE);
    36         canvas.drawRect(rec, paint);
    37     }
    38 }

    通过重载onDraw方法来画边框和设置边框颜色

    3、相册GalleryActivity.java

     1 /**
     2  *
     3  * @author 空山不空
     4  * Gallery图片页面,通过Intent得到GridView传过来的图片位置,加载图片,再设置适配器
     5  */
     6 public class GalleryActivity extends Activity {
     7     public int i_position = 0;
     8     private DisplayMetrics dm;
     9  
    10     @Override
    11     public void onCreate(Bundle savedInstanceState) {
    12         super.onCreate(savedInstanceState);
    13         requestWindowFeature(Window.FEATURE_NO_TITLE);
    14         setContentView(R.layout.mygallery); 
    15         dm = new DisplayMetrics();
    16         getWindowManager().getDefaultDisplay().getMetrics(dm);
    17         // 获得Gallery对象 
    18         GalleryExt  g = (GalleryExt) findViewById(R.id.ga);
    19         //通过Intent得到GridView传过来的图片位置
    20         Intent intent = getIntent();
    21         i_position = intent.getIntExtra("position", 0); 
    22         // 添加ImageAdapter给Gallery对象
    23         ImageAdapter ia=new ImageAdapter(this);    
    24         g.setAdapter(ia);
    25         g.setSelection(i_position);    
    26          
    27         //加载动画
    28         Animation an= AnimationUtils.loadAnimation(this,R.anim.scale );
    29         g.setAnimation(an);
    30  
    31     }
    32 }

     这里有三点:

    (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      }
    21  
    22     private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2)
    23        {  
    24         return e2.getX() > e1.getX();
    25        }
    26  
    27      @Override
    28     public boolean onFling(MotionEvent e1, MotionEvent e2, float distanceX,
    29                     float distanceY) {
    30  //通过重构onFling方法,使Gallery控件滑动一次只加载一张图片
    31          //获取适配器
    32          ImageAdapter ia=(ImageAdapter)this.getAdapter();
    33         //得到当前图片在图片资源中的位置
    34          int p=ia.getOwnposition();
    35          //图片的总数量
    36          int count=ia.getCount();
    37          int kEvent; 
    38           if(isScrollingLeft(e1, e2)){
    39            //Check if scrolling left 
    40               if(p==0&&is_first){
    41                   //在第一页并且再往左移动的时候,提示
    42                   Toast.makeText(this.getContext(), "已到第一页", Toast.LENGTH_SHORT).show();
    43               }else if(p==0){
    44                   //到达第一页时,把is_first设置为true
    45                   is_first=true;
    46               }else{
    47                   is_last=false;
    48               }
    49                
    50            kEvent = KeyEvent.KEYCODE_DPAD_LEFT; 
    51            }  else{
    52             //Otherwise scrolling right   
    53                if(p==count-1&&is_last){
    54                       Toast.makeText(this.getContext(), "已到最后一页", Toast.LENGTH_SHORT).show();
    55                   }else if( p==count-1){
    56                       is_last=true;
    57                   }else{
    58                       is_first=false;
    59                   }
    60                    
    61             kEvent = KeyEvent.KEYCODE_DPAD_RIGHT;  
    62             } 
    63           onKeyDown(kEvent, null); 
    64           return true; 
    65     }
     

    5、ImageAdapter.java文件

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

    6、配置文件

    (1)AndroidManifest.xml :

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.ajie"
          android:versionCode="1"
          android:versionName="1.0">
        <application android:icon="@drawable/icon"  android:label="@string/app_name">
        <activity android:name=".GalleryActivity"  android:label="@string/title"  /> 
        <activity android:name=".GridViewActivity"  android:label="@string/app_name"   android:configChanges="orientation|keyboardHidden" >      
              <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter> 
        </activity> 
        </application>
    </manifest>
     

    (2)mygridview.xml,即GridView页面

     1 <?xml version="1.0" encoding="utf-8"?>
     2   
     3  
     4 <GridView xmlns:android="http://schemas.android.com/apk/res/android"
     5     android:id="@+id/myGrid"
     6     android:layout_width="fill_parent"
     7     android:layout_height="fill_parent"
     8     android:verticalSpacing="6dp" 
     9     android:numColumns="3"   
    10     android:paddingTop="5dp"
    11     android:stretchMode="columnWidth" 
    12     android:gravity="fill_vertical|fill_horizontal"
    13     />
     

    (3)mygallery.xml,加载图片页面

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:orientation="horizontal" android:layout_width="match_parent"
     4     android:layout_height="match_parent" android:gravity="center"
     5     android:padding="10dip">
     6     <RelativeLayout android:layout_width="wrap_content"
     7         android:layout_height="wrap_content" android:padding="2dip"
     8         android:background="#000000">
     9  
    10         <com.ajie.GalleryExt android:id="@+id/ga"
    11             android:layout_width="fill_parent" android:layout_height="fill_parent"
    12             android:spacing="16dp" />
    13     </RelativeLayout>
    14 </LinearLayout>
     

    Demo下载地址:<a href="http://files.cnblogs.com/fbsk/gridGalleryDemo.zip"> gridGalleryDemo.zip下载</a>

    转自:http://www.cnblogs.com/fbsk/archive/2011/10/10/2205776.html

  • 相关阅读:
    Combox小问题
    数据库登录名,用户,角色以及权限分配
    UDP初识
    AJax 无刷新构建DataTable
    批量修改数据库构架SQL
    Jquery Ajax
    Linq中使用Group By
    对象的消息模型
    P2P网络技术概览与实现原理
    ajax(1)
  • 原文地址:https://www.cnblogs.com/Sharley/p/5580714.html
Copyright © 2020-2023  润新知