手机相册的展示能满足大部分需求,但是就是有那么些产品经理想搞事情。要仿照微信的自定义相册来做。没办法,产品的合理需求必须要满足。现在咱们开始搞……
一、仿微信自定义相册界面
原谅道长的无能,不能把做的Demo弄个动图上来,只能截图……
相册的主界面:
图片的预览界面:
二、功能实现
记住在清单文件中添加权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
至于功能实现道长就不一一介绍了,文章最后道长会把Demo链接贴上
图片加载
从手机内存中读取信息加载图片
public void loadForTask(int type) {
HashMap<String, ImageFolderEntity> mDataFolder = new HashMap<String, ImageFolderEntity>();
Cursor cursor = MediaStore.Images.Media.query(getContentResolver(), MediaStore.Images.Media.EXTERNAL_CONTENT_URI, ImageEntity.STORE_IMAGES, null, null, MediaStore.Images.Media.DATE_TAKEN + " desc");
if (cursor != null) {
while (cursor.moveToNext()) {
ImageEntity entity = new ImageEntity();
long id = cursor.getLong(0);
String name = cursor.getString(1);
if (TextUtils.isEmpty(name)) {
continue;
}
String path = cursor.getString(2);
long size = cursor.getLong(3);
long timeAdd = cursor.getLong(4);
long timeModify = cursor.getLong(5);
long timeToken = cursor.getLong(6);
entity.setId(id);
entity.setName(name);
entity.setUrl(path);
entity.setSize(size);
entity.setTimeAdd(timeAdd);
entity.setTimeModify(timeModify);
entity.setTimeToken(timeToken);
if (entity.isRang7()) {
String fileName = getString(R.string.folder_recent);
ImageFolderEntity folder = mDataFolder.get(fileName);
if (folder != null) {
folder.addFile(entity);
} else {
ImageFolderEntity newFolder = new ImageFolderEntity(fileName);
newFolder.setPath(path.replace(name, ""));
newFolder.setName(fileName);
newFolder.addFile(entity);
mDataFolder.put(fileName, newFolder);
}
}
String folderName = getFolderName(path);
ImageFolderEntity folder = mDataFolder.get(folderName);
if (folder != null) {
folder.addFile(entity);
} else {
ImageFolderEntity newFolder = new ImageFolderEntity();
newFolder.setPath(path.replace(name, ""));
newFolder.setName(folderName);
newFolder.addFile(entity);
mDataFolder.put(folderName, newFolder);
}
}
cursor.close();
}
List<ImageFolderEntity> mDataDDR = new ArrayList<ImageFolderEntity>();
if (!mDataFolder.isEmpty()) {
mDataDDR.addAll(mDataFolder.values());
Collections.sort(mDataDDR);
mFolderAdapter.update(mDataDDR);
int lastPosition = PreferencesUtil.getInt("folder-last-position", 0);
if (lastPosition >= mFolderAdapter.getCount()) {
}
mGridAdapter.update(mFolderAdapter.getItem(lastPosition).getList());
mFolderAdapter.setSelection(lastPosition);
String photoName = mFolderAdapter.getItem(lastPosition).getName();
mTextFolder.setText(photoName);
mMenuWindows.setListSize(mFolderAdapter.getCount());
}
}
点击相册列表,加载相应的相册的图片
folderList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View view, int position, long id) {
PreferencesUtil.putInt("folder-last-position", position);
ImageFolderEntity entity = mFolderAdapter.getItem(position);
mGridAdapter.update(entity.getList());
mFolderAdapter.setSelection(position);
String photoName = entity.getName();
mTextFolder.setText(photoName);
view.postDelayed(new Runnable() {
@Override
public void run() {
mMenuWindows.dismiss();
}
}, 200);
}
});
在主界面点击选中图片的逻辑放在adapter中,通过回调实现主界面的修改
holder.check.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
if(!element.isCheck()){
int size = mResult.size();
if(size>= ImagesBaseActivity.MAX_SEND){
String format = mContext.getString(R.string.format_warn_max_send);
String warn = String.format(format, ImagesBaseActivity.MAX_SEND);
Toast.makeText(mContext, warn, Toast.LENGTH_SHORT).show();
return;
}
element.setCheck(true);
mResult.add(element);
}else{
element.setCheck(false);
mResult.remove(element);
}
notifyDataSetChanged();
if(postCallBack!=null){
postCallBack.onPost();
}
}
});
----------------------------------------------------
public ImagePost getPostCallBack() {
return postCallBack;
}
public void setPostCallBack(ImagePost postCallBack) {
this.postCallBack = postCallBack;
}
-----------------------------------------------------
// 主界面回调
mGridAdapter.setPostCallBack(new ImagePost() {
@Override
public void onPost() {
updateBtn();
}
});
在预览界面点击选中的界面刷新
OnCheckedChangeListener lisChecked = new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton view, boolean isChecked) {
setResult(RESULT_OK);
ImageEntity element = mDatas.get(mPositionInAll);
if (!element.isCheck()) {
int size = sResult.size();
if (size >= ImagesBaseActivity.MAX_SEND) {
String format = mContext.getString(R.string.format_warn_max_send);
String warn = String.format(format, ImagesBaseActivity.MAX_SEND);
Toast.makeText(mContext, warn, Toast.LENGTH_SHORT).show();
mCheckOn.setChecked(false);
return;
}
element.setCheck(true);
sResult.add(element);
} else {
element.setCheck(false);
sResult.remove(element);
}
updateSendBtn();
updateCheckStatus();
}
};
private void updateCheckStatus() {
boolean checked = mDatas.get(mPositionInAll).isCheck();
mCheckOn.setOnCheckedChangeListener(null);
mCheckOn.setChecked(checked);
mCheckOn.setOnCheckedChangeListener(lisChecked);
}
private void updateSendBtn() {
boolean isEmpty = sResult.size() == 0;
// mTextSend.setEnabled(!isEmpyt);
tv_picNumber.setEnabled(!isEmpty);
if (isEmpty) {
mTextSend.setTextColor(Color.WHITE);
mTextSend.setText(R.string.complete);
tv_picNumber.setVisibility(View.GONE);
} else {
String format = getString(R.string.format_send_count);
String sendCount = String.format(format, sResult.size(), ImagesBaseActivity.MAX_SEND);
tv_picNumber.setVisibility(View.VISIBLE);
tv_picNumber.setText(sResult.size()+"");
mTextSend.setTextColor(getResources().getColor(R.color.headColor));
}
}
提交图片到服务器(这里道长把返回的图片的路径显示出来)
public void submit(){
ArrayList<Uri> respUris = new ArrayList<Uri>();
if(isOriginal){
for(int i=0;i<sResult.size();i++){
ImageEntity data = sResult.get(i);
Uri uri = Uri.parse("file:///"+data.getUrl());
respUris.add(uri);
}
}else{
for(int i=0;i<sResult.size();i++){
ImageEntity data = sResult.get(i);
Bitmap bm = BitmapUtil.getThumbnail(this, data.getId());
String path = getCachePath();
if(saveCacheDir(path, bm)){
Uri uri = Uri.parse("file:///"+path);
respUris.add(uri);
}
}
}
sResult.clear();
if(respUris!=null && respUris.size()>0){
Intent intent = new Intent();
intent.putParcelableArrayListExtra("result", respUris);
intent.putExtra("isOriginal", isOriginal);
setResult(RESULT_OK, intent);
}else{
setResult(RESULT_CANCELED);
}
finish();
}
仿微信自定义相册有很多零碎的点,这里道长就不一一介绍了,如果需要可以Down下Demo自己去研究。希望这篇博客能为你提供一些帮助。