打开图库中图片为什么从模糊变清晰

1. 有一点要明白,图片要进行显示,首先要先将图片进行decode,然后才干显示

2. 图片decode须要时间,越大的图片,细节越多的图片,那么它decode时间就越长

3. 最笨的做法就是,等图片decode完了,我们再显示,在decode完之前就看到黑色的背景。但

这种做法不太友好,尤其是大的图片的时候,等待的时间就越长

为了给客户更好的用户体验,我们会先decode一张图片的thumbnail即缩略图, 当我们点击一张

图片进来之后,我们首先看到的是这个图片的thumbnail,这样用户就知道图片有被显示

可是,因为thumbnail的分辨率有限,贴到屏幕上之后就会比較模糊。这就是为什么一開始看到模

糊的原因

4. 这个时候,还是逃不掉decode整张图片的步骤,我们全然能够等整张图片decode完成之后再

更新到屏幕。

但我们觉得这样的方式也不是太好,为什么不是decode出一部分就显示一部分呢?

所以终于的方法是:我们将整个图片分成小块(tile),high resolution的图片,tile的size

是510,普通图片的tile size是254,然后我们依照从上到下,从左到右的顺序依次decode

tile,所以你看到图片一小块一小块的显示,图片逐步变清晰的过程

所以,眼下此方案已经做到了最优化,只是因为本身decode须要时间,我们不能做到一下显示清晰

图片,或者缩短图片变清晰的时间。

 void updateFromConfiguration(Context context, Resources resources, int wPx, int hPx,
int awPx, int ahPx) {
Configuration configuration = resources.getConfiguration();
isLandscape = (configuration.orientation == Configuration.ORIENTATION_LANDSCAPE);
isTablet = resources.getBoolean(R.bool.is_tablet);
isLargeTablet = resources.getBoolean(R.bool.is_large_tablet);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
isLayoutRtl = (configuration.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL);
} else {
isLayoutRtl = false;
}
widthPx = wPx;
heightPx = hPx;
availableWidthPx = awPx;
availableHeightPx = ahPx; updateAvailableDimensions(context);
}

图片双击变大算法

图片双击放大倍数和图片大小、显示图片的view大小,及图片当前的scale大小均有关系。

为了避免图片放大过大,设置了一个放大倍数的最大限制SCALE_LIMIT,眼下该值为4.

详细算法例如以下所看到的:

图片的宽和高分别记为:imageW imageH

显示图片的view宽和高分别记为:viewW viewH

几个重要的比例记为:

scale_1 = viewW / imageW;
scale_2 = viewH / imageH;
scale_3 = viewW / imageH;
scale_4 = viewH / imageW;

假设当前图片的宽高比>2或者<0.5,则依照例如以下算法计算放大倍数zoomRate:

(1)当前scale = min(scale_1, scale_2);

(2)zoomRate = min(max(scale_1, scale_2), max(scale_3, scale_4));

(3)假设zoomRate > SCALE_LIMIT,则zoomRate = SCALE_LIMIT;

(4)假设scale >= zoomRate,则保留(1)的结果从第(2)步又一次计算zoomRate值,否则跳至(6)

zoomRate = max(max(scale_1, scale_2), max(scale_3, scale_4));

(5)假设zoomRate > SCALE_LIMIT,则zoomRate = SCALE_LIMIT;

(6)此时zoomRate值即是图片应该放大的倍数。

假设当前图片的宽高比<=2或者>=0.5,则依照例如以下算法计算放大倍数zoomRate:

(1)当前scale = min(scale_1, scale_2);

(2)largerInitRate = max(min(scale_1, scale_2), min(scale_3, scale_4));

(3)假设largerInitRate > SCALE_LIMIT,则largerInitRate = SCALE_LIMIT;

(4)zoomRate = min(scale_2, largerInitRate * 2.0f);

(5)假设zoomRate > SCALE_LIMIT,则zoomRate = SCALE_LIMIT;

(6)假设scale >= zoomRate,则保留前3步的结果,从第(4)步又一次计算zoomRate值,否则跳至(8)

zoomRate = largerInitRate * 2.0f;

(7)假设zoomRate > SCALE_LIMIT,则zoomRate = SCALE_LIMIT;

(8)此时zoomRate值即是图片应该放大的倍数。

转载请注明出处:周木水的CSDN博客 http://blog.csdn.net/zhoumushui


Android Gallery2源代码分析的更多相关文章

  1. Android 消息处理源代码分析(1)

    Android 消息处理源代码分析(1) 在Android中,通常被使用的消息队列的代码在文件夹\sources\android-22\android\os下,涉及到下面几个类文件 Handler.j ...

  2. Android HandlerThread 源代码分析

    HandlerThread 简单介绍: 我们知道Thread线程是一次性消费品,当Thread线程运行完一个耗时的任务之后.线程就会被自己主动销毁了.假设此时我又有一 个耗时任务须要运行,我们不得不又 ...

  3. Android HttpURLConnection源代码分析

    Android HttpURLConnection源代码分析 之前写过HttpURLConnection与HttpClient的差别及选择.后来又分析了Volley的源代码. 近期又遇到了问题,想在V ...

  4. Android KLog源代码分析

    Android KLog源代码分析 Android KLog源代码分析 代码结构 详细分析 BaseLog FileLog JsonLog XmlLog 核心文件KLogjava分析 遇到的问题 一直 ...

  5. android开发源代码分析--多个activity调用多个jni库的方法

    android开发源代码分析--多个activity调用多个jni库的方法 有时候,我们在开发android项目时会遇到须要调用多个native c/jni库文件,下面是本人以前实现过的方法,假设有知 ...

  6. Android 消息处理源代码分析(2)

    Android 消息处理源代码分析(1)点击打开链接 继续接着分析剩下的类文件 Looper.java public final class Looper { final MessageQueue m ...

  7. Appium Android Bootstrap源代码分析之启动执行

    通过前面的两篇文章<Appium Android Bootstrap源代码分析之控件AndroidElement>和<Appium Android Bootstrap源代码分析之命令 ...

  8. Android AsyncTask 源代码分析

    AsyncTask源代码分析 public abstract class AsyncTask<Params, Progress, Result> { //日志TAG private sta ...

  9. Appium Android Bootstrap源代码分析之简单介绍

    在上一个系列中我们分析了UiAutomator的核心源代码,对UiAutomator是怎么执行的原理有了根本的了解.今天我们会開始另外一个在安卓平台上基于UiAutomator的新起之秀--Appiu ...

随机推荐

  1. day03_12/13/2016_bean的管理之依赖注入

  2. [转]linux 下 join命令总结

    转自:http://blog.chinaunix.net/uid-20754793-id-177777.html 有两个文件需要合并,开始写了脚本实现,忽然发现join命令能够完全替代,总结了一下jo ...

  3. 【MySQL】二进制分发安装

    操作系统:Red Hat Enterprise Linux Server release 6.5 Mysql安装包:mysql-5.6.34-linux-glibc2.5-x86_64.tar.gz ...

  4. Apache服务器防范DoS

    Apache服务器对拒绝服务攻击的防范主要通过软件Apache DoS Evasive Maneuvers Module  来实现.它是一款mod_access的替代软件,可以对抗DoS攻击.该软件可 ...

  5. 3星|《IBM商业价值报告:区块链》:一些重要行业对区块链的态度和已经发生的区块链的应用

    区块链项目开发指南 (区块链技术丛书) 介绍IBM的专家们调研许多重要行业与组织后总结的各行业对区块链的态度和实际的应用.看起来有点意思,不过有两个缺点: 1:这些实际已经发生的应用基本没看到相关的新 ...

  6. HDU_5734_数学推公式

    题意:给一个向量W={w1,w2……,wn},和一个向量B,B的分量只能为1和-1.求||W-αB||²的最小值. 思路:一来一直在想距离的问题,想怎么改变每一维的值才能使这个向量的长度最小,最后无果 ...

  7. (Entity framework 应用篇)把权限判断封装在数据库访问层

    这里,我只是以一个例子,说一下简单权限控制,通过这个例子,大家可以设计庞大的权限管理层,把权限控制封装到数据库访问层,这样程序员就不用再写权限判断的代码了 首先,先看看我数据库DBContext的定义 ...

  8. 小白年薪24万,为什么Linux运维工程师薪资这么高?

    借了云计算的东风,Linux岗位这几年是越来越火,特别是Linux云计算运维工程师,如今早已成为互联网的核心岗位之一,薪资待遇飞快的上涨. 作为一个细分的专业岗位,Linux云计算工程师由于其入门学习 ...

  9. vim使用配置-python

    安装vundle git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim 添加配置文件 vim ~/.v ...

  10. Django CBV视图解决csrf认证

    urls.py from django.conf.urls import url from appxx import views urlpatterns = [ url(r"^$" ...