inDensity,inTargetDensity,inScreenDensity关系详解
思韵闪耀
2019-08-03
0

如果接触Android中的Bitmap较深的话,肯定会知道标题上的这三个属性值,那么这三个属性值的关系和作用是什么呢?下面我们就来详细解读一下。

 

这三个属性值在Bitmap和BitmapFactory中都有不同程度的出现,其中Bitmap中只有mDensity(对应inDensity),BitmapFactory中这三个都有,那么可以知道这三个值主要是在BitmapFactory中活动,于是我就查看了BitmapFactory中的源码,从而知道了这三个值的目的是为了确定这个Bitmap的宽高和density。

 

下面我们从源码角度来分析一下,首先,这个Bitmap通过BitmapFactory创建出来一般经历两个方法,一个是解码的native方法,一个是BitmapFactory中的内部方法setDensityFromOptions。参看以下源码:

try {  
            bm = nativeDecodeByteArray(data, offset, length, opts);  
  
            if (bm == null && opts != null && opts.inBitmap != null) {  
                throw new IllegalArgumentException("Problem decoding into existing bitmap");  
            }  
            setDensityFromOptions(bm, opts);  
        } finally {  
            Trace.traceEnd(Trace.TRACE_TAG_GRAPHICS);  
        }  

 

我们先来分析native方法,以nativeDecodeByteArray方法为例:

引用摘自http://blog.csdn.net/bigconvience/article/details/27054639的nativeDecodeByteArray方法源码片段:

可以看到此方法中调用了doDecode方法,我们再来看doDecode方法:

通过源码可以发现,inDensity,inTargetDensity,inScreenDensity这三个值的主要目的就是确定这个Bitmap的是否会被缩放,如果被缩放,缩放之后的宽高是多少。

 

再来看setDensityFromOptions这个方法的源码:

/** 
     * Set the newly decoded bitmap's density based on the Options. 
     */  
    private static void setDensityFromOptions(Bitmap outputBitmap, Options opts) {  
        if (outputBitmap == null || opts == null) return;  
  
        final int density = opts.inDensity;  
        if (density != 0) {  
            outputBitmap.setDensity(density);  
            final int targetDensity = opts.inTargetDensity;  
            if (targetDensity == 0 || density == targetDensity || density == opts.inScreenDensity) {  
                return;  
            }  
  
            byte[] np = outputBitmap.getNinePatchChunk();  
            final boolean isNinePatch = np != null && NinePatch.isNinePatchChunk(np);  
            if (opts.inScaled || isNinePatch) {  
                outputBitmap.setDensity(targetDensity);  
            }  
        } else if (opts.inBitmap != null) {  
            // bitmap was reused, ensure density is reset  
            outputBitmap.setDensity(Bitmap.getDefaultDensity());  
        }  
    }  

从setDensityFromOptions方法中可以得知,会根据Options中的inDensity,inTargetDensity,inScreenDensity三个值和是否被缩放标识inScaled来确定这个Bitmap的mDensity(对应inDensity)。

从以上的分析可以得知,inDensity,inTargetDensity,inScreenDensity这三个值的目的就是为了确定这个Bitmap的宽高和density。

 

 

【版权声明】
本站部分内容来源于互联网,本站不拥有所有权,不承担相关法律责任。如果发现本站有侵权的内容,欢迎发送邮件至masing@13sy.com 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

NAT

相关内容

docker-compos...
1.Compose介绍 DockerCompose是一个用来定义和...
2024-04-26
firewall-cmd ...
firewalld的简要说明:firewalld 、firewal...
2024-03-15
centos7 firew...
名词解释 在具体介绍zone之前学生先给大家介绍几个相关的名词,因...
2023-12-22
数字证书和加密Exchan...
加密和数字证书是所有组织的重要考虑因素。 默认情况下,Exchan...
2022-09-16
Docker的一系列操作(...
首先要清楚Redis是安装在Docker容器,所以要进行很长的Do...
2022-09-08
MySQL 用户权限详细汇...
MySQL 用户权限详细汇总 1,MySQL权限体系 mysql ...
2022-03-17

热门资讯

Invalid left-ha... 写一个提交函数的时候,发现函数不生效,F12之后看到Invalid left-hand side i...
响应图片(Responsive... 一、开门见山 响应图片技术可以说是响应布局衍生出来的一个小分支。说白了,就是不同显示器宽度下调用不同...
轻松删除MetInfo CMS... 第一步:首页底部版权,模板文件foot直接删除; 第二部:首页头部generator版权,\publ...
ckplayer6.3如何替换... 1.刚打开播放器,视频在缓冲时播放器中间的LOGO怎么替换?(如下图) 2.视频播放器右上角的CK ...
inDensity,inTar... 如果接触Android中的Bitmap较深的话,肯定会知道标题上的这三个属性值,那么这三个属性值的关...
JS 验证 利用Javascript中每个对象(Object)的prototype属性我们可以为Javascri...
在文本框中输入时保证总是在最... 那就要在keypress时保证文本框的光标在尾部,而文本框value赋值后其光标默认在最后,故可采用...
微信UA Mozilla/5.0 (Linux; U; Android 2.3.6; zh-cn; GT-S5...
检测大写锁定键(Caps Lo... h1检测大写锁定键/h1form action="#" method="post" p label ...
iframe高度自适应,全屏,... !注意此方法用于同一个域名下,可能需要部署在服务器上才能看出效果 !DOCTYPE html PUB...