Android将手机相册图片展示到GridView中
2016-06-19 00:16
399 查看
这个demo虽然实现了圆形头像加载,但是我们今天重点不是说原型头像,重点说加载手机相册图片,相信大家项目中肯定会用到;
如果大家想了解圆形头像加载可以直接下载源码查看,或者看这篇博客圆形头像讲解
首先说下思路:
大家可以看到展示相册的布局使用的GridView,
我们需要知道两点就可以很容易的完成这个demo;
第一:怎么加载系统相册?
第二:怎么讲GridView的item宽高设置成一样?
先说第一个加载系统相册:
Cursor cursor = getContentResolver().query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null); //遍历相册 while (cursor.moveToNext()) { String path = cursor.getString(cursor.getColumnIndex(MediaColumns.DATA)); //将图片路径添加到集合 paths.add(path); } cursor.close();
第二个问题:其实GridView的item是一个自定义的VIew,继承线性布局,虽然我们不知道每个item的高度是多少,但是我们知道他的宽度是多少,所以我们直接将高度设置成等于宽度即可;
public class MyGridViewItem extends LinearLayout{ public MyGridViewItem(Context context, AttributeSet attrs) { super(context, attrs); } public MyGridViewItem(Context context) { super(context); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(getDefaultSize(0, widthMeasureSpec),getDefaultSize(0, heightMeasureSpec)); // childWidthSize是自定义布局的宽 int childWidthSize = getMeasuredWidth(); int childHeightSize = getMeasuredHeight(); // 高度和宽度一样;最后面的是RelativeLayout的宽 heightMeasureSpec = widthMeasureSpec = MeasureSpec.makeMeasureSpec(childWidthSize, MeasureSpec.EXACTLY); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } }
好了,其他的几乎都是一些琐碎的代码
再说下加载图片到item:这里使用的是Glide框架,非常简单:
//当前item要加载的图片路径 String path=paths.get(position); //使用谷歌官方提供的Glide加载图片 Glide.with(context).load(new File(path)).diskCacheStrategy(DiskCacheStrategy.ALL).centerCrop().into(vh.imageView);
好了,接下来看下整体的代码把,下面的代码就不一一讲解了,因为都是一些琐碎的代码,没什么难度:
MainActivity:
public class MainActivity extends Activity implements View.OnClickListener { //主页面上下两个自定义的View(圆形的ImageView) private CircleImageView ivTop; private CircleImageView ivDown; private int INT_TOP=199; private int INT_DOWN=299; //上下文 Context ctx; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ctx=this; initView(); } private void initView() { ivTop=(CircleImageView) findViewById(R.id.iv_top); ivDown=(CircleImageView) findViewById(R.id.iv_down); //给两个圆形的ImageView设置点击事件 ivTop.setOnClickListener(this); ivDown.setOnClickListener(this); } @Override //设置两个圆形ImageView点击跳转 public void onClick(View v) { switch (v.getId()) { case R.id.iv_top: Intent intent=new Intent(MainActivity.this,ShowAllImageActivity.class); startActivityForResult(intent, INT_TOP); break; case R.id.iv_down: Intent intent2=new Intent(MainActivity.this,ShowAllImageActivity.class); startActivityForResult(intent2, INT_DOWN); break; default: break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode==INT_TOP){ String path = data.getStringExtra("path"); Glide.with(ctx).load(new File(path)).diskCacheStrategy(DiskCacheStrategy.ALL).centerCrop().into(ivTop); } if(requestCode==INT_DOWN){ String path = data.getStringExtra("path"); Glide.with(ctx).load(new File(path)).diskCacheStrategy(DiskCacheStrategy.ALL).centerCrop().into(ivDown); } super.onActivityResult(requestCode, resultCode, data); } }
显示相册图片的Activity:
/** * Created by Administrator on 2016/6/15 0015. * 显示所有图片的activity */ public class ShowAllImageActivity extends Activity { /** * 存储手机中所有图片的list集合 */ List<String> paths = new ArrayList<String>(); //用来显示手机中所有图片的GridView private GridView mGridView; Context context; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_showallimage); context=this; mGridView=(GridView) findViewById(R.id.gridview); //获得手机中所有图片的路径 getAllImagePath(); adapter=new MyGridViewAdapter(); mGridView.setAdapter(adapter); //设置GridView的条目点击事件 mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { String path=paths.get(arg2); //当我点击某个图片的时候代表要给圆形ImageView设置头像,所以跳转到MainActivity Intent intent=new Intent(context,MainActivity.class); //仅仅跳转过去不行,必须将当前点击图片的路径带过去 intent.putExtra("path", path); setResult(1,intent); finish(); } }); } private MyGridViewAdapter adapter; class MyGridViewAdapter extends BaseAdapter{ @Override public int getCount() { return paths.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder vh; if(convertView==null){ //这里面的item是一个自定义的View继承线性布局,继承什么布局不重要, // 重要的是将item的宽高设置成一样;感觉这个效果项目中很多地方都能用到 convertView=View.inflate(context, R.layout.gridview_item, null); vh=new ViewHolder(); vh.imageView=(ImageView) convertView.findViewById(R.id.photo); convertView.setTag(vh); }else{ vh=(ViewHolder) convertView.getTag(); } //当前item要加载的图片路径 String path=paths.get(position); //使用谷歌官方提供的Glide加载图片 Glide.with(context).load(new File(path)).diskCacheStrategy(DiskCacheStrategy.ALL).centerCrop().into(vh.imageView); return convertView; } } class ViewHolder{ ImageView imageView; } /** * 获得所有图片的路径 */ private void getAllImagePath() { Cursor cursor = getContentResolver().query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null); //遍历相册 while (cursor.moveToNext()) { String path = cursor.getString(cursor.getColumnIndex(MediaColumns.DATA)); //将图片路径添加到集合 paths.add(path); } cursor.close(); } }
点击打开链接免费下载源码
相关文章推荐
- Android消息机制的原理剖析—闭环总结
- android字符串+数字变量方法之%1$s、%1$d的用法
- Android:menu的使用
- Android简易实战教程--第一话《最简单的计算器》
- Android简易实战教程--第一话《最简单的计算器》
- Android6邪门了,刷机神器TWRP居然在重启动之后消失了,可我没有重装系统啊。
- 解决android - No view found for id 0xxxxxxxx等问题
- Android 采用post方式提交数据到服务器
- Android 之dragger使用
- Android 之dragger使用
- Android 之dragger使用
- Android 开源框架ImageLoader完全解析(一)--- 基本介绍及使用
- github项目解析(五)-->android日志框架
- Android设置全屏
- 致Android-那些年,我们一起踩过的坑
- Rxjava + retrofit + dagger2 + mvp搭建Android框架
- Rxjava + retrofit + dagger2 + mvp搭建Android框架
- Rxjava + retrofit + dagger2 + mvp搭建Android框架
- android studio界面简单介绍
- Android:代码的规范