android仿最新6.2版本微信相册

仿微信相册选择图片,查看大图,写的不太好,希望评论指出不足,谅解,先介绍一下我的基本思路

第一步获取手机上的所有图片路径:

                Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                ContentResolver contentResolver = getContentResolver();
                //获取jpeg和png格式的文件,并且按照时间进行倒序
                Cursor cursor = contentResolver.query(uri, null, MediaStore.Images.Media.MIME_TYPE + "=\"image/jpeg\" or " +
                        MediaStore.Images.Media.MIME_TYPE + "=\"image/png\"", null, MediaStore.Images.Media.DATE_MODIFIED+" desc");
                if (cursor != null){
                    while (cursor.moveToNext()){
                        //do something
                    }
                    handler.sendEmptyMessage(0);
                }

我的存储格式

    /** 按时间排序的所有图片list */
    private ArrayList<SingleImageModel> allImages;
    /** 按目录排序的所有图片list */
    private ArrayList<SingleImageDirectories> imageDirectories;
     /**
     * 一个文件夹中的图片数据实体
     */
    private class SingleImageDirectories{
        /** 父目录的路径 */
        public String directoryPath;
        /** 目录下的所有图片实体 */
        public ImageDirectoryModel images;
    }

一个是全部图片的存储顺序,第二个是按照目录的图片存储顺序

第二步,获取到图片之后,放入到gridview中进行显示,但是BitmapFactory.decodeFile()函数会非常耗时,所以为了使得非常流畅的显示图片,创建一个类AlbumBitmapCacheHelper.class,用来异步加载图片,

该类使用LruCache<String,Bitmap> cache来缓存Bitmap,使得存储图片不会造成oom,我这里设置cache的初始大小为1/4的运行时内存

然后使用ThreadPoolExecutor线程池来处理图片的显示,线程池大小应该设置适中

做完这两件事情之后就可以用来加载图片了,方法getBitmap用来讲

        Bitmap bitmap = getBitmapFromCache(path, width, height);
        //如果能够从缓存中获取符合要求的图片,则直接回调
        if (bitmap != null) {
        } else {
            //新建线程放入线程池去处理该图片的显示
        }
        return bitmap;

如果cache中找不到该图片,则调用BitmapFactory.decodeFile()去加载图片,加载图片不能够直接加载原图,会造成OOM,所以要去处理压缩比

                        BitmapFactory.Options options = new BitmapFactory.Options();
                        options.inJustDecodeBounds = true;
                        BitmapFactory.decodeFile(path, options);
                        options.inSampleSize = computeScale(options, width, height);
                        options.inJustDecodeBounds = false;
                        bitmap = BitmapFactory.decodeFile(path, options);
                        //获取之后,放入缓存,以便下次继续使用
                        if (bitmap != null && cache!=null) {
                            cache.put(path, bitmap);
                        }

方法computeScale()主要是计算图片最小的压缩比,

这样在gridview中的getview方法中去调用AlbumBitmapCacheHelper.class的getBitmap方法即可,
但是这样会有很多的问题:
一个问题就是图片显示会闪,这主要是由于getview的view的复用,解决方法就是使用settag方法
holder.iv_content.setTag(path);
将要显示的Imageview的tag设置为需要显示的图片路径,这样在回调的时候使用方法gridView.findViewWithTag(path),找到这个imageview进行显示,闪的问题就解决了

第二个问题就是加载速度很慢,拉的速度很快的情况下,图片要很久才会加载出来,特别是很大的图片,比如拍照和截图的照片,
解决方法第一方案就是在AlbumBitmapCacheHelper类中维护一个ArrayList<String> currentShowString,在getview方法中,如果该图片要显示,则直接将path加入到该list中,同时如果这个view的tag不为空,说明该view的原来的path是不需要显示的,所以需要将这个path从list中删除:
            //优化显示效果
            if(holder.iv_content.getTag() != null) {
                String remove = (String) holder.iv_content.getTag();
                AlbumBitmapCacheHelper.getInstance().removePathFromShowlist(remove);
            }
            AlbumBitmapCacheHelper.getInstance().addPathToShowlist(path);

这样在线程池中的处理方式就是先查看需要显示的path是否在list中,如果没有在list中,则该线程直接关闭,如果在list中,则显示该图片

if (!currentShowString.contains(path)||cache==null) {
         return;
}
第二个方案就是如果显示的图片很大,特别是拍照,截图和解图的图片,decode有时会耗时几秒中,微信显示效果非常好,我自己想出来的处理的方式就是
***第一步,从应用的缓存temp目录下取,如果取不到,
***第二步,计算图片的压缩比例samplesize,如果samplesize < 4,图片的BitmapFactory.decodeFile()时间短,直接返回图片,但是如果 samplesize > 4,执行第三步
***第三步则将压缩后的图片存入temp目录下,以便下次快速取出这样显示图片的效果就出来了,显示的速度除了和微信一样第一次大图加载慢之外,之后的显示就能很快了,

                     if (!new File(CommonUtil.getDataPath()).exists())
                        new File(CommonUtil.getDataPath()).mkdirs();
                    //临时文件的文件名
                    String tempPath = CommonUtil.getDataPath() + hash + ".temp";
                    //如果该文件存在
                    if (new File(tempPath).exists())
                        bitmap = BitmapFactory.decodeFile(tempPath);
                    ......
                    //第三步,如果缩放比例大于4,该图的加载会非常慢,所以将该图保存到临时目录下以便下次的快速加载
                        if (options.inSampleSize >= 4) {
                            try {
                                File file = new File(tempPath);
                                if (!file.exists())
                                    file.createNewFile();
                                FileOutputStream fos = new FileOutputStream(file);
                                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                                bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
                                fos.write(baos.toByteArray());
                                fos.flush();
                                fos.close();
                            } catch (FileNotFoundException e) {
                                e.printStackTrace();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }

问题就差不多解决了

第三步大图的查看,大图只要是使用的网上找的ZoomImageView+viewpagger的组合,但是使用这个出现的问题就是很容易OOM,没办法,我的处理方式就是在点进去大图的时候

public void releaseHalfSizeCache() {
    cache.resize((int) (Runtime.getRuntime().maxMemory() / 1024 / 8));
}

直接将cache的大小变成原来的一半,因为查看大图页,加载一张大图占用的内存就很大,这样显示效果页还凑合,有别的方法,一定要留言告诉我

注意:大图的查看由于需要通过intent传递数据,但是intent传递的数据大小不能太大,如果手机上有几千张图片,则数据量大小可能会超过intent所能传递的最大量,所以可以写入一个公共的地方,内存,数据库,文件都可以,

//TODO 这里由于涉及到intent传递的数据不能太大的问题,所以如果需要,这里要进行另外的处理,写入到内存或者写入到文件中
intent.putExtra(PickBigImagesActivity.EXTRA_DATA, getAllImagesFromCurrentDirectory());

我暂时没有处理~~

第四步就是图片选择完成之后,完成善后工作,将AlbumBitmapCacheHelper类中cache清空,差不多就这样了,还有很多的小问题,比如图片时间的显示,具体大家看源码

                       

源码下载点我

由于源码是android studio的工程,所以不能直接导入eclipse,必须要手动拷贝文件,在这里放出所有的文件,方便eclipse

时间: 2024-11-15 19:26:46

android仿最新6.2版本微信相册的相关文章

Android 仿微信朋友圈发动态功能(相册图片多选)

代码分享 代码名称: 仿微信朋友圈发动态功能(相册图片多选) 代码描述: 仿微信朋友圈发动态功能(相册图片多选) 代码托管地址: http://www.apkbus.com/android-152760-1-1.html 代码作者: 楼主 代码效果图: 本帖最后由 ^.^ 于 2014-7-8 16:23 编辑 <ignore_js_op> <ignore_js_op> <ignore_js_op> DEMO一共13个类 大约2000行代码,童鞋们耐心点看基本思路是:1

Android仿微信UI布局视图(圆角布局的实现)

圆角按钮,或布局可以在xml文件中实现,但也可以使用图片直接达到所需的效果,以前版本的微信就使用了这种方法. 实现效果图:    不得不说,这种做法还是比较方便的. 源代码: MainActivity(没写任何代码,效果全在布局文件中实现): package com.android_settings; import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity

Android仿微信下拉列表实现

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文要实现微信6.1中点击顶部菜单栏的"+"号按钮时,会弹出一个列表框.这里用的了Activity实现,其实最好的方法可以用ActionBar,不过这货好像只支持3.0以后的版本.本文的接上文Android仿微信底部菜单栏+顶部菜单栏(附源码) 效果: 一.仿微信下拉列表布局pop_dialog.xml <?xml version="1.0" encodi

android仿微信红包动画、Kotlin综合应用、Xposed模块、炫酷下拉视觉、UC浏览器滑动动画等源码

Android精选源码 仿微信打开红包旋转动画 使用Kotlin编写的Android应用,内容你想象不到 Android手机上的免Root Android系统日志Viewer 一个能让微信 Material Design 化的 Xposed 模块 仿最新版微信 Rxjava+Retrofit+MVP+Glide 技术开发 android一键清理/内存加速,缓存清理,自启管理,软件管理 android打造酷炫下拉视差效果并解决各种滑动冲突源码 android实现UC浏览器首页滑动动画实现 andr

【Android 仿微信通讯录 导航分组列表-上】使用ItemDecoration为RecyclerView打造带悬停头部的分组列表

[Android 仿微信通讯录 导航分组列表-上]使用ItemDecoration为RecyclerView打造带悬停头部的分组列表 一 概述 本文是Android导航分组列表系列上,因时间和篇幅原因分上下,最终上下合璧,完整版效果如下: 上部残卷效果如下:两个ItemDecoration,一个实现悬停头部分组列表功能,一个实现分割线(官方demo) 网上关于实现带悬停分组头部的列表的方法有很多,像我看过有主席的自定义ExpandListView实现的,也看过有人用一个额外的父布局里面套 Rec

Android仿微信朋友圈图片浏览器(支持图片手势缩放,拖动)

※效果 ※使用到的开源库 PhotoView 图片缩放:支持双击缩放,手指捏拉缩放 https://github.com/chrisbanes/PhotoView Universalimageloader 图片下载缓存库 https://github.com/nostra13/Android-Universal-Image-Loader ViewPagerIndicator 分页指示器 https://github.com/JakeWharton/Android-ViewPagerIndicat

android必学的两个项目,android仿京东、android仿微信项目(后期持续更新)

本着学习的态度,当前栏目本人上传的资源一概不需要资源下载分 这里分享两个学习android的项目: 1.android仿微信项目,源码地址:http://download.csdn.net/detail/a358763471/8702533 2.android仿京东商城项目,源码地址:http://download.csdn.net/detail/a358763471/8702393

Android仿微信语音聊天

完整代码下载地址: Android仿微信语音聊天 效果图: 分析: 1.自定义Button中要复写onTouchEvent的DOWN,MOVE,UP三种状态,对正常按下,想要取消发送,抬起三种动作进行侦听处理. 2.Dialog共有三种状态,除上图所示的两种外,还有一个录音时间过短的提示.其中录音状态中的音量可以变化. 3.显示录音的ListView的item中有一个录音时长(TextView),一个播放动画(View)和一个头像(ImageView). 4.录音类里有两个成员:录音长度,录音路

android 仿QQ手机版

千人2群开启,欢迎大家围观打酱油,群号145667827 您当前位置 : JavaApk-安卓应用游戏源码服务专家 » QQ » Android项目源码界面超级华丽的仿QQ最新版本 Android项目源码界面超级华丽的仿QQ最新版本 05 2014.05 作者:JavaApk   发布:2014-05-05 12:40   字符数:222   分类:QQ, VIP源码, 即时聊天   阅读: 2,392 次   18条评论 本项目是一个高仿QQ最新版本的项目,界面超级华丽,使用了大量的自定义控件