手机相机和相册:仿微信自定义相册

手机相册的展示能满足大部分需求,但是就是有那么些产品经理想搞事情。要仿照微信的自定义相册来做。没办法,产品的合理需求必须要满足。现在咱们开始搞……

一、仿微信自定义相册界面

原谅道长的无能,不能把做的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自己去研究。希望这篇博客能为你提供一些帮助。

源码下载

CustomPhotoDemo


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值