您的位置:首页 > 移动开发 > Android开发

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();
}
}


点击打开链接免费下载源码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: