这个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 paths = new ArrayList();
//用来显示手机中所有图片的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();
}
}
点击打开链接免费下载源码