android 仿微信选取相册_Android模仿微信选择图片

本文介绍了如何在Android应用中实现一个类似微信的图片选择功能,包括从SD卡读取图片、显示图片列表、限制选择数量、选择不同文件夹下的图片、自定义视图显示选中图片数量,以及拍照后裁剪头像等功能。实现思路涉及在子线程读取图片、使用RecyclerView显示、多item布局、PopupWindow显示文件夹列表、以及适配不同数量的图片布局。
摘要由CSDN通过智能技术生成

前言

最近公司需要做一个类似微信那种选择头像和上传图片的功能,本想上github上找的,后来想了想,还是自己做一个,不仅方便以后用(毕竟自己写的修改起来也比较方便),还可以学到一些知识,废话少说,先看效果图:

(ps:大致的功能就这样,拍照功能就是拍了照片之后跳到剪切的页面,这里没有截出来,主要是为了压缩下gif图的大小)

现在来简单的介绍下有什么功能:

可根据传入的值控制是选择头像还是上传图片,大于1就是选择图片,等于1救是选择头像

可根据传入的值控制选择图片的数量,并且当选中的图片数量等于这个数量时,则其他没有被选中的图片变成不可选择

可选择不同文件夹下的图片

自定义ViewGroup显示选中的图片数,不同的数量显示的格式不一样(gif最后那一帧录制的不是很清楚),类似微信那种,1张,2张还是9张显示的格式不同

拍照剪切头像

大概下就是这么些,现在我们来说说实现的思路,主要分为几步

在子线程中读出sd卡下所有的文件夹下的图片,并且在RecyclerView中显示出来

RecyclerView采用多item布局方式,分开拍照和图片,主要是方便修改拍照的view,这里只是用图片显示

适配每个图片等宽度和高度为屏幕宽度等三分之一

底部采用PopupWindow显示出所有的图片所在的文件夹

如果是多选图片,则为每个view添加checkbox的选中监听,否则就调用系统的剪切图片功能,剪切完成之后显示出来

根据选中的图片数,展示不同的布局

好了,现在我们来看看代码

ImageSelectActivity

这个activity主要是用来显示从sd中读取出来的图片

package com.myimageselectcontainer;

import android.app.Activity;

import android.app.ProgressDialog;

import android.content.ContentResolver;

import android.content.Intent;

import android.database.Cursor;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.net.Uri;

import android.os.Bundle;

import android.os.Environment;

import android.os.Handler;

import android.provider.MediaStore;

import android.support.annotation.BoolRes;

import android.support.annotation.Nullable;

import android.support.v7.app.AppCompatActivity;

import android.support.v7.widget.GridLayoutManager;

import android.support.v7.widget.LinearLayoutManager;

import android.support.v7.widget.RecyclerView;

import android.util.DisplayMetrics;

import android.util.Log;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.view.WindowManager;

import android.widget.LinearLayout;

import android.widget.PopupWindow;

import android.widget.TextView;

import android.widget.Toast;

import com.myimageselectcontainer.adapter.ImageDirAdapter;

import com.myimageselectcontainer.adapter.MyAdapter;

import com.myimageselectcontainer.adapter.SpacesItemDecoration;

import com.myimageselectcontainer.bean.ImageBean;

import com.myimageselectcontainer.bean.ImageDirBean;

import com.myimageselectcontainer.click.OnChangeListener;

import com.myimageselectcontainer.click.OnImageDirItemListener;

import com.myimageselectcontainer.click.OnItemClickListener;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.FilenameFilter;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.HashSet;

import java.util.List;

public class ImageSelectActivity extends AppCompatActivity implements OnItemClickListener,

OnChangeListener, View.OnClickListener, PopupWindow.OnDismissListener, OnImageDirItemListener {

private static final int PHOTO_REQUEST_CAMERA = 1;// 拍照

private static final int PHOTO_REQUEST_CUT = 2;// 结果

private ProgressDialog mProgressDialog;

/**

* 存储文件夹中的图片数量

*/

private int mPicsSize;

/**

* 扫描拿到所有的图片文件夹

*/

private List imageDirBeans = new ArrayList<>();

/**

* 图片数量

*/

private int totalCount = 0;

/**

* 临时的辅助类,用于防止同一个文件夹的多次扫描

*/

private HashSet mDirPaths = new HashSet<>();

/**

* 所有的图片

*/

private List mImages = new ArrayList<>();

/**

* 选中的图片集合

*/

private ArrayList mSelectImages = new ArrayList<>();

/**

* 最大的图片数

*/

private int maxImageCount = 9;

/**

* 屏幕高度

*/

private int mScreenHeight;

/**

* 用来存储选中的文件

*/

private File mSelectFile;

/**

* 用于显示全部文件夹

*/

private PopupWindow mPopupWindow;

/**

* 当PopupWindow显示或者消失时改变背景色

*/

private WindowManager.LayoutParams lp;

/**

* 拿到传过来的值,测试选择图片

*/

private int select;

/**

* 存储拍照和选中的图片

*/

private File file;

private MyThread mThread;

private ImageDirBean imageDirBean;

private ImageBean imageBean;

private RecyclerView rcyImageSelect;

private TextView tvImageCount;

private TextView tvImageDir;

private TextView tvConfirm;

private LinearLayout linearLayout;

private Handler mHandler = new Handler() {

public void handleMessage(android.os.Message msg) {

mProgressDialog.dismiss();

//绑定数据

setData();

if (mThread != null && !mThread.isInterrupted()) {

mThread.isInterrupted();

}

}

};

private MyAdapter mAdapter;

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_image_select);

select = getIntent().getIntExtra("select", 0);

maxImageCount = select;

rcyImageSelect = (RecyclerView) findViewById(R.id.rcyView_imageSelect);

tvImageCount = (TextView) findViewById(R.id.tv_imageCount);

tvImageDir = (TextView) findViewById(R.id.tv_imageDir);

tvConfirm = (TextView) findViewById(R.id.tv_confirm);

linearLayout = (LinearLayout) findViewById(R.id.linearLayout);

mPopupWindow = new PopupWindow(this);

//获取屏幕高度,设给PopupWindow

DisplayMetrics outMetrics = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(outMetrics);

mScreenHeight = outMetrics.heightPixels;

lp = getWindow().getAttributes();

rcyImageSelect.setLayoutManager(new GridLayoutManager(this, 3));

tvConfirm.setText("确定" + mSelectImages.size() + "/" + maxImageCount);

getImageList();

setImageDirData();

tvImageDir.setOnClickListener(this);

tvConfirm.setOnClickListener(this);

mPopupWindow.setOnDismissListener(this);

file = new File(Environment.getExternalStorageDirectory(), "temp.jpg");

}

private void setData() {

mAdapter = new MyAdapter(this, maxImageCount, mImages, this, this);

rcyImageSelect.setAdapter(mAdapter);

rcyImageSelect.addItemDecoration(new SpacesItemDecoration(2));

tvImageCount.setText(totalCount + "张");

}

//图片文件数据

private void setImageDirData() {

if (!imageDirBeans.isEmpty()) {

View contentView =

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中实现仿微信宫格相册的功能可以通过以下步骤来完成。 首先,需要使用RecyclerView来展示图片。RecyclerView是一个功能强大的视图控件,可以以列表的形式展示内容,并且支持滚动、刷新等功能。 其次,需要定义一个适配器来管理RecyclerView中的数据。适配器负责将图片数据绑定到RecyclerView的视图上,并且处理用户的交互事件。 然后,需要创建一个数据模型类来表示每个图片的信息,例如图片的路径、名称等。这些信息可以通过扫描手机的相册来获取。 接下来,可以使用第三方库如Glide或Picasso来加载和显示图片。这些库可以帮助我们有效地处理图片的加载、缓存和显示。 在展示图片时,可以使用GridLayout来实现宫格布局,即将图片分成若干个格子进行排列。可以根据不同的需求设置每行显示的图片数量,以及格子之间的间距。 为了提高用户体验,可以支持图片的点击事件。当用户点击某张图片时,可以使用弹出框或者打开新的界面来展示图片的详细信息,如放大预览、分享等。 最后,为了更好地管理和显示图片,可以使用数据库来存储图片的信息,例如图片的路径、标签等。这样可以方便地进行搜索、排序和过滤等操作。 总的来说,实现仿微信宫格相册的功能需要使用RecyclerView、适配器、数据模型类、第三方图片加载库、GridLayout布局以及数据库等技术。通过合理地组合和使用这些技术,可以实现一个功能完善且用户体验良好的相册应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值