zoukankan      html  css  js  c++  java
  • 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.         @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文件


    1. /**
    2. *
    3. * @author 空山不空
    4. * 扩展ImageView类,将图片加上边框,并且设置边框为灰色
    5. */
    6. public class ImageViewExt extends ImageView {
    7. //将图片加灰色的边框
    8.     private int color;

    9.     public ImageViewExt(Context context) {
    10.         super(context);
    11.        // TODO Auto-generated constructor stub
    12.         color=Color.GRAY;
    13.   }
    14.    
    15.    public ImageViewExt(Context context, AttributeSet attrs) {
    16.          super(context, attrs);
    17.         // TODO Auto-generated constructor stub
    18.          color=Color.GRAY;
    19.    }

    20.    
    21.     @Override
    22.      protected void onDraw(Canvas canvas) {
    23.          // TODO Auto-generated method stub   
    24.       
    25.         super.onDraw(canvas);   
    26.         //画边框
    27.          Rect rec=canvas.getClipBounds();
    28.         rec.bottom--;
    29.         rec.right--;
    30.         Paint paint=new Paint();
    31.         paint.setColor(color);
    32.         paint.setStrokeWidth(5);
    33.         paint.setStyle(Paint.Style.STROKE);
    34.         canvas.drawRect(rec, paint);
    35.     }
    36. }
    复制代码


    通过重载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.         @Override
    10.         public void onCreate(Bundle savedInstanceState) {
    11.                 super.onCreate(savedInstanceState);
    12.                 requestWindowFeature(Window.FEATURE_NO_TITLE);
    13.                 setContentView(R.layout.mygallery);         
    14.                 dm = new DisplayMetrics();
    15.                 getWindowManager().getDefaultDisplay().getMetrics(dm);
    16.                 // 获得Gallery对象        
    17.                 GalleryExt  g = (GalleryExt) findViewById(R.id.ga);
    18.                 //通过Intent得到GridView传过来的图片位置
    19.                 Intent intent = getIntent();
    20.                 i_position = intent.getIntExtra("position", 0);         
    21.                 // 添加ImageAdapter给Gallery对象
    22.                 ImageAdapter ia=new ImageAdapter(this);               
    23.                 g.setAdapter(ia);
    24.                  g.setSelection(i_position);         
    25.                  
    26.                  //加载动画
    27.                  Animation an= AnimationUtils.loadAnimation(this,R.anim.scale );
    28.         g.setAnimation(an);

    29.         }
    30. }
    复制代码


    这里有三点:

    (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页面

    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.     />
    复制代码

    (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.     />
  • 相关阅读:
    C++模板的声明与实现分离 编译错误详解
    C语言中数据类型的隐式转换
    UNIX 高手的 10 个习惯
    linux 信号量
    引用与数组
    Linux 的变量命名规则
    .bash_profile和.bashrc的区别(如何设置生效
    URAL 1053 Pinocchio
    URAL 1040 Airline Company
    URAL 1045 Funny Game
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/3267901.html
Copyright © 2011-2022 走看看