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

 

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

 


点击打开链接免费下载源码

 

 

 

Android将手机相册图片展示到GridView中_第1张图片  Android将手机相册图片展示到GridView中_第2张图片

 

 

 

 

 

 

 

 

你可能感兴趣的:(android)