Android将手机相册图片展示到GridView中

标签: Android相册加载相册图片   593人阅读  评论(0)  收藏  举报   分类: android(28) 


这个demo虽然实现了圆形头像加载,但是我们今天重点不是说原型头像,重点说加载手机相册图片,相信大家项目中肯定会用到;

如果大家想了解圆形头像加载可以直接下载源码查看,或者看这篇博客圆形头像讲解

首先说下思路:

大家可以看到展示相册的布局使用的GridView,

我们需要知道两点就可以很容易的完成这个demo;

第一:怎么加载系统相册?

第二:怎么讲GridView的item宽高设置成一样?


先说第一个加载系统相册:

[java]  view plain  copy
  1. Cursor cursor = getContentResolver().query(  
  2.                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, nullnullnullnull);  
  3.        //遍历相册  
  4.        while (cursor.moveToNext()) {  
  5.            String path = cursor.getString(cursor.getColumnIndex(MediaColumns.DATA));  
  6.            //将图片路径添加到集合  
  7.            paths.add(path);  
  8.        }  
  9.        cursor.close();  


第二个问题:其实GridView的item是一个自定义的VIew,继承线性布局,虽然我们不知道每个item的高度是多少,但是我们知道他的宽度是多少,所以我们直接将高度设置成等于宽度即可;

[java]  view plain  copy
  1. public class MyGridViewItem extends LinearLayout{  
  2.   
  3.     public MyGridViewItem(Context context, AttributeSet attrs) {  
  4.         super(context, attrs);  
  5.     }  
  6.     public MyGridViewItem(Context context) {  
  7.         super(context);  
  8.     }  
  9.       
  10.     @Override  
  11.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  12.   
  13.         setMeasuredDimension(getDefaultSize(0, widthMeasureSpec),getDefaultSize(0, heightMeasureSpec));  
  14.   
  15.         // childWidthSize是自定义布局的宽  
  16.         int childWidthSize = getMeasuredWidth();  
  17.         int childHeightSize = getMeasuredHeight();  
  18.   
  19.         // 高度和宽度一样;最后面的是RelativeLayout的宽  
  20.         heightMeasureSpec = widthMeasureSpec = MeasureSpec.makeMeasureSpec(childWidthSize, MeasureSpec.EXACTLY);  
  21.         super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
  22.     }  
  23.   
  24. }  

好了,其他的几乎都是一些琐碎的代码

再说下加载图片到item:这里使用的是Glide框架,非常简单:

[java]  view plain  copy
  1. //当前item要加载的图片路径  
  2.            String path=paths.get(position);  
  3.            //使用谷歌官方提供的Glide加载图片  
  4.            Glide.with(context).load(new File(path)).diskCacheStrategy(DiskCacheStrategy.ALL).centerCrop().into(vh.imageView);  


好了,接下来看下整体的代码把,下面的代码就不一一讲解了,因为都是一些琐碎的代码,没什么难度:

MainActivity:

[java]  view plain  copy
  1. public class MainActivity extends Activity implements View.OnClickListener {  
  2.     //主页面上下两个自定义的View(圆形的ImageView)  
  3.     private CircleImageView ivTop;  
  4.     private CircleImageView ivDown;  
  5.   
  6.     private int INT_TOP=199;  
  7.     private int INT_DOWN=299;  
  8.     //上下文  
  9.     Context ctx;  
  10.     @Override  
  11.     protected void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.main);  
  14.         ctx=this;  
  15.         initView();  
  16.   
  17.     }  
  18.   
  19.     private void initView() {  
  20.         ivTop=(CircleImageView) findViewById(R.id.iv_top);  
  21.         ivDown=(CircleImageView) findViewById(R.id.iv_down);  
  22.         //给两个圆形的ImageView设置点击事件  
  23.         ivTop.setOnClickListener(this);  
  24.         ivDown.setOnClickListener(this);  
  25.     }  
  26.   
  27.     @Override  
  28.     //设置两个圆形ImageView点击跳转  
  29.     public void onClick(View v) {  
  30.         switch (v.getId()) {  
  31.   
  32.             case R.id.iv_top:  
  33.                 Intent intent=new Intent(MainActivity.this,ShowAllImageActivity.class);  
  34.                 startActivityForResult(intent, INT_TOP);  
  35.                 break;  
  36.   
  37.             case R.id.iv_down:  
  38.                 Intent intent2=new Intent(MainActivity.this,ShowAllImageActivity.class);  
  39.                 startActivityForResult(intent2, INT_DOWN);  
  40.                 break;  
  41.   
  42.             default:  
  43.                 break;  
  44.         }  
  45.     }  
  46.     @Override  
  47.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  48.   
  49.         if(requestCode==INT_TOP){  
  50.             String path = data.getStringExtra("path");  
  51.   
  52.             Glide.with(ctx).load(new File(path)).diskCacheStrategy(DiskCacheStrategy.ALL).centerCrop().into(ivTop);  
  53.   
  54.         }  
  55.         if(requestCode==INT_DOWN){  
  56.             String path = data.getStringExtra("path");  
  57.   
  58.             Glide.with(ctx).load(new File(path)).diskCacheStrategy(DiskCacheStrategy.ALL).centerCrop().into(ivDown);  
  59.   
  60.         }  
  61.         super.onActivityResult(requestCode, resultCode, data);  
  62.     }  
  63.   
  64. }  


显示相册图片的Activity:

[java]  view plain  copy
  1. /** 
  2.  * Created by Administrator on 2016/6/15 0015. 
  3.  * 显示所有图片的activity 
  4.  */  
  5. public class ShowAllImageActivity extends Activity {  
  6.   
  7.     /** 
  8.      * 存储手机中所有图片的list集合 
  9.      */  
  10.     List paths = new ArrayList();  
  11.   
  12.     //用来显示手机中所有图片的GridView  
  13.     private GridView mGridView;  
  14.   
  15.     Context context;  
  16.   
  17.     @Override  
  18.     protected void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         setContentView(R.layout.activity_showallimage);  
  21.         context=this;  
  22.         mGridView=(GridView) findViewById(R.id.gridview);  
  23.   
  24.         //获得手机中所有图片的路径  
  25.         getAllImagePath();  
  26.   
  27.         adapter=new MyGridViewAdapter();  
  28.         mGridView.setAdapter(adapter);  
  29.   
  30.         //设置GridView的条目点击事件  
  31.         mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {  
  32.   
  33.             @Override  
  34.             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {  
  35.                 String path=paths.get(arg2);  
  36.                 //当我点击某个图片的时候代表要给圆形ImageView设置头像,所以跳转到MainActivity  
  37.                 Intent intent=new Intent(context,MainActivity.class);  
  38.                 //仅仅跳转过去不行,必须将当前点击图片的路径带过去  
  39.                 intent.putExtra("path", path);  
  40.   
  41.                 setResult(1,intent);  
  42.   
  43.                 finish();  
  44.             }  
  45.         });  
  46.     }  
  47.   
  48.     private MyGridViewAdapter adapter;  
  49.   
  50.     class MyGridViewAdapter extends BaseAdapter{  
  51.   
  52.         @Override  
  53.         public int getCount() {  
  54.             return paths.size();  
  55.         }  
  56.   
  57.         @Override  
  58.         public Object getItem(int position) {  
  59.             return null;  
  60.         }  
  61.   
  62.         @Override  
  63.         public long getItemId(int position) {  
  64.             return 0;  
  65.         }  
  66.   
  67.         @Override  
  68.         public View getView(int position, View convertView, ViewGroup parent) {  
  69.             ViewHolder vh;  
  70.             if(convertView==null){  
  71.                 //这里面的item是一个自定义的View继承线性布局,继承什么布局不重要,  
  72.                 // 重要的是将item的宽高设置成一样;感觉这个效果项目中很多地方都能用到  
  73.                 convertView=View.inflate(context, R.layout.gridview_item, null);  
  74.                 vh=new ViewHolder();  
  75.                 vh.imageView=(ImageView) convertView.findViewById(R.id.photo);  
  76.                 convertView.setTag(vh);  
  77.             }else{  
  78.                 vh=(ViewHolder) convertView.getTag();  
  79.             }  
  80.             //当前item要加载的图片路径  
  81.             String path=paths.get(position);  
  82.             //使用谷歌官方提供的Glide加载图片  
  83.             Glide.with(context).load(new File(path)).diskCacheStrategy(DiskCacheStrategy.ALL).centerCrop().into(vh.imageView);  
  84.   
  85.             return convertView;  
  86.         }  
  87.   
  88.     }  
  89.     class ViewHolder{  
  90.         ImageView imageView;  
  91.     }  
  92.   
  93.     /** 
  94.      * 获得所有图片的路径 
  95.      */  
  96.     private void getAllImagePath() {  
  97.         Cursor cursor = getContentResolver().query(  
  98.                 MediaStore.Images.Media.EXTERNAL_CONTENT_URI, nullnullnullnull);  
  99.         //遍历相册  
  100.         while (cursor.moveToNext()) {  
  101.             String path = cursor.getString(cursor.getColumnIndex(MediaColumns.DATA));  
  102.             //将图片路径添加到集合  
  103.             paths.add(path);  
  104.         }  
  105.         cursor.close();  
  106.     }  
  107. }  

更多相关文章

  1. Android webview 实现h5中调用原生系统相册/相机并进行图片压缩
  2. android app 浅谈文件上传(图片和文件)
  3. Android显示图片避免OOM和ANR小结
  4. 毕加索的艺术——Picasso,一个强大的Android图片下载缓存库,OkHtt
  5. Android异步加载图像小结----演化理解 Android 异步
  6. android ListView常见问题解决方法(滚动背景变黑,去除滑动时阴影,拖
  7. android使用ImageView加载本地SdCard图片和加载网络图片
  8. 源码分析android 系统framework(二)之view的布局加载流程
  9. Android中的WebView进行直接加载网页(要注意解决权限问题)

随机推荐

  1. AndroidStudio官方的Android(安卓)使用 L
  2. Android(安卓)2.1移植
  3. android -------- java虚拟机和Dalvik虚
  4. Android(安卓)TV开发总结(一)构建一个TV ap
  5. [系统掌握Android] 三步走场景
  6. Android(安卓)Studio Analyze APK 一直显
  7. Android(安卓)Fragment使用(三) Activity
  8. Android(安卓)沉浸式状态栏与华为虚拟按
  9. Android(安卓)— 之内容提供器(Content Pr
  10. 【Android(安卓)数据库框架总结,总有一个