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.     />
  • 相关阅读:
    将vue文件script代码抽取到单独的js文件
    git pull 提示错误:Your local changes to the following files would be overwritten by merge
    vue和uniapp 配置项目基础路径
    XAMPP Access forbidden! Access to the requested directory is only available from the local network.
    postman与newman集成
    postman生成代码段
    Curl命令
    POST方法的Content-type类型
    Selenium Grid 并行的Web测试
    pytorch转ONNX以及TnesorRT的坑
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/3267901.html
Copyright © 2011-2022 走看看